2011-06-09 100 views
4

我使用Python的gensim庫來執行潛在的語義索引。我遵循網站上的教程,它運行得非常好。現在我試圖修改它一下;每次添加文檔時,我都想運行lsi模型。在Python中使用gensim的LSI

這裏是我的代碼:

stoplist = set('for a of the and to in'.split()) 
num_factors=3 
corpus = [] 

for i in range(len(urls)): 
print "Importing", urls[i] 
doc = getwords(urls[i]) 
cleandoc = [word for word in doc.lower().split() if word not in stoplist] 
if i == 0: 
    dictionary = corpora.Dictionary([cleandoc]) 
else: 
    dictionary.addDocuments([cleandoc]) 
newVec = dictionary.doc2bow(cleandoc) 
corpus.append(newVec) 
tfidf = models.TfidfModel(corpus) 
corpus_tfidf = tfidf[corpus] 
lsi = models.LsiModel(corpus_tfidf, numTopics=num_factors, id2word=dictionary) 
corpus_lsi = lsi[corpus_tfidf] 

geturls功能是我寫的,它返回一個網站作爲一個字符串的內容。再說一遍,如果我等到我在做tfidf和lsi之前處理所有的文件,它就會起作用,但那不是我想要的。我想在每次迭代時都這樣做。不幸的是,我得到這個錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "streamlsa.py", line 51, in <module> 
    lsi = models.LsiModel(corpus_tfidf, numTopics=num_factors, id2word=dictionary) 
    File "/Library/Python/2.6/site-packages/gensim-0.7.8-py2.6.egg/gensim/models/lsimodel.py", line 303, in __init__ 
    self.addDocuments(corpus) 
    File "/Library/Python/2.6/site-packages/gensim-0.7.8-py2.6.egg/gensim/models/lsimodel.py", line 365, in addDocuments 
    self.printTopics(5) # TODO see if printDebug works and remove one of these.. 
    File "/Library/Python/2.6/site-packages/gensim-0.7.8-py2.6.egg/gensim/models/lsimodel.py", line 441, in printTopics 
    self.printTopic(i, topN = numWords))) 
    File "/Library/Python/2.6/site-packages/gensim-0.7.8-py2.6.egg/gensim/models/lsimodel.py", line 433, in printTopic 
    return ' + '.join(['%.3f*"%s"' % (1.0 * c[val]/norm, self.id2word[val]) for val in most]) 
    File "/Library/Python/2.6/site-packages/gensim-0.7.8-py2.6.egg/gensim/corpora/dictionary.py", line 52, in __getitem__ 
    return self.id2token[tokenid] # will throw for non-existent ids 
KeyError: 1248 

通常在第二個文檔上彈出錯誤。我想我明白它告訴我的是什麼(字典索引是壞的),我只是不明白爲什麼。我嘗試了很多不同的東西,似乎沒有任何工作。有誰知道發生了什麼事?

謝謝!

+0

您好傑夫,我使用gensim創建自己的LSA模型。首先我想問的是LSA型號與LSI型號相同嗎?其次,我試圖使用gensim包,但我不理解如何繼續。我隨機運行test_similarities.py和lsimodel.py。但我沒有看到lsimodel的任何輸出。 – Jana 2017-01-06 13:33:27

+0

是的,LSA和LSI一樣。對不起,我沒有多少幫助,我幾年沒有碰到gensim,看起來有一些關於Google id start的教程。 – Jeff 2017-01-06 15:07:31

回答

1

好吧,所以我找到了一個解決方案,雖然不是最優的。

如果你用corpora.Dictionary製作字典,然後立即添加文檔dictionary.addDocuments,一切工作正常。

但是,如果你使用這兩個調用之間的字典(通過調用dictionary.doc2bow或附加你的字典到LSI模型id2word),那麼你的字典是「凍結」,不能被更新。您可以撥打dictionary.addDocuments,它會告訴你它的更新,它甚至會告訴你新的字典有多大,如:

INFO:dictionary:built Dictionary(6627 unique tokens) from 8 documents (total 24054 corpus positions) 

但是當你引用任何新的指數,你會得到一個錯誤。我不確定這是否是一個錯誤,或者這是否意味着(無論出於何種原因),但至少事實上,gensim 報告成功將文檔添加到字典中肯定是一個錯誤。

首先,我嘗試在單獨的函數中放置任何字典調用,其中只有本地副本應該被修改。那麼,它仍然打破。這對我來說很奇怪,我不知道爲什麼。

我的下一步是嘗試通過複製字典,使用copy.copy。這工作,但顯然會使用更多的開銷。但是,它將允許您維護您的語料庫和詞典的工作副本。對我來說,這裏最大的缺點是,這個解決方案不允許我使用filterTokens刪除在語料庫中只出現過一次的單詞,因爲那樣會需要修改字典。

我的另一個解決方案是在每次迭代時重建所有內容(語料庫,字典,lsi和tfidf模型)。用我的小樣本數據集,這給了我稍微更好的結果,但不能擴展到非常大的數據集,而不會導致內存問題。儘管如此,這是我正在做的。

如果任何有經驗的gensim用戶擁有更好的(和更多內存友好的)解決方案,以便我不會遇到更大數據集的問題,請讓我知道!