继 前两篇的学习,我们了解了创建在向量空间创建一个语料库意味着什么,如何在不同的向量空间之间转换。我们所做的一切都是为了一个共同目标:决定文档对之间的相似度或者一篇特定文档和其他文档之间的相似度(例如用户输入与已索引文档)。
导入lib:
from gensim import corpora,models,similarities
加载字典与语料库:
dictionary=corpora.Dictionary.load('你的地址/dict_data/deerwester.dict')
corpus=corpora.MmCorpus('你的地址/dict_data/deerwester.mm')
print(corpus)
print(dictionary)
MmCorpus(9 documents, 12 features, 28 non-zero entries) Dictionary(12 unique tokens: ['human', 'interface', 'computer', 'survey', 'user']...)
创建 lsi 2维 空间:
lsi=models.LsiModel(corpus,id2word=dictionary,num_topics=2)
转化 并用 lsi表示这一句话:
doc = "Human computer interaction"
vec_bow = dictionary.doc2bow(doc.lower().split())
vec_lsi = lsi[vec_bow] # 把句子 转为 lsi空间里表示
print (vec_lsi)
[(0, 0.46182100453271557), (1, 0.070027665278999146)]
准备相似度查询(需要比较的文档)
index = similarities.MatrixSimilarity(lsi[corpus]) # 将语料转换为LSI,并索引
保存和加载:
index.save('你的地址/dict_data/deerwester.index')
index = similarities.MatrixSimilarity.load('你的地址/dict_data/deerwester.index')
测试数据与各个相识度:
sims=index[vec_lsi]
print(sims)
[ 0.99809301 0.93748635 0.99844527 0.9865886 0.90755945 -0.12416792 -0.10639259 -0.09879464 0.05004176]
整理一下 按大小排序 并显示序号:
sims = sorted(enumerate(sims), key=lambda item: -item[1])
print (sims) # 打印排序的 (document number, similarity score) 2-tuples
[(2, 0.99844527), (0, 0.99809301), (3, 0.9865886), (1, 0.93748635), (4, 0.90755945), (8, 0.050041765), (7, -0.098794639), (6, -0.10639259), (5, -0.12416792)]
ps:需要注意,使用标准的布尔全文搜索将不会返回编号分别为2和4的文档(The EPS user interface management system”,”Relation of user perceived response time to error measurement”),因为他们与“Human computer interaction”没有任何相同的单词。可是,在使用了LSI后,我们可以看到他们都得到了比较高的分数(2号文档是最相似的),直观感觉上他们都更加符合我们查询的“computer-human”(“人机”)相关主题。事实上,将语义概括化是我们首先使用转换和主题模型的原因。