我正在使用2个docs(句子)的小型语料库运行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"'
答案 0 :(得分:3)
R包主题模型的作者BettinaGrün指出,这是由于选择了超参数'alpha'。
R中的LDA选择alpha = 50/k= 25
,而gensim Python中的LDA选择alpha = 1/k = 0.5
。较小的alpha值有利于文档主题分布的稀疏解决方案,即文档仅包含几个主题的混合。因此,降低R中LDA的α值会产生非常合理的结果:
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
答案 1 :(得分:0)
尝试在迭代上绘制困惑并确保它们收敛。初始状态也很重要。 (不过,文件大小和样本量似乎都很小。)