Raggruppamento di documenti utilizzando gli argomenti derivati ​​dall'allocazione latente di Dirichlet


9

Voglio usare Latent Dirichlet Allocation per un progetto e sto usando Python con la libreria gensim. Dopo aver trovato gli argomenti, vorrei raggruppare i documenti usando un algoritmo come k-mean (idealmente vorrei usarne uno buono per i cluster sovrapposti, quindi ogni raccomandazione è benvenuta). Sono riuscito a ottenere gli argomenti, ma sono nella forma di:

0,041 * Ministro + 0,041 * Chiave + 0,041 * momenti + 0,041 * controverso + 0,041 * Primo

Per applicare un algoritmo di clustering e correggermi se sbaglio, credo che dovrei trovare un modo per rappresentare ogni parola come un numero usando tfidf o word2vec.

Hai qualche idea di come potrei "spogliare" le informazioni testuali da ad esempio un elenco, al fine di farlo e poi rimetterle al fine di effettuare la moltiplicazione appropriata?

Ad esempio, per come la vedo io se la parola Ministro ha un peso totale di 0,042 e così via per qualsiasi altra parola all'interno dello stesso argomento, dovrei essere di calcolare qualcosa del tipo:

0,041 * 0,42 + ... + 0,041 * tfidf (Prime) e ottenere un risultato che verrà successivamente utilizzato per raggruppare i risultati.

Grazie per il tuo tempo.


1
Come spiegato nel tutorial , puoi esprimere documenti come vettori. Cluster quei vettori.
Emre,

Conosco il mio compagno ma devo raggrupparli in base agli argomenti creati dopo aver applicato LDA alla mia collezione. Ogni argomento deve essere rappresentato come un vettore per confrontare ogni documento con ciascun argomento e trovare l'argomento o gli argomenti corrispondenti per ciascun documento.
Swan87,

Non devi rappresentare ogni parola come un vettore. Ottieni la nuova rappresentazione per l'intero documento applicando la trasformazione LDA che hai appreso al corpus . Per un esempio con LSI, vedere questo link: radimrehurek.com/gensim/tut2.html La parte chiave è dove applicano la trasformazione LSI appresa all'intero corpus con lsi [doc_bow]
Will Stanton,

Risposte:


4

Supponendo che LDA abbia prodotto un elenco di argomenti e messo un punteggio su ciascun argomento per ciascun documento, è possibile rappresentare il documento e i suoi punteggi come vettore:

Document | Prime | Minister | Controversial | TopicN | ...
   1       0.041    0.042      0.041          ...
   2       0.052    0.011      0.042          ...

Per ottenere i punteggi per ciascun documento, è possibile eseguire il documento. come un sacco di parole, attraverso un modello LDA addestrato. Dalla documentazione di Gensim:

>>> lda = LdaModel(corpus, num_topics=100)  # train model
>>> print(lda[doc_bow]) # get topic probability distribution for a document

Quindi, è possibile eseguire i k-medie su questa matrice e dovrebbe raggruppare documenti simili tra loro. K-significa di default è un algoritmo di clustering duro che implica che classifica ogni documento in un cluster. È possibile utilizzare meccanismi di soft clustering che forniranno un punteggio di probabilità che un documento rientri in un cluster - questo si chiama k fuzzy-mean . https://gist.github.com/mblondel/1451300 è una sintesi di Python che mostra come è possibile farlo con scikit learn.

ps: non posso pubblicare più di 2 link


Ho provato a farlo per "n" no di documenti che dicono dove sono gli argomenti. Tuttavia, per esempio x no di documenti, tutti gli argomenti t non vengono visualizzati solo alcuni argomenti (t- no) visualizzati, dove 1 <= no <t. Non succede quando eseguo l'esperimento su documenti di piccole dimensioni. È perché non stampa affatto se il prob è 0?
Manish Ranjan

0

In aggiunta alla risposta precedente, è meglio non solo eseguire i kmean direttamente sui dati compositivi derivati ​​dalla distribuzione argomento-doc di lda, ma utilizzare una trasformazione dei dati compositivi per proiettarli nello spazio euclideo come ilr o clr.

( Esempio )

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.