回答:
私が知る限り、あなたはいくつかのトピックとコーパスを提供する必要があります。Grun and Hornik(2011)の 15ページの下部から始まる例でわかるように、候補のトピックセットを指定する必要はありませんが、1つを使用できます。
1月28日更新。14以下の方法とは少し異なる方法で作業するようになりました。私の現在のアプローチについてはこちらをご覧ください: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。Steyvers2004。科学的なトピックを見つける。アメリカ合衆国国立科学アカデミーの議事録 101(補足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いい答え。