【NLP】基于Word2Vec词向量的中文文本相似度匹配

Word2Vec

    词向量可以用于测量单词之间的相似度,相同语义的单词,其词向量也应该是相似的。对词向量做降维并可视化,可以看到如下图所示的聚类效果,即相近语义的词会聚在一。
【NLP】基于Word2Vec词向量的中文文本相似度匹配_第1张图片
    文本或句子相似度问题,可以把句子中每个单词的词向量简单做一个平均,得到的向量作为整个句子的向量表示,再利用余弦相似度计算句子的相似度。

代码实现

训练词向量模型请参考:使用GloVe训练中文词向量

import numpy as np
from gensim.models import KeyedVectors
from sklearn.metrics.pairwise import cosine_similarity

# 加载词向量模型
model = KeyedVectors.load_word2vec_format(r'E:\vectors.txt',binary=False,encoding="gbk")

# 对句子中的每个词的词向量简单做平均 作为句子的向量表示
def wordavg(model,words): 
    return np.mean([model.get_vector(word) for word in words],axis=0)

s1 = "今天是个好日子"
s2 = "好日子就在今天"
s1_list = jieba.lcut(s1, cut_all=True) # jieba分词
s1_list = jieba.lcut(s2, cut_all=True) # jieba分词
s1_avg = wordavg(model,s1_list) # s1的向量表示
s2_avg = wordavg(model,s2_list) # s2的向量表示
print(cosine_similarity(s1_avg.reshape(1,-1),s2_avg.reshape(1,-1))) # 计算s1、s2向量的余弦相似度

你可能感兴趣的:(自然语言处理,自然语言处理,word2vec)