2017-09-12 5 views
2

Je lance LDA sur un petit corpus de 2 docs (phrases) à des fins de test. Le code suivant renvoie des distributions sujet-sujet et document-sujet qui ne sont pas raisonnables du tout compte tenu des documents d'entrée. Exécution exactement les mêmes retours dans les résultats raisonnables de Python. Qui sait ce qui ne va pas ici?R topicmodels LDA

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 

Les résultats de Python sont les suivants:

>>> 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

Question intéressante. J'ai utilisé ce paquet dans un cadre réel et cela a donné de bons résultats. Je suis sûr que ces résultats puants ont quelque chose à voir avec le minuscule corpus que vous utilisez. Pourriez-vous publier les résultats de Python à des fins de comparaison? –

+0

Bien sûr, s'il vous plaît voir le post mis à jour. – schimo

+0

'gensim' et' topicmodels' utilisent des méthodes différentes. '' gensim' utilise l'inférence variationnelle, tandis que 'topicmodels' utilise l'échantillonnage des gibbs réduit ici. 'topicmodels' a aussi une option d'inférence variationnelle, mais elle donne les mêmes résultats merdiques .. Je suis dans une impasse aussi, désolé –

Répondre

0

Essayez de tracer les perplexités sur itérations et assurez-vous qu'ils convergent. Le statut initial compte également. (La taille du document et la taille de l'échantillon semblent toutes deux être petites, cependant.)

2

L'auteur de la rubrique R packagemodels, Bettina Grün, a souligné que cela est dû à la sélection de l'hyperparamètre 'alpha'. LDA dans R sélectionne alpha = 50/k= 25 tandis que LDA dans le gensim Python sélectionne alpha = 1/k = 0.5. Une valeur alpha plus faible favorise les solutions éparses de distribution de documents-sujets, c'est-à-dire que les documents contiennent un mélange de quelques sujets. Par conséquent, une diminution de l'alpha dans LDA dans R donne des résultats très raisonnables:

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 
+0

Bonne réponse! Pour plus d'informations sur l'importance des priors dans les LDA, consultez ce document: * Repenser l'ADL: pourquoi les prieurs sont-ils importants? * Http://dirichlet.net/pdf/wallach09rethinking.pdf –