【python 走進NLP】文本語義相似度合併算法

這裏寫圖片描述

算法融合:

  • 1、基於word2vec的詞語相似度計算模型
  • 2、標籤別名語義相似度匹配算法

本算法是兩種算法融合產生的效果,效果還不錯:

# -*- encoding=utf-8 -*-

# 載包
from gensim.models import Word2Vec
import warnings
warnings.filterwarnings("ignore")
warnings.filterwarnings(action='ignore',category=UserWarning,module='gensim')
from itertools import combinations
import pandas as pd
import time
time1=time.time()


# 加載word2vec訓練好的模型

model = Word2Vec.load("F:/下載/content/word_embedding_20180907")

# 加載別名數據集

data0 = pd.read_excel('C:/Users/xiaohu/Desktop/文本挖掘/標籤語義相近發現合併算法/data/kktribe_tag_1.xlsx')




# 自定義獲取近義詞函數
def get_most_similar_list(string1):
    # 使用模型
    try:
        items = model.most_similar(string1)
        key=[]
        value=[]
        for i, j in items:
            # print(i, j)
            key.append(i)
            value.append(j)
        result=pd.DataFrame({"key":key,"value":value})
        print(result)

    except:
        print('找不到該單詞的近義詞!')
        pass

    return result



#定義一個標籤有別名的合併函數

def combine_tag_name_alis(data1,data2):
    """
    :param data1: 別名集
    :param data2:標籤集
    :return: 合併後的結果集
    """
    # 篩選數據,找到有別名的標籤
    data3 = data1[data1['alias'].isin(data2['key'])]
    data4=data2[~data2['key'].isin(data3['alias'])]

    #語義相似標籤去重
    name1= list(set(data3['name']))
    name2=list(set(data4['key']))
    name3=name1+name2
    name4=list(set(name3))
    return name4



# 自定義標籤去重函數

def get_similarity(data2):

    data3 = set(data2['key'])
    tag_drop_list = []
    # 計算兩個詞語相似度
    for i, j in combinations(data3, 2):
        try:
            similary = model.similarity(i, j)
            # print(i, j, similary)
            # 如果兩個詞語相似度>0.6,則合併爲一個詞語
            if similary >0.75:

                print(i,j,similary)
                if len(i) < len(j):
                    tag_drop_list.append(i)
                if len(i) > len(j):
                    tag_drop_list.append(j)

                if len(i) == len(j):
                    tag_drop_list.append(i)


            else:
                m1 = set([i, j])
                new_data = pd.DataFrame({'key': [i, j]})
                #  合併之後的標籤集
                name = combine_tag_name_alis(data0, new_data)

                # print(name)
                if len(name) == 1:
                    m2 = name
                    m2 = set(m2)
                    m3 = (m1 - m2)
                    m3_1 = m3.pop()
                    tag_drop_list.append(m3_1)


        except:


            m1=set([i,j])
            new_data = pd.DataFrame({'key': [i,j]})
            #  合併之後的標籤集
            name = combine_tag_name_alis(data0, new_data)

            # print(name)
            if len(name)==1:
                m2=name
                m2=set(m2)
                m3=(m1-m2)
                m3_1=m3.pop()
                tag_drop_list.append(m3_1)

    # print(tag_drop_list)
    # 集合刪除找出的相似詞
    data4 =set(tag_drop_list)

    data5 = data3 - data4

    print("最終結果集:")

    # print(data5)

    return data5




if __name__ == '__main__':

    #  讀取標籤數據集
    data2 = pd.DataFrame({'key': ['詹皇', '小皇帝','辣雞','垃圾','高倍','高賠','詹姆斯','競彩足球','C羅','總裁']})

    result=get_similarity(data2)

    print(result)

詹皇 詹姆斯 0.8157515026814683
垃圾 辣雞 0.9018741525236081
高賠 高倍 0.7765882760905136
最終結果集:
{'辣雞', '詹姆斯', 'C羅', '高倍', '競彩足球'}

Process finished with exit code 0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章