2015-07-21 25 views
9

我在一組文檔上使用Gensim HDP模塊。分層Dirichlet過程Gensim主題編號獨立於語料庫大小

>>> hdp = models.HdpModel(corpusB, id2word=dictionaryB) 
>>> topics = hdp.print_topics(topics=-1, topn=20) 
>>> len(topics) 
150 
>>> hdp = models.HdpModel(corpusA, id2word=dictionaryA) 
>>> topics = hdp.print_topics(topics=-1, topn=20) 
>>> len(topics) 
150 
>>> len(corpusA) 
1113 
>>> len(corpusB) 
17 

爲什麼主題的數量與語料庫長度無關?

回答

4

@ user3907335是完全正確的位置:HDP將計算儘可能多的主題爲所指派的截斷水平。 但是,可能是這些主題中的許多基本上具有零概率發生的情況。爲了在我自己的工作中爲此提供幫助,我寫了一個方便的小函數,對每個主題的概率權重進行粗略估計。請注意,這只是一個粗略的度量:它沒有考慮與每個詞相關的概率。即便如此,它提供了一個相當不錯的度量哪些主題是有意義的,哪些不是:

import pandas as pd 
import numpy as np 

def topic_prob_extractor(hdp=None, topn=None): 
    topic_list = hdp.show_topics(topics=-1, topn=topn) 
    topics = [int(x.split(':')[0].split(' ')[1]) for x in topic_list] 
    split_list = [x.split(' ') for x in topic_list] 
    weights = [] 
    for lst in split_list: 
     sub_list = [] 
     for entry in lst: 
      if '*' in entry: 
       sub_list.append(float(entry.split('*')[0])) 
     weights.append(np.asarray(sub_list)) 
    sums = [np.sum(x) for x in weights] 
    return pd.DataFrame({'topic_id' : topics, 'weight' : sums}) 

我假設你已經知道如何計算一個HDP模型。一旦你有你所撥打gensim功能如下計算的HDP模型:

topic_weights = topic_prob_extractor(hdp, 500) 
2

我對HDPs沒有使用gensim,但有可能大部分小語料庫中的主題發生的概率極低?你能嘗試打印主題概率嗎?也許,主題數組的長度並不一定意味着所有這些主題實際上都是在語料庫中找到的。

+1

nope他們都在'話題'無論概率 – user86895

2

我想你誤解了被調用方法執行的操作。直接從您可以看到的文檔:

show_topics()的別名,它打印主題要記錄的主題數n個最可能的詞。設置主題= -1以打印所有主題。

你訓練模式,而無需指定有關議題的print_topicstopics=-1你會得到前20個字每個主題呼叫的號碼,默認一個是150截斷水平,在您的案件150個主題。

我還在圖書館的新手,所以也許我」錯

+4

雖然我懷疑你是對的,這是沒有意義的。 HDP應該推斷主題的數量。它沒有任何意義,它總是達到它可以達到的最大值,特別是給予2個具有這種尺寸差異的語料庫。如果它總是達到最大值,那麼對於它應該做的事情來說基本沒有用處,我可以使用N = 150的LDA –

5

@亞倫的上述代碼被打破,由於gensim API的變化。我重寫和簡化它如下。工程截至6月2017與gensim V2.1.0

import pandas as pd 

def topic_prob_extractor(gensim_hdp): 
    shown_topics = gensim_hdp.show_topics(num_topics=-1, formatted=False) 
    topics_nos = [x[0] for x in shown_topics ] 
    weights = [ sum([item[1] for item in shown_topics[topicN][1]]) for topicN in topics_nos ] 

    return pd.DataFrame({'topic_id' : topics_nos, 'weight' : weights}) 
0

@阿隆和@Roko Mijic的接近忽視的事實功能show_topics返回默認只有每個主題的頂部20個字。如果返回構成話題的所有單詞,那麼所有在這種情況下的近似話題概率將是1(或0.999999)。我嘗試用下面的代碼,這是@Roko Mijic的改編:

def topic_prob_extractor(gensim_hdp, t=-1, w=25, isSorted=True): 
    """ 
    Input the gensim model to get the rough topics' probabilities 
    """ 
    shown_topics = gensim_hdp.show_topics(num_topics=t, num_words=w ,formatted=False) 
    topics_nos = [x[0] for x in shown_topics ] 
    weights = [ sum([item[1] for item in shown_topics[topicN][1]]) for topicN in topics_nos ] 
    if (isSorted): 
     return pd.DataFrame({'topic_id' : topics_nos, 'weight' : weights}).sort_values(by = "weight", ascending=False); 
    else: 
     return pd.DataFrame({'topic_id' : topics_nos, 'weight' : weights}); 

一個更好的,但我不知道,如果是100%有效,方法一提到here。你可以得到的主題的HDP模型的真實重量(阿爾法向量)爲:

alpha = hdpModel.hdp_to_lda()[0]; 

審查的主題相當於α值大於清點起來的每個主題的第20個字的權重來近似更符合邏輯它在數據中的使用概率。