文本与gensim和余弦相似性的相似性

时间:2017-09-10 22:45:20

标签: python gensim cosine-similarity

from gensim import corpora, models, similarities

documents = ["This is a book about cars, dinosaurs, and fences"]

# remove common words and tokenize
stoplist = set('for a of the and to in - , is'.split())
texts = [[word for word in document.lower().split() if word not in stoplist]
         for document in documents]

# Remove commas
texts[0] = [text.replace(',','') for text in texts[0]]

dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

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

doc = "I like cars and birds"
vec_bow = dictionary.doc2bow(doc.lower().split())

vec_lsi = lsi[vec_bow] 
index = similarities.MatrixSimilarity(lsi[corpus]) 

sims = index[vec_lsi] # perform a similarity query against the corpus
print(sims)

在上面的代码中,我比较了“这是一本关于汽车,恐龙和围栏的书”与使用余弦相似技术的“我喜欢汽车和鸟类”相似。

这两个句子实际上有1个词是共同的,这就是“汽车”,但是当我运行代码时,我得到它们100%相似。这对我没有意义。

有人可以建议如何改进我的代码,以便得到合理的数字吗?

1 个答案:

答案 0 :(得分:1)

这些主题建模技术需要各种实际数据才能获得合理的结果。只有一个或几个文本示例的玩具大小的示例不能很好地工作 - 即使它们这样做,它通常只是好运或人为的适用性。

特别是:

  • 只有一个例子的模型不能合理地创建多个主题,因为文档与模型之间没有对比

  • 一个模型显示之前没有看过的单词忽略了这些单词,所以你的测试文档看起来与单词'cars'相同 - 这是之前唯一的单词

在这种情况下,您的单个培训文档和测试文档都会被LSI建模为来自第0个主题的0贡献,以及来自第1个主题的正贡献(不同大小)。由于余弦相似性仅仅比较角度而不是幅度,因此两个文档都是从原点沿着同一行,因此没有差异角,因此相似度为1.0。

但是,如果你有更好的训练数据,而不仅仅是一个单一的已知单词测试文档,你可能会开始获得更明智的结果。即使是几十个培训文档,以及一个包含多个已知单词的测试文档,也可能有所帮助......但数百或数千或数万个培训文档会更好。

相关问题