Word2vec est un outil open source pour calculer la distance des mots fournie par Google. Il peut être utilisé en entrant un mot et en sortie les listes de mots classés selon la similitude. Par exemple.
Contribution:
france
Sortie:
Word Cosine distance
spain 0.678515
belgium 0.665923
netherlands 0.652428
italy 0.633130
switzerland 0.622323
luxembourg 0.610033
portugal 0.577154
russia 0.571507
germany 0.563291
catalonia 0.534176
Cependant, ce que je dois faire, c'est calculer la distance de similitude en donnant 2 mots. Si je donne "france" et "espagne", comment puis-je obtenir le score de 0,678515 sans lire la liste complète des mots en donnant simplement "france".
gensim a une implémentation Python de Word2Vec qui fournit un utilitaire intégré pour trouver la similitude entre deux mots donnés en entrée par l'utilisateur. Vous pouvez vous référer à ce qui suit:
La syntaxe de Python pour trouver la similitude entre deux mots se présente comme suit:
>> from gensim.models import Word2Vec
>> model = Word2Vec.load(path/to/your/model)
>> model.similarity('france', 'spain')
Comme vous le savez Word2vec
peut représenter un mot comme vecteur mathématique. Ainsi, une fois le modèle formé, vous pouvez obtenir les vecteurs des mots spain
et france
et calculer la distance cosinusoïdale (produit scalaire).
Un moyen simple de le faire est d'utiliser this Python de Word2vec. Vous pouvez obtenir le vecteur en utilisant ceci:
>>> model['computer'] # raw numpy vector of a Word
array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
Pour calculer les distances entre deux mots, vous pouvez procéder comme suit:
>>> import numpy
>>> cosine_similarity = numpy.dot(model['spain'], model['france'])/(numpy.linalg.norm(model['spain'])* numpy.linalg.norm(model['france']))
Je suis juste tombé sur cela en cherchant comment faire en modifiant la version originale de distance.c, pas en utilisant une autre bibliothèque comme gensim.
Je n'ai pas trouvé de réponse, j'ai donc fait des recherches et je la partage ici pour d'autres qui veulent également savoir comment le faire dans la mise en œuvre d'origine.
Après avoir parcouru la source C, vous constaterez que "bi" est un tableau d'index. Si vous fournissez deux mots, l'index de Word1 sera en bi [0] et l'index de Word2 sera en bi [1].
Le modèle "M" est un tableau de vecteurs. Chaque mot est représenté comme un vecteur avec une dimension "taille".
En utilisant ces deux index et le modèle de vecteurs, recherchez-les et calculez la distance cosinusoïdale (qui est la même que le produit scalaire) comme ceci:
dist = 0;
for (a = 0; a < size; a++) {
dist += M[a + bi[0] * size] * M[a + bi[1] * size];
}
après cela, la valeur "dist" est la similitude cosinus entre les deux mots.