Passende Worte und Vektoren im gensim Word2Vec Modell
Hatte ich die gensim Word2Vec Umsetzung berechnen Sie einige word-Einbettungen für mich. Alles ging ganz fantastisch, wie weit ich es sagen kann; jetzt bin ich clustering von Wort-Vektoren erstellt, in der Hoffnung zu Holen einige der semantischen Gruppierungen.
Als nächsten Schritt möchte ich auf die Worte (anstatt der Vektoren), die in jedem cluster. I. e. wenn ich den Vektor von Einbettungen [x, y, z]
ich möchte, um herauszufinden, die tatsächliche Wort dieser Vektor repräsentiert. Ich kann die Wörter/Vokabeln Elemente durch Aufruf model.vocab
und das Wort Vektoren durch model.syn0
. Aber ich konnte nicht finden, eine Stelle, wo diese sind explizit aufeinander abgestimmt sind.
Diese war komplizierter, als ich es erwartet hatte und ich das Gefühl habe, ich könnte fehlt der offensichtliche Weg, es zu tun. Jede Hilfe ist willkommen!
Problem:
Match Worten zum einbetten von Vektoren erstellt von Word2Vec ()
-- wie mache ich es?
Mein Ansatz:
Nach der Erstellung des Modells (code unten*), würde ich nun gerne entsprechen die Indizes zugewiesen, um jedes Wort (während der build_vocab()
phase), um die Vektor-matrix ausgegeben, da model.syn0
.
So
for i in range (0, newmod.syn0.shape[0]): #iterate over all words in model
print i
word= [k for k in newmod.vocab if newmod.vocab[k].__dict__['index']==i] #get the word out of the internal dicationary by its index
wordvector= newmod.syn0[i] #get the vector with the corresponding index
print wordvector == newmod[word] #testing: compare result of looking up the word in the model -- this prints True
- Gibt es einen besseren Weg, dies zu tun, z.B. durch die Fütterung der Vektor in das Modell entspricht dem Wort?
- Tut dies sogar mir die richtigen Ergebnisse?
*Mein code zum erstellen des word-Vektoren:
model = Word2Vec(size=1000, min_count=5, workers=4, sg=1)
model.build_vocab(sentencefeeder(folderlist)) #sentencefeeder puts out sentences as lists of strings
model.save("newmodel")
Fand ich diese Frage, die ist ähnlich, hat aber nicht wirklich beantwortet worden.
InformationsquelleAutor patrick | 2016-07-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe Suche für eine lange Zeit, um die Zuordnung zwischen den syn0 matrix und der Wortschatz... hier ist die Antwort : verwenden Sie
model.index2word
die einfach die Liste der Wörter in die richtige Reihenfolge !Dies ist nicht in der offiziellen Dokumentation (warum ?) aber es kann man direkt im source-code : https://github.com/RaRe-Technologies/gensim/blob/3b9bb59dac0d55a1cd6ca8f984cead38b9cb0860/gensim/models/word2vec.py#L441
InformationsquelleAutor Arcyno
Wenn alles, was Sie tun möchten, ist Karte ein Wort zu einem Vektor, können Sie einfach die
[]
Betreiber, z.B.model["hello"]
geben Sie den Vektor entsprechend Hallo.Wenn Sie benötigen, um wieder ein Wort aus einer Vektor-du könntest in einer Schleife durch Ihre Liste von Vektoren und überprüfen Sie für eine übereinstimmung, wie Sie vorschlagen. Dies ist jedoch ineffizient und nicht pythonic. Eine komfortable Lösung ist die Verwendung des
similar_by_vector
Methode der word2vec Modell, wie diese:welche Ausgänge:
wo die Zahl steht für die ähnlichkeit.
Diese Methode ist jedoch noch ineffizienter, als es noch scan alle word-Vektoren, um die Suche für die meisten ähnlich. Die beste Lösung, um Ihr problem zu einen Weg finden, zu verfolgen Ihre Vektoren während der clustering-Prozess, so dass Sie nicht haben, verlassen sich auf teure reverse-mappings.
Dies ist möglich, und ich habe meinen Beitrag aktualisiert, um zu zeigen, wie. Aber Sie werden viel besser aus, wenn Sie einen Weg finden können, um zu verfolgen Ihre Vektoren, wie die Umkehrabbildung ist teuer.
InformationsquelleAutor bpachev
Also habe ich einen einfachen Weg gefunden, um dies zu tun, wo
nmodel
ist der name Ihres Modells.Dies ist auf der Grundlage der gensim-code. Für ältere Versionen von gensim, die Sie brauchen könnten, um die drop
wv
nach dem Modell.InformationsquelleAutor patrick
Als @bpachev erwähnt, gensim ist eine Möglichkeit, die Suche durch einen Vektor, nämlich
similar_by_vector
.Es jedoch implementiert eine brute-force-lineare Suche, d.h. berechnet die Cosinus-ähnlichkeit zwischen gegebenen Vektoren und Vektoren, die alle Wörter im Vokabular, und gibt die top-Nachbarn. Eine Alternative option, wie erwähnt, in anderen Antwort ist die Verwendung eine Ungefähre nearest neighbour search-Algorithmus wie FLANN.
Teilen eine Zusammenfassung der Demonstration der gleiche:
https://gist.github.com/kampta/139f710ca91ed5fabaf9e6616d2c762b
InformationsquelleAutor kampta