【问题标题】:Text similarity with gensim and cosine similarity文本相似度与 gensim 和余弦相似度
【发布时间】:2018-02-19 03:17:17
【问题描述】:
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% 相似。这对我来说没有意义。

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

【问题讨论】:

    标签: python gensim cosine-similarity


    【解决方案1】:

    这些主题建模技术需要各种真实的数据才能获得合理的结果。仅包含一个或几个文本示例的玩具大小的示例效果不佳——即使效果很好,通常也只是运气好或人为的适用性。

    特别是:

    • 只有一个示例的模型无法明智地创建多个主题,因为没有要建模的文档之间的对比

    • 一个模型显示它以前从未见过的单词会忽略这些单词,因此您的测试文档在它看来与单个单词“cars”相同——它以前见过的唯一单词

      李>

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

    但是,如果您拥有更好的训练数据,并且不仅仅是一个已知单词的测试文档,您可能会开始获得更合理的结果。即使是几十个培训文档,以及一个包含几个已知单词的测试文档,也可能会有所帮助……但成百上千或数万个培训文档会更好。

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 2021-08-04
      • 2014-02-25
      • 2017-12-12
      • 2011-01-01
      • 2020-08-19
      • 2018-06-30
      • 2013-05-24
      相关资源
      最近更新 更多