Wrod2vec计算句子相似度实战_3分钟热情学NLP第7篇

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

你可能感兴趣的:(Wrod2vec计算句子相似度实战_3分钟热情学NLP第7篇)