Answers:
据我所知,您只需要提供一些主题和语料库即可。尽管可以使用一个候选主题集,但无需指定候选主题集,正如您在Grun and Hornik(2011)第15页底部的示例中所看到的那样。
更新时间:2014年1月28日,我的处理方式与以下方法有所不同。请参阅此处了解我目前的方法:https : //stackoverflow.com/a/21394092/1036500
在没有训练数据的情况下找到最佳主题数的相对简单的方法是,在给定数据的情况下,通过遍历具有不同主题数的模型来查找具有最大对数可能性的主题数。考虑这个例子R
# download and install one of the two R packages for LDA, see a discussion
# of them here: http://stats.stackexchange.com/questions/24441
#
install.packages("topicmodels")
library(topicmodels)
#
# get some of the example data that's bundled with the package
#
data("AssociatedPress", package = "topicmodels")
在继续生成主题模型并分析输出之前,我们需要确定模型应使用的主题数。这是一个功能,用于遍历不同的主题编号,获取每个主题编号的模型的对数似然并将其绘制出来,以便我们选择最佳主题编号。主题数最好的是将对数似然值最高的主题,以将示例数据内置到包中。在这里,我选择评估从2个主题开始到100个主题的每个模型(这将需要一些时间!)。
best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})
现在,我们可以提取所生成的每个模型的对数似然值,并准备对其进行绘制:
best.model.logLik <- as.data.frame(as.matrix(lapply(best.model, logLik)))
best.model.logLik.df <- data.frame(topics=c(2:100), LL=as.numeric(as.matrix(best.model.logLik)))
现在绘制图表以查看出现几率最高的对数可能性:
library(ggplot2)
ggplot(best.model.logLik.df, aes(x=topics, y=LL)) +
xlab("Number of topics") + ylab("Log likelihood of the model") +
geom_line() +
theme_bw() +
opts(axis.title.x = theme_text(vjust = -0.25, size = 14)) +
opts(axis.title.y = theme_text(size = 14, angle=90))
看起来它介于10到20个主题之间。我们可以检查数据,以找到具有最高对数似然性的主题的确切数量,如下所示:
best.model.logLik.df[which.max(best.model.logLik.df$LL),]
# which returns
topics LL
12 13 -8525.234
因此,结果是13个主题最适合这些数据。现在,我们可以继续创建包含13个主题的LDA模型并研究该模型:
lda_AP <- LDA(AssociatedPress[21:30,], 13) # generate the model with 13 topics
get_terms(lda_AP, 5) # gets 5 keywords for each topic, just for a quick look
get_topics(lda_AP, 5) # gets 5 topic numbers per document
以此类推,确定模型的属性。
该方法基于:
Griffiths,TL和M. Steyvers,2004年。寻找科学课题。美国国家科学院院刊 101(Suppl 1):5228 –5235。
best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})
。为什么只选择原始数据21:30?
devtools::source_url("https://gist.githubusercontent.com/trinker/9aba07ddb07ad5a0c411/raw/c44f31042fc0bae2551452ce1f191d70796a75f9/optimal_k")
+1个不错的答案。