R topicmodels LDA

Я использую LDA для небольшого корпуса из 2 документов (предложений) в целях тестирования. Следующий код возвращает распределения тема-термин и документ-тема, которые совершенно неразумны с учетом входных документов. Выполнение точно таких же результатов в 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"'

person schimo    schedule 12.09.2017    source источник
comment
Интересный вопрос. Я использовал этот пакет в реальных условиях, и он дал хорошие результаты. Я почти уверен, что эти вонючие результаты как-то связаны с тем крошечным корпусом, который вы используете. Не могли бы вы опубликовать результаты Python для сравнения?   -  person KenHBS    schedule 13.09.2017
comment
Конечно, пожалуйста, посмотрите обновленный пост.   -  person schimo    schedule 13.09.2017
comment
gensim и topicmodels используют разные методы. gensim использует вариационный вывод, тогда как topicmodels здесь использует выборку свернутых гиббсов. topicmodels также имеет вариант вариационного вывода, но он дает такие же дерьмовые результаты .. Я тоже в тупике, извините   -  person KenHBS    schedule 13.09.2017
comment
Но результаты в R с тематическими моделями почти не меняются при использовании VEM в качестве метода оценки ...   -  person schimo    schedule 13.09.2017


Ответы (2)


Автор тематических моделей пакета R Беттина Грюн указала, что это связано с выбором гиперпараметра «альфа».

LDA в R выбирает alpha = 50/k= 25, а LDA в gensim Python выбирает alpha = 1/k = 0.5. Меньшее значение альфа способствует разреженным решениям распределения документов по темам, т.е.документы содержат смесь всего нескольких тем. Следовательно, уменьшение альфа в LDA в R дает очень разумные результаты:

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
person schimo    schedule 13.09.2017
comment
Отличный ответ! Дополнительную информацию о важности априорных значений в LDA можно найти в этой статье: Переосмысление LDA: почему важны априорные значения dirichlet.net/pdf/wallach09rethinking.pdf - person KenHBS; 14.09.2017

Постарайтесь изобразить затруднения по итерациям и убедиться, что они сходятся. Первоначальный статус также имеет значение. (Хотя размер документа и размер выборки кажутся небольшими.)

person Nelly Kong    schedule 12.09.2017