2013-04-20 12 views
13

Sembra che questa domanda sia stata richiesta alcune volte prima (hereand here), ma non è ancora stata fornita una risposta. Spero che ciò sia dovuto alla precedente ambiguità delle domande poste, come indicato dai commenti. Mi scuso se interrompo il protocollo ponendo di nuovo una domanda simile, ho solo pensato che quelle domande non avrebbero visto nuove risposte.Prevedere gli argomenti LDA per i nuovi dati

In ogni caso, sono nuovo rispetto a Latent Dirichlet Allocation e sto esplorando il suo utilizzo come mezzo di riduzione delle dimensioni per i dati testuali. In definitiva, mi piacerebbe estrarre una serie più piccola di argomenti da un sacco di parole molto grande e costruire un modello di classificazione usando quegli argomenti come poche variabili nel modello. Ho avuto successo nell'esecuzione di LDA su un set di formazione, ma il problema che sto avendo è in grado di prevedere quali di questi stessi argomenti appaiono in qualche altro set di dati di test. Sto usando il pacchetto topicmodels di R in questo momento, ma se c'è un altro modo per farlo usando un altro pacchetto, sono aperto anche a questo.

Ecco un esempio di quello che sto cercando di fare:

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

Cosa succede quando si utilizza l'argomento 'newdata' nel pacchetto' topicmodels'? Sembra rilevante ... http://cran.r-project.org/web/packages/topicmodels/topicmodels.pdf – Ben

+2

Ugh, non so come mi sia perso nella documentazione. A prima vista sembra: posteriore (train.lda, test) fa il trucco. – David

+1

@Ben Vuoi pubblicare una soluzione con quella così posso accettarla? – David

risposta

22

Con l'aiuto di superiori capacità di lettura del documento di Ben, credo che questo è possibile utilizzando la funzione() posteriore.

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

Bel lavoro! 'test.topics [[2]]' è la matrice con argomenti come colonne, nuovi documenti come righe e valori di cella come probabilità posteriori. – Ben

+0

Linee treno <- AssociatedPress [1: 100] e test <- AssociatedPress [101: 150] devono essere modificati in treno <- AssociatedPress [1: 100,] e test <- AssociatedPress [101: 150,] per funzionare =) – hdvianna

+0

C'è qualcosa di simile per Python? –

Problemi correlati