2013-02-25 6 views
9

Sto usando python gensim per addestrare un modello Latent Dirichlet Allocation (LDA) da un corpus di 231 frasi. Tuttavia, ogni volta che ripeto il processo, genera diversi argomenti.Il modello LDA genera diversi argomenti ogni volta che mi alleno sullo stesso corpus

Perché gli stessi parametri e il corpus LDA generano argomenti diversi ogni volta?

E come si può stabilizzare la generazione degli argomenti?

sto usando questo corpus (http://pastebin.com/WptkKVF0) e questo elenco di parole non significative (http://pastebin.com/LL7dqLcj) ed ecco il mio codice:

from gensim import corpora, models, similarities 
from gensim.models import hdpmodel, ldamodel 
from itertools import izip 
from collections import defaultdict 
import codecs, os, glob, math 

stopwords = [i.strip() for i in codecs.open('stopmild','r','utf8').readlines() if i[0] != "#" and i != ""] 

def generateTopics(corpus, dictionary): 
    # Build LDA model using the above corpus 
    lda = ldamodel.LdaModel(corpus, id2word=dictionary, num_topics=50) 
    corpus_lda = lda[corpus] 

    # Group topics with similar words together. 
    tops = set(lda.show_topics(50)) 
    top_clusters = [] 
    for l in tops: 
     top = [] 
     for t in l.split(" + "): 
      top.append((t.split("*")[0], t.split("*")[1])) 
     top_clusters.append(top) 

    # Generate word only topics 
    top_wordonly = [] 
    for i in top_clusters: 
     top_wordonly.append(":".join([j[1] for j in i])) 

    return lda, corpus_lda, top_clusters, top_wordonly 

####################################################################### 

# Read textfile, build dictionary and bag-of-words corpus 
documents = [] 
for line in codecs.open("./europarl-mini2/map/coach.en-es.all","r","utf8"): 
    lemma = line.split("\t")[3] 
    documents.append(lemma) 
texts = [[word for word in document.lower().split() if word not in stopwords] 
      for document in documents] 
dictionary = corpora.Dictionary(texts) 
corpus = [dictionary.doc2bow(text) for text in texts] 

lda, corpus_lda, topic_clusters, topic_wordonly = generateTopics(corpus, dictionary) 

for i in topic_wordonly: 
    print i 

risposta

25

Perché gli stessi parametri LDA e corpus generare argomenti diversi ogni volta?

Poiché la LDA utilizza la casualità in entrambi i passaggi di addestramento e inferenza.

E come stabilizzare la generazione degli argomenti?

Azzerando il seme numpy.random sullo stesso valore ogni volta che un modello è addestrato o si esegue l'inferenza, con numpy.random.seed:

SOME_FIXED_SEED = 42 

# before training/inference: 
np.random.seed(SOME_FIXED_SEED) 

(Questo è brutto, e rende Gensim risulta difficile da riprodurre; considera di inviare una patch. Ho già aperto un .)

+2

Se i dati traing è sufficiente, il risultato dovrebbe convergono in loop limitato. Non è vero? –

+0

Posso sapere come impostare 'numpy.random' su' numpy.random.seed'? potresti mostrarmi un esempio di come chiamare 'ldamodel' con' numpy.random.seed'? – alvas

+1

@ 2er0 Non si imposta 'np.random' * su *' np.random.seed', si imposta seed * con * 'np.random.seed'. –

1

Ho avuto lo stesso problema, anche con circa 50.000 commenti. Ma puoi ottenere argomenti molto più consistenti aumentando il numero di iterazioni per cui l'LDA viene eseguita. Inizialmente è impostato su 50 e quando lo rilancio a 300, di solito mi dà gli stessi risultati, probabilmente perché è molto più vicino alla convergenza.

In particolare, basta aggiungere la seguente opzione:

ldamodel.LdaModel(corpus, ..., iterations = <your desired iterations>):