2013-04-20 17 views
13

Wygląda na to, że to pytanie mogło zostać zadane kilka razy wcześniej (hereand here), ale nie zostało jeszcze udzielone. Mam nadzieję, że wynika to z wcześniejszej dwuznaczności zadawanych pytań, o czym świadczą komentarze. Przepraszam, jeśli łamie protokół, ponownie zadając proste pytanie, po prostu założyłem, że te pytania nie będą zawierały żadnych nowych odpowiedzi.Przewidywanie tematów LDA dla nowych danych

W każdym razie jestem nowy w Algorycie Latent Dirichlet i badam jego użycie jako środka do redukcji wymiarów danych tekstowych. Ostatecznie chciałbym wydobyć mniejszy zestaw tematów z bardzo dużego worka słów i zbudować model klasyfikacyjny wykorzystujący te tematy jako kilka zmiennych w modelu. Odniosłem sukces w prowadzeniu LDA na planie treningowym, ale problem, który mam, jest w stanie przewidzieć, które z tych samych tematów pojawiają się w innym zestawie danych testowych. Korzystam teraz z pakietu tematów R, ale jeśli jest inny sposób na to, używając innego pakietu, również jestem do tego otwarty.

Oto przykład tego, co próbuję zrobić:

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

Co stanie się, gdy użyjesz argumentu 'newdata' w pakiecie' topicmodels'? Wydaje się odpowiednie .. http://cran.r-project.org/web/packages/topicmodels/topicmodels.pdf – Ben

+2

Ugh, nie wiem, jak to przegapiłem w dokumentacji. Na pierwszy rzut oka wygląda to tak: posterior (train.lda, test). – David

+1

@Ben Czy chcesz przesłać z tym rozwiązanie, abym mógł je zaakceptować? – David

Odpowiedz

22

Z pomocą wysokich umiejętności Bena czytanie dokumentu, wierzę, jest to możliwe przy użyciu funkcji() tylnej.

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

Dobra robota! 'test.topics [[2]]' to macierz z tematami jako cols, nowe dokumenty jako wiersze i wartości komórek jako prawdopodobieństwa posteriori. – Ben

+0

Pociąg linii <- AssociatedPress [1: 100] i test <- AssociatedPress [101: 150] należy zmienić, aby trenować <- AssociatedPress [1: 100,] i testować <- AssociatedPress [101: 150,] aby pracować =) – hdvianna

+0

Czy jest coś podobnego do Pythona? –

Powiązane problemy