gensim le plus_similaire au positif et au négatif, comment ça marche?

Nov 29 2020

Je lisais cette réponse qui dit à propos de Gensim most_similar:

il effectue l'arithmétique vectorielle: addition des vecteurs positifs, soustraction du négatif, puis de cette position résultante, énumérant les vecteurs connus les plus proches de cet angle.

Mais quand je l'ai testé, ce n'est pas le cas. J'ai formé un Word2Vec avec un "text8"jeu de données Gensim et testé ces deux:

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),...]

Ce ne sont clairement pas les mêmes. même le score de reine dans le premier est 0.713et sur le second 0.732qui ne sont pas les mêmes.

Alors je pose à nouveau la question, comment fonctionne Gensim most_similar? pourquoi le résultat des deux ci-dessus est-il différent?

Réponses

1 gojomo Nov 29 2020 at 20:55

L'ajout et la soustraction ne sont pas tout ce qu'il fait; pour une description exacte, vous devriez regarder le code source:

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

Vous y verrez que l'addition et la soustraction se font sur la version normée unitaire de chaque vecteur, via l' get_vector(key, use_norm=True)accesseur.

Si vous modifiez votre utilisation de model[key]to model.get_vector(key, use_norm=True), vous devriez voir que votre calcul en dehors de la méthode du vecteur cible donne les mêmes résultats que si vous laissez la méthode combiner les vecteurs positiveet negative.