【问题标题】:R topicmodels LDAR主题模型LDA
【发布时间】:2017-09-12 15:45:51
【问题描述】:

出于测试目的,我在一个包含 2 个文档(句子)的小型语料库上运行 LDA。以下代码返回给定输入文档根本不合理的主题词和文档主题分布。在 Python 中运行完全相同的结果是合理的。 谁知道这里出了什么问题?

library(topicmodels)
library(tm)

d1 <- "bank bank bank"
d2 <- "stock stock stock"

corpus <- Corpus(VectorSource(c(d1,d2)))

##fit lda to data
dtm <- DocumentTermMatrix(corpus)
ldafit <- LDA(dtm, k=2, method="Gibbs") 

##get posteriors
topicTerm <- t(posterior(ldafit)$terms)
docTopic <- posterior(ldafit)$topics
topicTerm
docTopic

> topicTerm
              1         2
bank  0.3114525 0.6885475
stock 0.6885475 0.3114525
> docTopic
          1         2
1 0.4963245 0.5036755
2 0.5036755 0.4963245

Python的结果如下:

>>> docTopic
array([[ 0.87100799,  0.12899201],
       [ 0.12916713,  0.87083287]])
>>> fit.print_topic(1)
u'0.821*"bank" + 0.179*"stock"'
>>> fit.print_topic(0)
u'0.824*"stock" + 0.176*"bank"'

【问题讨论】:

  • 有趣的问题。我在真实环境中使用过这个包,效果很好。我很确定这些臭名昭著的结果与您使用的小型语料库有关。您能否发布 Python 的结果以进行比较?
  • 好的,请看更新后的帖子。
  • gensimtopicmodels 使用不同的方法。 gensim 使用变分推理,而 topicmodels 在这里使用折叠吉布斯采样。 topicmodels 也有一个变分推理选项,但它给出了同样糟糕的结果。我也处于死胡同,抱歉
  • 但是当使用 'VEM' 作为估计方法时,在 R 中使用 topicmodels 的结果几乎没有变化......

标签: r lda topicmodels


【解决方案1】:

R 包 topicmodels 的作者 Bettina Grün 指出,这是由于选择了超参数 'alpha'。

R 中的 LDA 选择 alpha = 50/k= 25,而 gensim Python 中的 LDA 选择 alpha = 1/k = 0.5。较小的 alpha 值有利于文档主题分布的稀疏解决方案,即文档包含仅几个主题的混合。因此,降低 R 中 LDA 中的 alpha 会产生非常合理的结果:

ldafit <- LDA(dtm, k=2, method="Gibbs", control=list(alpha=0.5)) 

posterior(ldafit)$topics
#    1     2
# 1  0.125 0.875
# 2  0.875 0.125

posterior(ldafit)$terms
#   bank    stock
# 1 0.03125 0.96875
# 2 0.96875 0.03125

【讨论】:

【解决方案2】:

尝试绘制迭代中的困惑并确保它们收敛。初始状态也很重要。 (不过,文档大小和样本大小似乎都很小。)

【讨论】:

    猜你喜欢
    • 2014-07-16
    • 1970-01-01
    • 2012-03-25
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2015-11-15
    相关资源
    最近更新 更多