web-dev-qa-db-fra.com

get_document_topics et get_term_topics dans gensim

ldamodel dans gensim a les deux méthodes: get_document_topics Et get_term_topics.

Malgré leur utilisation dans ce tutoriel gensim notebook , je ne comprends pas bien comment interpréter la sortie de get_term_topics Et j'ai créé le code autonome ci-dessous pour montrer ce que je veux dire:

from gensim import corpora, models

texts = [['human', 'interface', 'computer'],
 ['survey', 'user', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'system'],
 ['system', 'human', 'system', 'eps'],
 ['user', 'response', 'time'],
 ['trees'],
 ['graph', 'trees'],
 ['graph', 'minors', 'trees'],
 ['graph', 'minors', 'survey']]

# build the corpus, dict and train the model
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
model = models.ldamodel.LdaModel(corpus=corpus, id2Word=dictionary, num_topics=2, 
                                 random_state=0, chunksize=2, passes=10)

# show the topics
topics = model.show_topics()
for topic in topics:
    print topic
### (0, u'0.159*"system" + 0.137*"user" + 0.102*"response" + 0.102*"time" + 0.099*"eps" + 0.090*"human" + 0.090*"interface" + 0.080*"computer" + 0.052*"survey" + 0.030*"minors"')
### (1, u'0.267*"graph" + 0.216*"minors" + 0.167*"survey" + 0.163*"trees" + 0.024*"time" + 0.024*"response" + 0.024*"eps" + 0.023*"user" + 0.023*"system" + 0.023*"computer"')

# get_document_topics for a document with a single token 'user'
text = ["user"]
bow = dictionary.doc2bow(text)
print "get_document_topics", model.get_document_topics(bow)
### get_document_topics [(0, 0.74568415806946331), (1, 0.25431584193053675)]

# get_term_topics for the token user
print "get_term_topics: ", model.get_term_topics("user", minimum_probability=0.000001)
### get_term_topics:  [(0, 0.1124525558321441), (1, 0.006876306738765027)]

Pour get_document_topics, La sortie est logique. Les deux probabilités s'additionnent à 1,0, et le sujet où user a une probabilité plus élevée (de model.show_topics()) a également la probabilité la plus élevée assignée.

Mais pour get_term_topics, Il y a des questions:

  1. Les probabilités ne totalisent pas 1.0, pourquoi?
  2. Bien que numériquement, le sujet où user a une probabilité plus élevée (de model.show_topics()) a également un nombre plus élevé attribué, que signifie ce nombre?
  3. Pourquoi devrions-nous utiliser get_term_topics Alors que get_document_topics Peut fournir (apparemment) la même fonctionnalité et a une sortie significative?
9
tkja

Je travaillais sur LDA Topic Modeling et suis tombé sur ce post. J'ai créé deux sujets, disons sujet1 et sujet2.

Les 10 premiers mots pour chaque sujet sont les suivants: 0.009*"would" + 0.008*"experi" + 0.008*"need" + 0.007*"like" + 0.007*"code" + 0.007*"work" + 0.006*"think" + 0.006*"make" + 0.006*"one" + 0.006*"get

0.027*"ierr" + 0.018*"line" + 0.014*"0.0e+00" + 0.010*"error" + 0.009*"defin" + 0.009*"norm" + 0.006*"call" + 0.005*"type" + 0.005*"de" + 0.005*"warn

Finalement, j'ai pris 1 document pour déterminer le sujet le plus proche.

for d in doc:
    bow = dictionary.doc2bow(d.split())
    t = lda.get_document_topics(bow)

et la sortie est [(0, 0.88935698141006414), (1, 0.1106430185899358)].

Pour répondre à votre première question, les probabilités s'additionnent à 1,0 pour un document et c'est ce que fait get_document_topics. Le document indique clairement qu'il renvoie la distribution de rubrique pour l'arc de document donné, sous la forme d'une liste de 2-tuples (topic_id, topic_probability).

De plus, j'ai essayé d'obtenir get_term_topics pour le mot clé "ierr"

t = lda.get_term_topics("ierr", minimum_probability=0.000001) et le résultat est [(1, 0.027292299843400435)] qui n'est rien d'autre que la contribution de Word pour déterminer chaque sujet, ce qui est logique.

Ainsi, vous pouvez étiqueter le document en fonction de la distribution des rubriques que vous obtenez à l'aide de get_document_topics et vous pouvez déterminer l'importance de Word en fonction de la contribution fournie par get_term_topics.

J'espère que ça aide.

8
user1211