3分钟热情学NLP第7篇,Wrod2vec计算句子相似度实战
方法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的数组;
num_words = 0 #该句话中词语的个数,初始值为0
for word in words:
if word in model.wv:
num_words += 1#计算出该句话中,词语的个数
string_vec = np.add(string_vec, model.wv[word])#计算每个分词的词向量,并进行相加;
if(num_words > 0):
string_vec = np.divide(string_vec, num_words)#求平均值:将词向量相加后的和,除以分词的个数;
return string_vec
s1 = '在微信公众号上写文章'
s2= '把文章发表在微信公众号上'
s3 = '在微信上发表文章'
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)
输出
”在微信公众号上写文章“和”把文章发表在微信公众号上“的相似度为:0.9013
”在微信公众号上写文章“和”在微信上发表文章“的相似度为:0.8178
”在微信公众号上写文章“和”欢迎大家来到微信总部参观“的相似度为:0.6783
方法2,使用第6篇提到的WMD算法
第6篇:https://www.jianshu.com/p/39e0c9d35f6c
代码如下:
import gensim
import pyemd
model = gensim.models.Word2Vec.load('word2vec_wx')
s1 = '在微信公众号上写文章'
s2= '把文章发表在微信公众号上'
s3 = '在微信上发表文章'
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)
输出:
”在微信公众号上写文章“和”把文章发表在微信公众号上“的相似度为:0.7265
”在微信公众号上写文章“和”在微信上发表文章“的相似度为:1.1910
”在微信公众号上写文章“和”欢迎大家来到微信总部参观“的相似度为:2.2488