手把手教你学Word2Vec系列三之Similarity Queries

来源:互联网 发布:湘阴农村淘宝 编辑:程序博客网 时间:2024/05/18 08:04

Python下的Word2Vec的使用需要安装gensim,安装教程: gensim官网安装教程

本人水平有限,还是建议看官方教程: gensim官网使用教程

获得更相似的文档

前面两篇教程中,我们在向量空间创建了语料,并且学习了不同向量空间的转换,接下来我们就来探索不同文档之间的相似度,或一个文档与一个文档集合的相似度。

场景:语料中共有9篇文档,用户输入一个query,我们需要按照相关性由高到低返回文档号和相似度值。(可以模拟谷歌或百度的过程,用户输入查询关键字,然后搜索引擎返回一个文档列表,与用户查询的内容越相关的内容排名越靠前。)

开始之前不要忘了设置日志:

import logginglogging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
from gensim import corpora, models, similarities'''加载语料与字典'''dictionary = corpora.Dictionary.load('/tmp/deerwester.dict')corpus = corpora.MmCorpus('/tmp/deerwester.mm')print(corpus)'''如教程二, 用语料定义一个二维的 LSI 空间:'''lsi = models.LsiModel(corpus, id2word=dictionary, num_topics=2)'''将语料转换到LSI空间并索引'''index = similarities.MatrixSimilarity(lsi[corpus])'''使用 save() 和 load() 函数将索引持久化到硬盘'''index.save('/tmp/deerwester.index')index = similarities.MatrixSimilarity.load('/tmp/deerwester.index')'''假定一个用户在搜索框中输入这样一个query: “Human computer interaction”,先将query映射到LSI空间'''doc = "Human computer interaction"vec_bow = dictionary.doc2bow(doc.lower().split())'''将query转换到LSI空间'''vec_lsi = lsi[vec_bow]print(vec_lsi)'''计算query与语料中各个文档的相似度'''sims = index[vec_lsi]'''打印出相似度, 格式为(document_number, document_similarity)的二元组'''print(list(enumerate(sims)))'''将相似度降序排序'''sims = sorted(enumerate(sims), key=lambda item: -item[1])'''打印排序后的相似度二元组'''print(sims) 输出:[(2, 0.99844527), (0, 0.99809301), (3, 0.9865886), (1, 0.93748635), (4, 0.90755945), (8, 0.050041769), (7, -0.098794632), (6, -0.10639259), (5, -0.12416792)]

可以看出,与query最相似的是文档2,内容为“The EPS user interface management system”。细心一点的娃娃可以发现,文档2中明明没有出现query中的任何一个词,为什么却返回了最大的相似度呢?因为这两个文档其实是在说一个topic,这是映射到LSI向量空间的功劳啊。

计算距离

比较常用的是余弦相似度:Cosine similarity

当然,还有其它的相似度:different similarity measures

1 0