Document d'actualité de la distribution dans Gensim LDA
j'ai dérivé un modèle Lda topic en utilisant un corpus jouet comme suit:
documents = ['Human machine interface for lab abc computer applications',
'A survey of user opinion of computer system response time',
'The EPS user interface management system',
'System and human system engineering testing of EPS',
'Relation of user perceived response time to error measurement',
'The generation of random binary unordered trees',
'The intersection graph of paths in trees',
'Graph minors IV Widths of trees and well quasi ordering',
'Graph minors A survey']
texts = [[word for word in document.lower().split()] for document in documents]
dictionary = corpora.Dictionary(texts)
id2word = {}
for word in dictionary.token2id:
id2word[dictionary.token2id[word]] = word
j'ai trouvé que lorsque j'utilise un petit nombre de sujets pour dériver le modèle, Gensim fournit un rapport complet de la distribution topique sur tous les sujets potentiels pour un document d'essai. E. g.:
test_lda = LdaModel(corpus,num_topics=5, id2word=id2word)
test_lda[dictionary.doc2bow('human system')]
Out[314]: [(0, 0.59751626959781134),
(1, 0.10001902477790173),
(2, 0.10001375856907335),
(3, 0.10005453508763221),
(4, 0.10239641196758137)]
Cependant, lorsque j'utilise un grand nombre de sujets, le rapport n'est pas complet:
test_lda = LdaModel(corpus,num_topics=100, id2word=id2word)
test_lda[dictionary.doc2bow('human system')]
Out[315]: [(73, 0.50499999999997613)]
il me semble que les sujets avec une probabilité inférieure à un certain seuil (j'ai observé 0,01 à être plus précis) sont omis forme la sortie.
je me demandais si ce comportement est dû à des considérations esthétiques? Et comment puis-je obtenir la distribution de la masse résiduelle de probabilité sur tous les autres sujets?
Merci pour votre réponse!
2 réponses
je me rends compte que c'est une vieille question mais au cas où quelqu'un trébucherait dessus, voici une solution (la question a été en fait fixe dans la branche de développement actuelle avec un minimum_probability
paramètre
définir une nouvelle fonction (c'est juste copié à partir de la source)
def get_doc_topics(lda, bow):
gamma, _ = lda.inference([bow])
topic_dist = gamma[0] / sum(gamma[0]) # normalize distribution
return [(topicid, topicvalue) for topicid, topicvalue in enumerate(topic_dist)]
la fonction ci-dessus ne filtre pas les sujets de sortie en fonction de la probabilité, mais les affichera tous. Si vous n'avez pas besoin de l' (topic_id, value)
tuples, mais seulement des valeurs, il suffit de retourner le topic_dist
au lieu de la liste de compréhension (ce sera beaucoup plus rapide aussi).