gensim le plus_similaire au positif et au négatif, comment ça marche?
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.713
et sur le second 0.732
qui 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
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 positive
et negative
.