2013-02-25 14 views
9

Ich benutze Python gensim, um ein Latent Dirichlet Allocation (LDA) Modell aus einem kleinen Korpus von 231 Sätzen zu trainieren. Jedes Mal, wenn ich den Vorgang wiederhole, erzeugt er jedoch verschiedene Themen.LDA-Modell erzeugt verschiedene Themen jedes Mal, wenn ich auf dem gleichen Korpus trainiere

Warum erzeugen dieselben LDA-Parameter und Corpus jedes Mal unterschiedliche Themen?

Und wie stabilisiere ich die Themengeneration?

ich diesen Korpus bin mit (http://pastebin.com/WptkKVF0) und diese Liste der Stoppwörter (http://pastebin.com/LL7dqLcj) und mein Code hier vor sich:

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 

Antwort

25

Warum die gleichen LDA Parameter und Korpus erzeugen jedes Mal unterschiedliche Themen?

Da LDA Zufälligkeit in Training und Inferenz verwendet.

Und wie stabilisiere ich die Themengeneration?

Durch die numpy.random Samen auf den gleichen Wert Zurücksetzen jedes Mal ein Modell trainiert wird oder Inferenz durchgeführt wird, mit numpy.random.seed:

SOME_FIXED_SEED = 42 

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

(Dies ist hässlich, und es macht GENSIM schwer Ergebnisse zu reproduzieren; Überlegen Sie sich, ob Sie einen Patch einreichen möchten.Ich habe bereits eine issue geöffnet.)

+2

Wenn die traing Daten ausreichend ist, sollte das Ergebnis in begrenzten Schleifen zusammenlaufen. Ist es nicht? –

+0

Darf ich wissen, wie setze ich 'numpy.random' auf' numpy.random.seed'? Könntest du mir ein Beispiel zeigen, wie man das 'ldamodel' mit' numpy.random.seed' bezeichnet? – alvas

+1

@ 2er0 Sie setzen 'np.random' * nicht auf *' np.random.seed', Sie setzen den Startwert * mit * 'np.random.seed'. –

1

Ich hatte das gleiche Problem, sogar mit etwa 50.000 Kommentare. Sie können jedoch wesentlich konsistentere Themen erhalten, indem Sie die Anzahl der Iterationen erhöhen, für die der LDA ausgeführt wird. Es ist anfangs auf 50 eingestellt und wenn ich es auf 300 hebe, gibt es mir normalerweise die gleichen Ergebnisse, wahrscheinlich weil es viel näher an der Konvergenz ist.

Insbesondere Sie fügen Sie einfach die folgende Option:

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