3分鐘熱情學(xué)NLP第7篇吵冒,Wrod2vec計算句子相似度實戰(zhàn)
方法1愕鼓,計算句子中各個詞向量,得出句子的平均值
1够傍、使用jieba分詞畜挥,得出該句子包含的詞仔粥;
2、計算每個詞的詞向量蟹但;
3躯泰、求得該句子的平均值
4、采用余弦值华糖,計算各個句子的相似度麦向;
輸入:
import numpy as np
from scipy import spatial
import jieba
model = gensim.models.Word2Vec.load('word2vec_wx')
model_dimension = 256 #該模型的維度為256維
#采用jieba進行分詞,分詞后計算每個詞的詞向量客叉,最后求平均值诵竭;
def avg_string_vector(sentence, model):
words = jieba.cut(sentence)#默認jieba精確分詞模式
string_vec = np.zeros((model_dimension,), dtype='float32')#返回1個"1*256",元素為0的數(shù)組兼搏;
num_words = 0 #該句話中詞語的個數(shù)卵慰,初始值為0
for word in words:
if word in model.wv:
num_words += 1#計算出該句話中,詞語的個數(shù)
string_vec = np.add(string_vec, model.wv[word])#計算每個分詞的詞向量佛呻,并進行相加裳朋;
if(num_words > 0):
string_vec = np.divide(string_vec, num_words)#求平均值:將詞向量相加后的和,除以分詞的個數(shù)吓著;
return string_vec
s1 = '在微信公眾號上寫文章'
s2= '把文章發(fā)表在微信公眾號上'
s3 = '在微信上發(fā)表文章'
s4 = '歡迎大家來到微信總部參觀'
s1_vec = avg_string_vector(s1, model=model)
s2_vec = avg_string_vector(s2, model=model)
s3_vec = avg_string_vector(s3, model=model)
s4_vec = avg_string_vector(s4, model=model)
#計算余弦距離
sim12 = 1 - spatial.distance.cosine(s1_vec, s2_vec)
sim13 = 1 - spatial.distance.cosine(s1_vec, s3_vec)
sim14 = 1 - spatial.distance.cosine(s1_vec, s4_vec)
print('”'+ s1 +'“和”' + s2 +'“的相似度為:%.4f'%sim12)
print('”'+ s1 +'“和”' + s3 +'“的相似度為:%.4f'%sim13)
print('”'+ s1 +'“和”' + s4 +'“的相似度為:%.4f'%sim14)
輸出
”在微信公眾號上寫文章“和”把文章發(fā)表在微信公眾號上“的相似度為:0.9013
”在微信公眾號上寫文章“和”在微信上發(fā)表文章“的相似度為:0.8178
”在微信公眾號上寫文章“和”歡迎大家來到微信總部參觀“的相似度為:0.6783
方法2鲤嫡,使用第6篇提到的WMD算法
第6篇:http://www.reibang.com/p/39e0c9d35f6c
代碼如下:
import gensim
import pyemd
model = gensim.models.Word2Vec.load('word2vec_wx')
s1 = '在微信公眾號上寫文章'
s2= '把文章發(fā)表在微信公眾號上'
s3 = '在微信上發(fā)表文章'
s4 = '歡迎大家來到微信總部參觀'
#使用WMD距離算法
distance12 = model.wv.wmdistance(s1, s2)
distance13 = model.wv.wmdistance(s1, s3)
distance14 = model.wv.wmdistance(s1, s4)
print('”'+ s1 +'“和”' + s2 +'“的相似度為:%.4f'%distance12)
print('”'+ s1 +'“和”' + s3 +'“的相似度為:%.4f'%distance13)
print('”'+ s1 +'“和”' + s4 +'“的相似度為:%.4f'%distance14)
輸出:
”在微信公眾號上寫文章“和”把文章發(fā)表在微信公眾號上“的相似度為:0.7265
”在微信公眾號上寫文章“和”在微信上發(fā)表文章“的相似度為:1.1910
”在微信公眾號上寫文章“和”歡迎大家來到微信總部參觀“的相似度為:2.2488