gensim most_similar mit positiv und negativ, wie funktioniert es?

Nov 29 2020

Ich habe diese Antwort gelesen , die über Gensim sagt most_similar:

Es führt eine Vektorarithmetik durch: Addieren der positiven Vektoren, Subtrahieren der negativen Vektoren und dann Auflisten der bekannten Vektoren, die diesem Winkel am nächsten liegen.

Aber als ich es getestet habe, ist das nicht der Fall. Ich habe einen Word2Vec mit Gensim- "text8"Datensatz trainiert und diese beiden getestet:

model.most_similar(positive=['woman', 'king'], negative=['man'])

>>> [('queen', 0.7131118178367615), ('prince', 0.6359186768531799),...]

model.wv.most_similar([model["king"] + model["woman"] - model["man"]])

>>> [('king', 0.84305739402771), ('queen', 0.7326322793960571),...]

Sie sind eindeutig nicht gleich. Sogar die Königin-Punktzahl in der ersten ist 0.713und in der zweiten, 0.732die nicht gleich sind.

Also stelle ich noch einmal die Frage: Wie funktioniert Gensim most_similar? Warum sind die Ergebnisse der beiden oben genannten unterschiedlich?

Antworten

1 gojomo Nov 29 2020 at 20:55

Das Addieren und Subtrahieren ist nicht alles , was es tut; Für eine genaue Beschreibung sollten Sie sich den Quellcode ansehen:

https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/models/keyedvectors.py#LC690:~:text=def%20most_similar,self%2C

Dort sehen Sie, dass die Addition und Subtraktion in der einheitennormierten Version jedes Vektors über den get_vector(key, use_norm=True)Accessor erfolgt.

Wenn Sie Ihre Verwendung von model[key]in ändern model.get_vector(key, use_norm=True), sollten Sie sehen, dass Ihre Berechnung des Zielvektors außerhalb der Methode die gleichen Ergebnisse liefert, als wenn die Methode die Vektoren positiveund kombiniert negative.