2013-04-20 14 views
13

Es sieht so aus, als ob diese Frage schon einige Male gestellt wurde (hereand here), aber sie muss noch beantwortet werden. Ich hoffe, dass dies auf die vorherige Zweideutigkeit der gestellten Frage (n) zurückzuführen ist, wie durch Kommentare angezeigt. Ich entschuldige mich, wenn ich das Protokoll ablehne, indem ich erneut eine ähnliche Frage stelle. Ich habe einfach angenommen, dass diese Fragen keine neuen Antworten finden werden.Vorhersage von LDA-Themen für neue Daten

Wie auch immer, ich bin neu in Latent Dirichlet Allocation und erkunde seine Verwendung als Mittel zur Dimensionsreduktion für Textdaten. Letztendlich möchte ich eine kleinere Menge von Themen aus einer sehr großen Anzahl von Wörtern extrahieren und ein Klassifikationsmodell erstellen, das diese Themen als einige Variablen im Modell verwendet. Ich hatte Erfolg beim Ausführen von LDA in einem Trainingssatz, aber das Problem, das ich habe, ist in der Lage vorherzusagen, welches dieser Themen in einem anderen Testdatensatz erscheint. Ich benutze R's topicmodels Paket jetzt, aber wenn es einen anderen Weg gibt, ein anderes Paket zu benutzen, bin ich auch dafür offen.

Hier ist ein Beispiel dafür, was ich zu tun versucht:

library(topicmodels) 
data(AssociatedPress) 

train <- AssociatedPress[1:100] 
test <- AssociatedPress[101:150] 

train.lda <- LDA(train,5) 
topics(train.lda) 

#how can I predict the most likely topic(s) from "train.lda" for each document in "test"? 
+5

Was passiert, wenn Sie das Argument 'newdata' im Paket' topicmodels' verwenden? Scheint relevant .. http://cran.r-project.org/web/packages/topicmodels/topicmodels.pdf – Ben

+2

Ugh, ich weiß nicht, wie ich das in der Dokumentation verpasst habe. Auf den ersten Blick sieht es so aus: posterior (train.lda, test) macht den Trick. – David

+1

@Ben Willst du damit eine Lösung posten, damit ich sie akzeptieren kann? – David

Antwort

22

Mit Hilfe von Bens überlegen Dokument Lesefähigkeiten, ich glaube, das möglich ist, die posterior() Funktion.

library(topicmodels) 
data(AssociatedPress) 

train <- AssociatedPress[1:100] 
test <- AssociatedPress[101:150] 

train.lda <- LDA(train,5) 
(train.topics <- topics(train.lda)) 
# [1] 4 5 5 1 2 3 1 2 1 2 1 3 2 3 3 2 2 5 3 4 5 3 1 2 3 1 4 4 2 5 3 2 4 5 1 5 4 3 1 3 4 3 2 1 4 2 4 3 1 2 4 3 1 1 4 4 5 
# [58] 3 5 3 3 5 3 2 3 4 4 3 4 5 1 2 3 4 3 5 5 3 1 2 5 5 3 1 4 2 3 1 3 2 5 4 5 5 1 1 1 4 4 3 

test.topics <- posterior(train.lda,test) 
(test.topics <- apply(test.topics$topics, 1, which.max)) 
# [1] 3 5 5 5 2 4 5 4 2 2 3 1 3 3 2 4 3 1 5 3 5 3 1 2 2 3 4 1 2 2 4 4 3 3 5 5 5 2 2 5 2 3 2 3 3 5 5 1 2 2 
+2

Gute Arbeit! 'test.topics [[2]]' ist die Matrix mit Themen als Spalten, neuen Dokumenten als Zeilen und Zellenwerten als Posterior-Wahrscheinlichkeiten. – Ben

+0

Linien trainieren <- AssociatedPress [1: 100] und testen <- AssociatedPress [101: 150] müssen geändert werden, um <- AssociatedPress [1: 100,] zu trainieren und <- AssociatedPress [101: 150,] zu testen, um zu funktionieren =) – hdvianna

+0

Gibt es etwas Ähnliches für Python? –

Verwandte Themen