2013-02-22 31 views
12

Używając gensim udało mi się wyodrębnić tematy z zestawu dokumentów w LSA, ale w jaki sposób uzyskać dostęp do tematów generowanych z modeli LDA?Jak wydrukować modele tematów LDA z gensim? Python

Podczas drukowania lda.print_topics(10) kod dała następujący błąd ponieważ print_topics() powrotnym NoneType:

Traceback (most recent call last): 
    File "/home/alvas/workspace/XLINGTOP/xlingtop.py", line 93, in <module> 
    for top in lda.print_topics(2): 
TypeError: 'NoneType' object is not iterable 

Kod:

from gensim import corpora, models, similarities 
from gensim.models import hdpmodel, ldamodel 
from itertools import izip 

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

# remove common words and tokenize 
stoplist = set('for a of the and to in'.split()) 
texts = [[word for word in document.lower().split() if word not in stoplist] 
     for document in documents] 

# remove words that appear only once 
all_tokens = sum(texts, []) 
tokens_once = set(word for word in set(all_tokens) if all_tokens.count(word) == 1) 
texts = [[word for word in text if word not in tokens_once] 
     for text in texts] 

dictionary = corpora.Dictionary(texts) 
corpus = [dictionary.doc2bow(text) for text in texts] 

# I can print out the topics for LSA 
lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=2) 
corpus_lsi = lsi[corpus] 

for l,t in izip(corpus_lsi,corpus): 
    print l,"#",t 
print 
for top in lsi.print_topics(2): 
    print top 

# I can print out the documents and which is the most probable topics for each doc. 
lda = ldamodel.LdaModel(corpus, id2word=dictionary, num_topics=50) 
corpus_lda = lda[corpus] 

for l,t in izip(corpus_lda,corpus): 
    print l,"#",t 
print 

# But I am unable to print out the topics, how should i do it? 
for top in lda.print_topics(10): 
    print top 
+0

W twoim kodzie brakuje czegoś, a mianowicie obliczenia corpus_tfidf. Czy mógłbyś dodać pozostałe elementy? – mel

Odpowiedz

14

Po niektóre aprowizacji, wydaje się print_topics(numoftopics) dla ldamodel ma jakiś błąd. Więc moje obejście jest użycie print_topic(topicid):

>>> print lda.print_topics() 
None 
>>> for i in range(0, lda.num_topics-1): 
>>> print lda.print_topic(i) 
0.083*response + 0.083*interface + 0.083*time + 0.083*human + 0.083*user + 0.083*survey + 0.083*computer + 0.083*eps + 0.083*trees + 0.083*system 
... 
+4

'print_topics' jest aliasem dla' show_topics' z pierwszymi pięcioma tematami. Po prostu napisz 'lda.show_topics()', nie 'print' niezbędne. – mac389

6

Używasz żadnego rejestrowanie? print_topics drukuje do pliku dziennika, jak podano w docs.

Jak mówi @ mac389, lda.show_topics() jest sposobem na wydruk do ekranu.

+0

Nie używam żadnego rejestrowania, ponieważ muszę natychmiast korzystać z tematów. masz rację, 'lda.show_topics()' lub 'lda.print_topic (i)' jest drogą do zrobienia. – alvas

2

Oto przykładowy kod do drukowania tematy:

def ExtractTopics(filename, numTopics=5): 
    # filename is a pickle file where I have lists of lists containing bag of words 
    texts = pickle.load(open(filename, "rb")) 

    # generate dictionary 
    dict = corpora.Dictionary(texts) 

    # remove words with low freq. 3 is an arbitrary number I have picked here 
    low_occerance_ids = [tokenid for tokenid, docfreq in dict.dfs.iteritems() if docfreq == 3] 
    dict.filter_tokens(low_occerance_ids) 
    dict.compactify() 
    corpus = [dict.doc2bow(t) for t in texts] 
    # Generate LDA Model 
    lda = models.ldamodel.LdaModel(corpus, num_topics=numTopics) 
    i = 0 
    # We print the topics 
    for topic in lda.show_topics(num_topics=numTopics, formatted=False, topn=20): 
     i = i + 1 
     print "TopiC#" + str(i) + ":", 
     for p, id in topic: 
      print dict[int(id)], 

     print "" 
+0

Próbowałem uruchomić twój kod, w którym przekazuję listę zawierającą BOW do tekstu. Dostaję następujący błąd: TypeError: show_topics() dostał nieoczekiwany argument słowa kluczowego "topics" – mribot

+1

wypróbuj num_topics. Poprawiłem powyższy kod. –

7

myślę składnia show_topics czasem się zmieniło:

show_topics(num_topics=10, num_words=10, log=False, formatted=True) 

Dla num_topics liczby tematów, wróć NUM_WORDS najbardziej znaczących słów (10 słów dla każdego tematu, domyślnie).

Tematy są zwracane jako lista - lista ciągów, jeśli sformatowana ma wartość Prawda, lub lista (prawdopodobieństwo, słowo) 2-krotne, jeśli fałsz.

Jeśli log jest prawdziwy, również wyprowadza ten wynik do dziennika.

W przeciwieństwie do LSA, nie ma naturalnej kolejności pomiędzy tematami w LDA. Zwracany num_topics < = Podzbiór self.num_topics wszystkich tematów jest zatem arbitralny i może zmieniać się między dwoma przebiegami treningowymi LDA.

3

można użyć:

for i in lda_model.show_topics(): 
    print i[0], i[1] 
0

Niedawno natknąłem podobnego problemu podczas pracy z Python 3 i Gensim 2.3.0. print_topics() i show_topics() nie podawały żadnego błędu, ale również niczego nie drukowały. Okazuje się, że show_topics() zwraca listę. Można więc po prostu:

topic_list = show_topics() 
print(topic_list)