Насколько я знаю, вам просто нужно предоставить ряд тем и корпус. Не нужно указывать подходящий набор тем, хотя его можно использовать, как вы можете видеть в примере, начинающемся внизу страницы 15 Grun and Hornik (2011) .
Обновлено 28 января. Теперь я делаю вещи немного иначе, чем метод ниже. Смотрите мой текущий подход здесь: /programming//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 тем лучше всего соответствуют этим данным. Теперь мы можем приступить к созданию модели LDA с 13 темами и исследованию модели:
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.
devtools::source_url("https://gist.githubusercontent.com/trinker/9aba07ddb07ad5a0c411/raw/c44f31042fc0bae2551452ce1f191d70796a75f9/optimal_k")
+1 хороший ответ.best.model <- lapply(seq(2,100, by=1), function(k){LDA(AssociatedPress[21:30,], k)})
. Почему вы выбираете только сырые 21:30 данных?