【问题标题】:Calculating cosine similarity from a Gensim model从 Gensim 模型计算余弦相似度
【发布时间】:2020-08-19 02:35:23
【问题描述】:

我正在尝试从 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" +...' 部分,它表示术语概率。

我想知道是否有更简单的方法从模型中获取余弦相似度?或者解析每个单独的术语/概率字符串真的是唯一的方法吗?

感谢您的帮助。

【问题讨论】:

    标签: python gensim topic-modeling cosine-similarity


    【解决方案1】:

    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
    

    (我还没有在实时模型上检查此代码;可能会关闭所需的确切形状/等。)

    【讨论】:

      猜你喜欢
      • 2021-08-09
      • 2015-05-24
      • 2021-07-10
      • 2017-02-03
      • 2018-02-19
      • 2017-01-18
      • 2017-07-07
      • 2018-04-11
      相关资源
      最近更新 更多