2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 计算文本相似度-Word2Vec计算

计算文本相似度-Word2Vec计算

时间:2021-07-08 21:41:11

相关推荐

计算文本相似度-Word2Vec计算

来源于https://juejin.im/post/5b237b45f265da59a90c11d6

Word2Vec,顾名思义,其实就是将每一个词转换为向量的过程。

如果不了解的话可以参考:/itplus/article/details/37969519

这里我们可以直接下载训练好的 Word2Vec 模型,

模型的链接地址为:/s/1TZ8GII0CEX32ydjsfMc0zw

是使用新闻、百度百科、小说数据来训练的 64 维的 Word2Vec 模型,数据量很大,整体效果还不错,我们可以直接下载下来使用,这里我们使用的是 news_12g_baidubaike_20g_novel_90g_embedding_64.bin 数据,然后实现 Sentence2Vec,代码如下:

import gensimimport jiebaimport numpy as npfrom scipy.linalg import normmodel_file = './word2vec/news_12g_baidubaike_20g_novel_90g_embedding_64.bin'model = gensim.models.KeyedVectors.load_word2vec_format(model_file, binary=True)def vector_similarity(s1, s2):def sentence_vector(s):words = jieba.lcut(s)v = np.zeros(64)for word in words:v += model[word]v /= len(words)return vv1, v2 = sentence_vector(s1), sentence_vector(s2)return np.dot(v1, v2) / (norm(v1) * norm(v2))

在获取 Sentence Vector 的时候,我们首先对句子进行分词,然后对分好的每一个词获取其对应的 Vector,然后将所有 Vector 相加并求平均,这样就可得到 Sentence Vector 了,然后再计算其夹角余弦值即可。

调用示例如下:

s1 = '你在干嘛's2 = '你正做什么'vector_similarity(s1, s2)

结果如下:

0.6701133967824016

这时如果我们再回到最初的例子看下效果:

strings = ['你在干什么','你在干啥子','你在做什么','你好啊','我喜欢吃香蕉']target = '你在干啥'for string in strings:print(string, vector_similarity(string, target))

依然是前面的例子,我们看下它们的匹配度结果是多少,运行结果如下:

你在干什么 0.8785495016487204你在干啥子 0.9789649689827049你在做什么 0.8781992402695274你好啊 0.5174225914249863我喜欢吃香蕉 0.582990841450621

可以看到相近的语句相似度都能到 0.8 以上,而不同的句子相似度都不足 0.6,这个区分度就非常大了,可以说有了 Word2Vec 我们可以结合一些语义信息来进行一些判断,效果明显也好很多。所以总体来说,Word2Vec 计算的方式是非常好的。另外学术界还有一些可能更好的研究成果,这个可以参考知乎上的一些回答:

/question/29978268/answer/54399062

。以上便是进行句子相似度计算的基本方法和 Python 实现,

本节代码地址:

/AIDeepLearning/SentenceDistance

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。