2015-07-21 9 views
9

Ich verwende das Gensim HDP-Modul auf einer Reihe von Dokumenten.Hierarchical Dirichlet Prozess Gensim Themennummer unabhängig von der Korpusgröße

>>> 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 

Warum ist die Anzahl der Themen unabhängig von der Korpuslänge?

Antwort

4

@ user3907335 ist hier genau richtig: HDP so viele Themen wie die zugeordnete Abschneideebene berechnen wird. Jedoch, kann es der Fall sein, dass viele dieser Themen grundsätzlich Null Wahrscheinlichkeit auftreten. Um bei meiner eigenen Arbeit dabei zu helfen, schrieb ich eine handliche kleine Funktion, die eine grobe Schätzung der Wahrscheinlichkeitsgewichtung jedes Themas vornimmt. Beachten Sie, dass dies nur eine grobe Metrik ist: berücksichtigt nicht die mit jedem Wort verbundene Wahrscheinlichkeit. Trotzdem bietet es eine ziemlich gute Metrik, für die Themen sinnvoll sind und welche nicht:

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}) 

Ich gehe davon aus, dass Sie bereits wissen, wie ein HDP-Modell zu berechnen. Sobald Sie haben ein HDP-Modell berechnet, indem GENSIM Aufruf der Funktion wie folgt:

topic_weights = topic_prob_extractor(hdp, 500) 
2

Ich habe Gensim nicht für HDPs verwendet, aber ist es möglich, dass die meisten Themen im kleineren Korpus eine extrem niedrige Wahrscheinlichkeit haben, zu vorkommen? Können Sie versuchen, die Themenwahrscheinlichkeiten auszudrucken? Vielleicht bedeutet die Länge des Themen-Arrays nicht unbedingt, dass alle diese Themen tatsächlich im Korpus gefunden wurden.

+1

nein sie sind alle in 'Themen' unabhängig von der Wahrscheinlichkeit – user86895

2

Ich denke, Sie haben die Operation von der aufgerufenen Methode missverstanden. Direkt aus der Dokumentation können Sie sehen:

Alias ​​für show_topics(), die die Top n wahrscheinlichsten Wörter für Themen Anzahl der Themen zu protokollieren druckt. Setzen Sie topics = -1, um alle Themen zu drucken.

Sie trainiert das Modell ohne das Abschneiden Ebene auf die Anzahl der Themen spezifiziert und die Standardeinstellung ist 150. Aufruf der print_topics mit topics=-1 Sie die Top 20 Wörter für jedes Thema erhalten, in Ihrem Fall 150 Themen.

Ich bin immer noch ein Neuling der Bibliothek, vielleicht I‘falsch

+4

Während ich vermute, dass Sie Recht haben, macht dies keinen Sinn. HDP sollte die Anzahl der Themen ableiten. Es macht keinen Sinn, dass es immer maximal geht, besonders bei 2 Korpussen mit einem solchen Größenunterschied. Wenn es immer zum Maximum geht, ist es im Grunde nutzlos für das, was es tun sollte, ich kann einfach LDA mit N = 150 verwenden –

5

@ Aaron Code oben aufgrund GENSIM API-Änderungen gebrochen. Ich schrieb es neu und vereinfachte es wie folgt. Arbeitet ab Juni 2017 mit 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

@ Arons und @Roko Mijic die Ansätze vernachlässigen die Tatsache, dass die Funktion show_topics kehrt standardmäßig nur die Top 20 Wörter jedes Thema. Wenn man alle Wörter zurückgibt, die ein Thema bilden, werden alle angenäherten Themenwahrscheinlichkeiten in diesem Fall 1 (oder 0,999999) sein. Ich experimentierte mit dem folgenden Code, der eine Adaption von @Roko Mijic lautet:

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}); 

A besser, aber ich bin nicht sicher, ob 100% gültig, Ansatz ist derjenige here erwähnt.Sie können die Themen true Gewichte (alpha Vektor) des HDP-Modell als:

alpha = hdpModel.hdp_to_lda()[0]; 

den Themen Prüfungs erhalten gleichwertige Alpha-Werte ist logischer als die Gewichte der ersten 20 Wörter jedes Thema Auszählung bis zu nähern seine Wahrscheinlichkeit der Verwendung in den Daten.