根据Gensim模型计算余弦相似度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据Gensim模型计算余弦相似度相关的知识,希望对你有一定的参考价值。

[我正在尝试从Gensim LDA主题模型计算主题间的余弦相似度得分,但这比我最初预期的要复杂。

Gensim具有一种计算主题model.diff(model)之间的距离的方法,但是不幸的是,没有实现余弦距离;它具有jaccard距离,但是它与向量长度也有一定的依赖关系(即,当比较每个主题的前100个最重要的单词时,该距离小于对前500个词的比较,并且当比较全长向量时,该距离为0,例如每个主题都包含所有术语,但概率不同。

我的问题是模型的输出看起来像这样(仅显示了4个最重要的词):

(30, '0.008*"tax" + 0.004*"cut" + 0.004*"bill" + 0.004*"spending"')
(18, '0.009*"candidate" + 0.009*"voter" + 0.009*"vote" + 0.009*"election"')
(42, '0.047*"shuttle" + 0.034*"astronaut" + 0.026*"launch" + 0.025*"orbit"')
(22, '0.023*"boat" + 0.020*"ship" + 0.015*"migrant" + 0.013*"vessel"')

因此,为了计算余弦sim /距离,我必须解析元组的第二个元素(即'0.008*"tax" +...'部分,它表示项概率。

我想知道是否有更简单的方法可以从模型中获得余弦相似度?还是解析术语/概率的每个单独的字符串确实是唯一的方法?

感谢您的帮助。

答案

get_topics()方法为您提供完整的(稀疏)数组,其中每一行都是一个主题,而每一列都是一个词汇单词。因此,您可以计算出大致的主题间余弦相似度:

from sklearn.metrics.pairwise import cosine_similarity

topics = lda_model.get_topics()
sim_18_to_30 = cosine_similarity(topics[18], topics[30])   # topic 18 to topic 30
all_sims = cosine_similarity(topics)  # all pairwise similarities

((我尚未在实时模型上检查此代码;所需的精确形状/等可能已关闭。)

以上是关于根据Gensim模型计算余弦相似度的主要内容,如果未能解决你的问题,请参考以下文章

如何从TfidfVectorizer计算余弦相似度?

如何使用 gensim 的 word2vec 模型与 python 计算句子相似度

Word2Vec 计算词语之间的余弦相似度

Python Gensim:如何使用 LDA 模型计算文档相似度?

处理模型中未找到的gensim中的新单词

Java根据余弦定理计算文本相似度