【NLP學習筆記】(三)gensim使用之相似性查詢(SimilarityQueries)

alexbyy發表於2018-12-12

相似性查詢(Similarity Queries)

本文主要翻譯自https://radimrehurek.com/gensim/tut3.html
在之前的教程語料和向量空間主題和轉換中,我們學會了如何在向量空間模型中表示語料和如何在不同的向量空間之間轉換。實際工作中,這樣做的一個最常見的目的是比較兩個文件之間的相似性或比較某一個文件與其它文件的相似性(比如使用者查詢已經索引的文件中的某一個文件)

載入字典和語料

與上一章相同,首先載入第一章中儲存的字典和語料。

from gensim import corpora, models, similarities
import os
if(os.path.exists(`./gensim_out/deerwester.dict`)):
    dictionary = corpora.Dictionary.load(`./gensim_out/deerwester.dict`)
    corpus = corpora.MmCorpus(`./gensim_out/deerwester.mm`)
    print("使用之前已經儲存的字典和語料向量")
else:
    print("請先通過第一章生成deerwester.dict和deerwester.mm")

第一步

定義模型LSI,並將語料corpus轉換為索引

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

index = similarities.MatrixSimilarity(lsi[corpus])
index.save(`./gensim_out/deerwester.index`) #儲存訓練後的index
index = similarities.MatrixSimilarity.load(`./gensim_out/deerwester.index`)#從已儲存的檔案中載入index。


第二步

假設我們要查詢新文字 `human computer interaction`。我們期望得出與新文字最相思的三個文字。

doc = `human computer interaction`
vec_bow = dictionary.doc2bow(doc.lower().split())
vec_lsi = lsi[vec_bow]
print(vec_lsi)

第三步

比較新文字vec_lsi與語料庫的相似性

sims = index[vec_lsi]
print(list(enumerate(sims))) #列印結果(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)]

(0, 0.99809301)的意思是第0篇文章與新文件的相似性為 0.99809301

將上面結果按相似性降序排列

sims = sorted(enumerate(sims), key = lambda item : -item[1])
print(sims)

結果:

[(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

可以看出與文件“human computer interface”最相似的三篇文章分別是第2篇、第0篇、第三篇。


相關文章