LSI mit gensim in python
Ich bin mit Python-gensim Bibliothek zu tun, latent semantic indexing. Ich habe die tutorials auf der website, und es funktioniert ziemlich gut. Jetzt versuche ich es zu ändern ein bisschen; ich will führen Sie das lsi-Modell jedes mal, wenn ein Dokument Hinzugefügt wird.
Hier ist mein code:
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 ist die Funktion, die ich schrieb, gibt den Inhalt einer website als Zeichenfolge. Wieder, es funktioniert, wenn ich warten, bis ich alle Dokumente, bevor Sie tfidf und lsi, aber das ist nicht das, was ich will. Ich will es tun, auf jeder iteration. Leider bekomme ich diese Fehlermeldung:
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
In der Regel der Fehler erscheint auf dem zweiten Dokument. Ich glaube, ich verstehe, was es mir zu sagen (die dictionary-Indizes, die sind schlecht), ich kann einfach nicht herausfinden, WARUM. Ich habe versucht viele verschiedene Dinge, und nichts scheint zu funktionieren. Weiß jemand was Los ist???
Dank!
- Hallo Jeff, ich bin mit gensim, um meine eigene LSA-Modell. Zuerst möchte ich dich Fragen, LSA-Modell dasselbe wie ein LSI-Modell? zweitens, ich bin versucht, gensim-Paket, aber ich bin nicht zu verstehen, wie, um fortzufahren. Ich bin zufällig läuft test_similarities.py und lsimodel.py. aber ich sehe nicht die Ausgabe lsimodel.
- Ja, LSA ist die gleiche wie LSI. Sorry, ich kann nicht viel helfen, ich habe nicht berührt gensim in ein paar Jahren, sieht es aus wie es einige tutorials auf Google-id dort beginnen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies war ein bug in gensim, wo der reverse-id->Wort-Zuordnung wird zwischengespeichert, aber der cache nicht aktualisiert nachdem
addDocuments()
.Es wurde behoben, das Begehen im Jahr 2011: https://github.com/piskvorky/gensim/commit/b88225cfda8570557d3c72b0820fefb48064a049 .
OK, also ich habe eine Lösung gefunden, wenn auch nicht optimal.
Wenn Sie ein Wörterbuch mit
corpora.Dictionary
und dann sofort hinzufügen, Dokumente mitdictionary.addDocuments
funktioniert alles einwandfrei.Aber, wenn Sie das Wörterbuch zu verwenden zwischen diese beiden Aufrufe (durch den Aufruf
dictionary.doc2bow
oder befestigen Sie Ihre Wörterbuch, um einen lsi-Modell mitid2word
), dann ist dein Wörterbuch ist "gefroren" und kann nicht aktualisiert werden. Sie können rufen Siedictionary.addDocuments
und es wird sagen Sie es aktualisiert, und es wird Ihnen sogar sagen, wie groß das neue Wörterbuch ist, z.B.:Aber, wenn Sie auf die neuen indices erhalten Sie eine Fehlermeldung. Ich bin mir nicht sicher, ob das ein bug ist oder ob dies beabsichtigt (warum auch immer), aber zumindest die Tatsache, dass gensim Berichte erfolgreichen hinzufügen des Dokuments das Wörterbuch ist sicherlich ein bug.
Zuerst habe ich versucht, dass alle Wörterbuch-Aufrufe in eigene Funktionen, wo nur die lokale Kopie des Wörterbuchs sollte geändert werden. Gut, es bricht immer noch. Dies ist Bizarr für mich, und ich habe keine Ahnung, warum.
Mein Nächster Schritt war, zu versuchen, die übergabe eines kopieren Wörterbuch, mit
copy.copy
. Das funktioniert auch, aber wird natürlich ein wenig mehr Aufwand. Jedoch, es wird Ihnen erlauben, um eine fehlerfreie Kopie Ihres Korpus und Wörterbuch. Der größte Nachteil hier, aber, für mich, war, dass diese Lösung nicht erlauben, mich zu entfernen von Wörtern, die sich nur einmal im Korpus mitfilterTokens
, denn das würde bedeuten, ändern Sie das Wörterbuch.Meine andere Lösung ist, einfach neu erstellen alles (corpus, das Wörterbuch, das lsi-und tfidf-Modelle), die bei jeder iteration. Mit meinem kleinen Beispiel-dataset, das gibt mir etwas bessere Ergebnisse, ist aber nicht skalierbar auf sehr große Datenmengen, ohne dass Probleme mit dem Speicher. Noch, für jetzt das ist, was ich Tue.
Wenn jeder erfahrene gensim-Nutzer haben eine bessere (und mehr Gedächtnis-freundlich) - Lösung, so dass ich nicht laufen in Probleme mit größeren Datensätzen, lassen Sie es mich bitte wissen!
In doc2bow, können Sie allow_update = True und es wird automatisch aktualisieren Sie Ihr Wörterbuch mit jeder iteration doc2bow
http://radimrehurek.com/gensim/corpora/dictionary.html