相似度查询

本文翻译自
相似度接口
在前面的两篇教程中,讲述了用向量空间模型构造语料库的含义,以及如何在两个不同的向量空间进行转换;这样做的一般目的是我们想要确定两篇文档的相似性,或一篇文章和文档集中的其他文章的相似性;
下面展示这如何在Gensim中被做到的,让我们考虑与前面例子相同的语料库; (which really originally comes from Deerwester et al.’s “http://www.cs.bham.ac.uk/~pxt/IDA/lsa_ind.pdf“>Indexing by Latent Semantic Analysis” seminal 1990 article):

>>> from gensim import corpora, models, similarities
>>> dictionary = corpora.Dictionary.load('/tmp/deerwester.dict')
>>> corpus = corpora.MmCorpus('/tmp/deerwester.mm') # comes from the first tutorial, "From strings to vectors"
>>> print(corpus)
MmCorpus(9 documents, 12 features, 28 non-zero entries)

使用这个小的语料库来定义一个二维LSI空间:

>>> lsi = models.LsiModel(corpus, id2word=dictionary, num_topics=2)

现在假设一个用户键入查询“Human computer interaction”。我们根据查询和语料库中9篇文章的相关性,进行递减排序。不像现在的搜索引擎,这里集中在可能的相似性的一个方面,即文本间的明显的语义相关;

>>> doc = "Human computer interaction"
>>> vec_bow = dictionary.doc2bow(doc.lower().split())
>>> vec_lsi = lsi[vec_bow] # convert the query to LSI space
>>> print(vec_lsi)
[(0, -0.461821), (1, 0.070028)]

此外,我们将要考虑 cosine similarity 来确定两个向量间的相似度, cosine similarity 是向量空间模型中的一个标准度量;但是不同的向量表示向量分布,不同的相似度度量可能会更加适合;
初始化查询结构
为了预备相似度查询,我们需要进入所有的文档,它们将要与后来的查询相比较。在我们的示例中,它们同样是训练LSI用到的9篇文章,转换为二维LSI空间;但这些是不必要的,我们仍然能够检索不同的语料;

>>> index = similarities.MatrixSimilarity(lsi[corpus]) # transform corpus to LSI space and index it

警告:
类similarities.MatrixSimilarity 仅仅适合把整个向量集合都装入内存中。例如,拥有一百万文档的语料库需要2G内存,在256维的LSI空间;
没有2GM的自由内存,你可能需要使用similarities.Similarity class,这个类运行在固定的内存中,通过拆分在多个磁盘文件中的检索;在内部使用similarities.MatrixSimilarity and similarities.SparseMatrixSimilarity,所以它是快速的,但是更复杂;

指数能通过save() and load() functions进行加载和保存:

>>> index.save('/tmp/deerwester.index')
>>> index = similarities.MatrixSimilarity.load('/tmp/deerwester.index')

这对所有的相似度检索类都正确(similarities.Similarity, similarities.MatrixSimilarity and similarities.SparseMatrixSimilarity)

执行查询
为了获得我们的查询文档和另外九个被索引文档间的相似度:

>>> sims = index[vec_lsi] # perform a similarity query against the corpus
>>> print(list(enumerate(sims))) # print (document_number, document_similarity) 2-tuples
[(0, 0.99809301), (1, 0.93748635), (2, 0.99844527), (3, 0.9865886), (4, 0.90755945),
(5, -0.12416792), (6, -0.1063926), (7, -0.098794639), (8, 0.05004178)]

余弦度量返回相似度的范围在<-1,1>(越大越相似)
使用一些标准的Python变换,我们把这些相似度按照降序排列;得到了查询的最终结果:

>>> sims = sorted(enumerate(sims), key=lambda item: -item[1])
>>> print(sims) # print sorted (document number, similarity score) 2-tuples
[(2, 0.99844527), # The EPS user interface management system
(0, 0.99809301), # Human machine interface for lab abc computer applications
(3, 0.9865886), # System and human system engineering testing of EPS
(1, 0.93748635), # A survey of user opinion of computer system response time
(4, 0.90755945), # Relation of user perceived response time to error measurement
(8, 0.050041795), # Graph minors A survey
(7, -0.098794639), # Graph minors IV Widths of trees and well quasi ordering
(6, -0.1063926), # The intersection graph of paths in trees
(5, -0.12416792)] # The generation of random binary unordered trees

值得注意的是:文档2(“The EPS user interface management system”)和文档4 (“Relation of user perceived response time to error measurement”) 通过标准的布尔全文搜索将不被返回。因为它们与查询语句”Human computer interaction”没有共享单词。然而,在应用LSI之后,我们能够观察到它们获得了相当高的相似度;这更符合我们的直觉,它们与查询语句共享了“computer-human” 相关主题;实际上,这种语义泛化正是我们实行转换的原因,也是首先做主题模型的原因;

接下来:
这个教程结束了,为了探索更深的细节,可以浏览API documentation
Wikipedia experiments

Gensim是一个相当成熟的包,它已经被很多个人和公司成功的使用;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值