算法融合:
- 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