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% 相似。这对我来说没有意义。
有人可以建议如何改进我的代码以便我得到合理的数字吗?
最佳答案
这些主题建模技术需要各种真实的数据才能获得合理的结果。仅包含一个或几个文本示例的玩具大小的示例效果不佳 - 即使它们有效,通常也只是运气好或人为的适合性。
特别是:
只有一个示例的模型无法明智地创建多个主题,因为模型之间没有文档之间的对比
模型呈现之前从未见过的单词会忽略这些单词,因此您的测试文档在它看来与单个单词“汽车”相同 - 这是它之前见过的唯一单词
<
在这种情况下,您的单个训练文档和测试文档都被 LSI 建模为具有来自第 0 个主题的 0
贡献,以及来自第 1 个主题的正贡献(不同大小) 。由于余弦相似度仅比较角度,而不是大小,因此两个文档都从原点沿着同一条线,因此没有角度差异,因此相似度为 1.0。
但是,如果您拥有更好的训练数据,并且不仅仅是单个已知单词的测试文档,您可能会开始获得更合理的结果。即使是几十个培训文档和一个包含几个已知单词的测试文档也可能有所帮助……但数百、数千或数万个培训文档会更好。
关于python - gensim 和余弦相似度的文本相似度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46146241/