Ich benutze Gensim für einige Themenmodelle und bin zu dem Punkt gelangt, wo ich Ähnlichkeitsabfragen unter Verwendung der LSI- und tf-idf-Modelle mache. Ich bekomme den Satz von IDs und Ähnlichkeiten zurück, z. %Code%.
Wie bekomme ich das Textdokument, das sich auf die ID bezieht, in diesem Fall 299501?
Ich habe die Dokumente für Korpus, Wörterbuch, Index und das Modell angeschaut und kann es nicht finden.
Leider, soweit ich das beurteilen kann, müssen Sie am Anfang der Analyse wissend beginnen, dass Sie Dokumente mit den IDs abrufen möchten. Dies bedeutet, dass Sie ein eigenes Mapping zwischen IDs und den Originaldokumenten erstellen müssen und sicherstellen müssen, dass die IDs gensim
während des gesamten Prozesses beibehalten werden. Wie dem auch sei, ich glaube nicht, dass gensim
ein solches Mapping praktisch hält.
Ich könnte definitiv falsch liegen, und tatsächlich würde ich es lieben, wenn mir jemand sagt, dass es einen einfacheren Weg gibt, aber ich habe viele Stunden damit verbracht, zu vermeiden, ein gigantisches LSI-Modell auf einem wikipedia-Korpus zu verwerten. Schließlich musste ich eine Liste von IDs und den zugehörigen Dokumenten mitnehmen, damit ich die Ausgabe von gensim
verwenden konnte.
Ich habe gerade den gleichen Prozess durchlaufen und den gleichen Punkt erreicht, als hätte ich eine "Sim" mit einer Dokument-ID, aber ich wollte meinen ursprünglichen "Artikel-Code" haben. Obwohl es nicht vollständig bereitgestellt wird, gibt es eine Metadaten-Funktion in der Gensim-Bibliothek und Beispiele, die helfen können. Ich beantworte dies, während ich mich daran erinnere, was ich zu tun hatte, falls es zukünftigen Besuchern dieser alten Frage hilft.
Siehe gensim.corpora.textcorpus.TextCorpus#get_texts
, die entweder den Text oder ein einfaches einzelnes Metadatenelement "linenumber" zurückgibt, wenn das Flag metadata
aktiviert ist:
Ich hatte bereits ein benutzerdefiniertes Skript "make_corpus.py" und ein Testklassifizierungsskript implementiert, das Ähnlichkeit verwendet, um verwandte Dokumente in einem Suchdokument zu finden. Die Änderungen, die ich vorgenommen habe, um die Metadaten von diesem Punkt zu verwenden, waren wie folgt:
Im Skript make_corpus habe ich Metadaten im Konstruktor für meine TextCorpus-Tochterklasse aktiviert:
%Vor%Ich musste auch die Metadaten serialisieren, da ich nicht sofort nach der Korpusgenerierung die Verarbeitung durchführe (wie einige der Beispiele), also müssen Sie auch die Metadaten im Serialisierungsschritt aktivieren:
%Vor% Das macht gensim.matutils.MmWriter#write_corpus
speichert eine “xxx_bow.mm.metadata.cpickle”
Datei mit Ihren Corpus .mm
Dateien.
Um weitere Elemente in die Metadaten einzufügen, müssen Sie einige Elemente in einer TextCorpus-Tochterklasse implementieren und überschreiben. Ich hatte bereits eine aus der WikiCorpus Beispielklasse erstellt, da ich mein eigenes Korpus zum Lesen habe.
Der Konstruktor muss das Metadaten-Flag erhalten, z. B .:
%Vor%Ich lese tatsächlich von einem JSON-Korpus aus, also hatte ich bereits einen benutzerdefinierten Parser geschrieben. Meine Artikel haben eine "Code" -Eigenschaft, die meine kanonische Dokumenten-ID ist. Ich möchte auch den "Titel" speichern, und der Dokumentkörper befindet sich in der Eigenschaft "Text". (Dies ersetzt das XML-Parsing im Wiki-Beispiel).
%Vor% Dies wird innerhalb des überschriebenen get_texts
aufgerufen (in der Elternklasse, die es erwähnt, müssen Sie dies überschreiben, um benutzerdefinierte Metadaten zu verwenden). Zusammengefasst:
Damit sollten Sie Metadaten neben Ihren corpus.mm-Dateien speichern. Wenn Sie dies in einem späteren Skript erneut lesen möchten, müssen Sie die Beißdatei erneut einlesen. Es scheint keine integrierten Methoden zum erneuten Lesen der Metadaten zu geben. Glücklicherweise ist es nur ein Dictionary, das von der von Gensim generierten Dokument-ID indiziert wird, so dass es einfach zu laden und zu verwenden ist. ( Siehe wiki-sim-search )
z.B. In meinem Testklassifizierer habe ich nur zwei Dinge hinzugefügt: metadata = pickle.load()
und metadata[docID]
, um endlich den Originalartikel zu finden.
Ich weiß, das liefert nicht den ursprünglichen Text , wie Sie gefragt haben (ich brauche es nicht selbst), aber Sie könnten den Text sehr einfach zu den "Metadaten" hinzufügen (obwohl das eher dehnt die Definition von Metadaten aus und könnte sehr groß sein!). Ich nehme an, Gensim geht davon aus, dass Sie bereits eine Datenbank mit Ihren Originaldokumenten haben, und daher wäre es nicht in Geltung. Ich denke jedoch, dass es eine Zuordnung zwischen den Gensim-generierten IDs und den ursprünglichen Dokument-IDs geben muss, die das Metadaten-Feature recht gut erfüllt.