2016-03-03 59 views
2

我使用Gensim包進行主題建模。這個想法是瞭解flickr標籤中的主題。 到目前爲止我使用這段代碼(文件是標籤):LDA for tags(gensim)

texts = [[word for word in document.split(";") if word not in stoplist] for document in documents] 
    dictionary = corpora.Dictionary(texts) 
    corpus = [dictionary.doc2bow(text) for text in texts] 
    lda = ldamodel.LdaModel(corpus, id2word=dictionary, alpha = 0.1, num_topics=10) 
    topic = [] 
    for f in lda.print_topics(num_topics=4, num_words=10): 
     topic_number = f[0] 
     keywords = f[1] 
     keywords = keywords.split(" + ") 
     keywords_update = {} 
     for ii in keywords: 
      ii = str(ii) 
      keyword = ii[6:] 
      probab = ii[0:5] 
      probab = float(probab) 
      if probab > 0.02: 
       keywords_update.update({keyword:probab}) 
     topic.append(keywords_update) 
    print topic 

所以基本上我訓練LDA在我的所有文件,然後打印10分最有可能的話每一個話題。這是對的嗎?或者,我必須在部分文檔上訓練數據,然後使用corpus_lda = lda [語料庫]將訓練過的模型應用於未見文檔? 如果每次運行模型時結果都不相同,是否表示主題數量不正確?評估結果的最佳方法是什麼?

+0

要查看每個文檔與哪些主題最相關的主題,您需要使用'lda [語料庫]'。要查看每個主題與哪個詞最相關的詞,可以爲每個主題打印10個最可能的詞。看看[這裏](http://radimrehurek.com/topic_modeling_tutorial/2%20-%20Topic%20Modeling.html)可以幫助你打印這些東西的其他功能。 – interpolack

回答

1

由於模型中的分類器使用貝葉斯定理的變體statistical inference,因此每次查詢模型時,未看見文檔的概率分佈都會發生變化。 Gensim爲您獲取大部分工作,以獲取每個主題的頂級單詞。

這將返回topic_id的字典:{word:probability}與模型中每個主題的前10個單詞。

topn_words = {i: {word: prob for word, prob in lda.show_topic(i, topn=10)} for i in range(0, lda.num_topics)} 

當您使用lda[unseen_document],它返回是在模型中,主題數量的大小,每個值是該文檔適合對應的索引中的主題概率的概率分佈向量向量。

一旦你有一個看不見的文檔集合的概率分佈向量,你可以計算它們之間的相似度。 Gensim具有內置的餘弦相似性。

bow = dictionary.doc2bow(tokenize(text)) 
vec_1 = lda[bow] 
bow = dictionary.doc2bow(tokenize(text)) 
vec_2 = lda[bow] 
gensim.matutils.cossim(vec_1, vec_2) 

在這個例子中,標記化是由功能,你要麼使用內置的Gensim simple_preprocess()方法或修剪和記號化的文字一些其他的方式。 dictionary.doc2bow()方法需要一個單詞列表並輸出一包單詞或元組列表(word_id,frequency)。