2013-03-07 70 views
0

全部,Gensim主題打印錯誤/問題

這是我在this thread中回覆的內容。我試圖在gensim中打印LSI主題時遇到了一些棘手的結果。這是我的代碼:

try: 
    from gensim import corpora, models 
except ImportError as err: 
    print err 

class LSI: 
    def topics(self, corpus): 
     tfidf = models.TfidfModel(corpus) 
     corpus_tfidf = tfidf[corpus] 
     dictionary = corpora.Dictionary(corpus) 
     lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=5) 
     print lsi.show_topics() 

if __name__ == '__main__': 
    data = '../data/data.txt' 
    corpus = corpora.textcorpus.TextCorpus(data) 
    LSI().topics(corpus) 

這將以下內容輸出到控制檯。

-0.804*"(5, 1)" + -0.246*"(856, 1)" + -0.227*"(145, 1)" + ...... 

我希望能夠打印出像@ 2er0的主題做了over here但我得到這樣的結果。請參閱下面的內容並注意打印的第二項是一個元組,我不知道它來自哪裏。 data.txt是一個包含幾個段落的文本文件。就這些。

對此的任何想法都是太棒了!亞當

回答

4

要回答爲什麼你的LSI主題是元組代替文字,請檢查您輸入的語料庫。

它是從通過corpus = [dictionary.doc2bow(text) for text in texts]轉換成語料庫的文檔列表創建的嗎?

因爲如果不是,你只是從序列化的語料庫中讀取它而不讀取字典,那麼你不會得到主題輸出中的單詞。

下面我的代碼工作,並打印出的主題加權話:

import gensim as gs 

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 = gs.corpora.Dictionary(texts) 
corpus = [dictionary.doc2bow(text) for text in texts] 

tfidf = gs.models.TfidfModel(corpus) 
corpus_tfidf = tfidf[corpus] 

lsi = gs.models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=5) 
lsi.print_topics() 

for i in lsi.print_topics(): 
    print i 

以上輸出:

-0.331*"system" + -0.329*"a" + -0.329*"survey" + -0.241*"user" + -0.234*"minors" + -0.217*"opinion" + -0.215*"eps" + -0.212*"graph" + -0.205*"response" + -0.205*"time" 
-0.330*"minors" + 0.313*"eps" + 0.301*"system" + -0.288*"graph" + -0.274*"a" + -0.274*"survey" + 0.268*"management" + 0.262*"interface" + 0.208*"human" + 0.189*"engineering" 
0.282*"trees" + 0.267*"the" + 0.236*"in" + 0.236*"paths" + 0.236*"intersection" + -0.233*"time" + -0.233*"response" + 0.202*"generation" + 0.202*"unordered" + 0.202*"binary" 
-0.247*"generation" + -0.247*"unordered" + -0.247*"random" + -0.247*"binary" + 0.219*"minors" + -0.214*"the" + -0.214*"to" + -0.214*"error" + -0.214*"perceived" + -0.214*"relation" 
0.333*"machine" + 0.333*"for" + 0.333*"lab" + 0.333*"abc" + 0.333*"applications" + 0.258*"computer" + -0.214*"system" + -0.194*"eps" + -0.191*"and" + -0.188*"testing" 
+0

非常感謝您抽出時間來解決這個問題!我們現在很好... – aeupinhere 2013-03-12 02:58:46

0

它看起來醜陋,但這樣做的工作(只是一個純粹的基於字符串的方法):

#x = lsi.show_topics() 
x = '-0.804*"(5, 1)" + -0.246*"(856, 1)" + -0.227*"(145, 1)"' 
y = [(j.split("*")[0], (j.split("*")[1].split(",")[0].lstrip('"('), j.split("*")[1].split(",")[1].strip().rstrip(')"'))) for j in [i for i in x.strip().split(" + ")]] 

for i in y: 
    print y 

以上輸出:

('-0.804', ('5', '1')) 
('-0.246', ('856', '1')) 
('-0.227', ('145', '1')) 

如果沒有,你可以嘗試lsi.print_topic(我),而不是lsi.show_topics()

for i in range(len(lsi.show_topics())): 
    print lsi.print_topic(i) 
+0

嘿@ 2er0。非常感謝你回答這個問題。在你的上面的答案中,當我得到實際的主題詞時,我得到的數字是例如「(5,1)」。任何想法,爲什麼這是? – aeupinhere 2013-03-08 13:52:03

+0

您可以打印完整的代碼,並顯示您加載爲「語料庫」的文檔。它認爲這是因爲你只是把一個矢量當作一個語料庫而不是單詞。 – alvas 2013-03-08 16:21:53

+0

我有一個直覺,你的語料庫看起來像這樣: '[(0,1),(2,2),(3,1),(4,1)]'沒有一個字典,看起來像[(0 ,'狗'),(2,'the'),(3,'ate'),(4,'cat')] – alvas 2013-03-12 02:31:17