18

Pythongensimを使用して、231 文の小さなコーパスから潜在的ディリクレ配分 (LDA) モデルをトレーニングしています。ただし、プロセスを繰り返すたびに、さまざまなトピックが生成されます。

同じ LDA パラメータとコーパスが毎回異なるトピックを生成するのはなぜですか?

また、トピックの生成を安定させるにはどうすればよいですか?

私はこのコーパス(http://pastebin.com/WptkKVF0)とストップワードのリスト( http://pastebin.com/LL7dqLcj )を使用しています。これが私のコードです:

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
4

4 に答える 4

32

同じ LDA パラメータとコーパスが毎回異なるトピックを生成するのはなぜですか?

LDA はトレーニングと推論の両方のステップでランダム性を使用するためです。

また、トピックの生成を安定させるにはどうすればよいですか?

numpy.randomモデルのトレーニングまたは推論が実行されるたびにシードを同じ値にリセットすることにより、次のようになりnumpy.random.seedます。

SOME_FIXED_SEED = 42

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

(これは醜く、Gensim の結果を再現するのが難しくなります。パッチを提出することを検討してください。私はすでに問題を起こしています。)

于 2013-02-25T14:44:31.667 に答える