Python >> Tutoriel Python >  >> Python Tag >> Gensim

Processus de Dirichlet hiérarchique Numéro de sujet Gensim indépendant de la taille du corpus

Le code de @Aaron ci-dessus est cassé à cause de gensim Modifications de l'API. Je l'ai réécrit et simplifié comme suit. Fonctionne depuis juin 2017 avec 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})

Les approches de @Aron et @Roko Mijic négligent le fait que la fonction show_topics renvoie par défaut les 20 premiers mots de chaque sujet uniquement. Si l'on renvoie tous les mots qui composent un sujet, toutes les probabilités de sujet approchées dans ce cas seront 1 (ou 0,999999). J'ai expérimenté le code suivant, qui est une adaptation de celui de @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});

Une meilleure approche, mais je ne suis pas sûr qu'elle soit valable à 100%, est celle mentionnée ici. Vous pouvez obtenir les pondérations réelles des sujets (vecteur alpha) du modèle HDP comme :

alpha = hdpModel.hdp_to_lda()[0];

Examiner les valeurs alpha équivalentes des sujets est plus logique que de compter les poids des 20 premiers mots de chaque sujet pour estimer sa probabilité d'utilisation dans les données.


Je pense que vous avez mal compris l'opération effectuée par la méthode appelée. Directement à partir de la documentation, vous pouvez voir :

Alias ​​pour show_topics() qui imprime les n premiers mots les plus probables pour le nombre de sujets à enregistrer. Définissez topic=-1 pour imprimer tous les sujets.

Vous avez formé le modèle sans spécifier le niveau de troncature sur le nombre de sujets et celui par défaut est 150. Appel du print_topics avec topics=-1 vous obtiendrez les 20 premiers mots pour chaque sujet, dans votre cas 150 sujets.

Je suis encore un débutant de la bibliothèque, alors peut-être que je me trompe