手把手教你学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
- 手把手教你学Word2Vec系列三之Similarity Queries
- 手把手教你学Word2Vec系列一之Corpora and Vector Spaces
- 手把手教你学Word2Vec系列二之Topics and Transformations
- 手把手系列之三——手把手教你做手擀打卤面
- 手把手系列之四十三—手把手教你做煎饼果子
- “手把手教你学linux驱动开发”OK6410系列之01---模块编程
- “手把手教你学linux驱动开发”OK6410系列之02---虚拟字符设备
- “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- "手把手教你学linux驱动开发”OK6410系列之01---模块编程
- “手把手教你学linux驱动开发”OK6410系列之01---模块编程 .
- “手把手教你学linux驱动开发”OK6410系列之02---LED字符设备驱动 .
- “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动 .
- “手把手教你学linux驱动开发”OK6410系列之01---模块编程
- “手把手教你学linux驱动开发”OK6410系列之02---虚拟字符设备
- “手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- 手把手教你学linux驱动开发”OK6410系列之03---LED字符设备驱动
- “手把手教你学linux驱动开发”OK6410系列之02---虚拟字符设备
- 操作iptables时应特别注意规则的顺序
- C++教程的实践小结.md
- 软件开发的“三重门”----继程序员技术练级攻略之后的进一步进阶之路
- 图片处理的几种算法(毛玻璃效果,高斯模糊效果,旧时光效果,lomo效果,暖意效果)
- Git学习
- 手把手教你学Word2Vec系列三之Similarity Queries
- 让用户输入一个5位数(若不是5位数,则提示错误),判断它是不是回文数,输出判断结果。回文数:如12321是一个回文数,万位与个位相同,十位与千位相同。
- 京峰运维学习系列--2
- 图(深度优先搜索)491. Increasing Subsequences[Middle]03-18
- 非凡匠心
- Linux下的帮助命令
- 浅析Spring
- SCU
- 中美科技的霸主之争