Comment utiliser word2vec pour calculer la distance de similarité en donnant 2 mots
Word2vec est un outil open source pour calculer la distance de mots fournis par Google.Il peut être utilisé en saisissant un mot et en produisant les listes de mots classés selon la similitude. par exemple,
Entrée:
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 est de calculer la distance de similarité en donnant 2 mots. Si je donne la "france" et l' "Espagne", Comment puis-je obtenir la note de 0,678515 sans lire toute la liste des mots en donnant juste "france".
4 réponses
gensim a une implémentation Python de Word2Vec qui fournit un utilitaire intégré pour trouver la similarité entre deux mots donnés en entrée par l'utilisateur. Vous pouvez consulter les pages suivantes:
- Intro:http://radimrehurek.com/gensim/models/word2vec.html
- Tutoriel: http://radimrehurek.com/2014/02/word2vec-tutorial/
la syntaxe en Python pour trouver la similitude entre deux mots va comme ceci:
>> 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 un vecteur mathématique. Donc, une fois que vous vous entraînez le modèle, vous pouvez obtenir les vecteurs des mots spain
et france
et calculer la distance cosinus (produit dot).
un moyen facile de faire ceci est d'utiliser Python wrapper 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 faire ce qui suit:
>>> import numpy
>>> cosine_similarity = numpy.dot(model['spain'], model['france'])/(numpy.linalg.norm(model['spain'])* numpy.linalg.norm(model['france']))
j'ai juste trébuché sur ce tout en cherchant comment faire cela en modifiant la distance d'origine.version c, pas en utilisant une autre bibliothèque comme gensim.
Je n'ai pas trouvé de réponse donc j'ai fait quelques recherches, et je les partage ici pour d'autres qui veulent aussi savoir comment le faire dans la mise en œuvre originale.
après avoir regardé à travers la source C, vous verrez que ' bi ' est un tableau d'index. Si vous fournissez deux mots, l'index pour 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 la dimension "taille".
en utilisant ces deux index et le modèle des vecteurs, cherchez - les et calculez la distance cosinus (qui est la même que le produit de point) 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.
j'ai développé un code pour aider à calculer la similarité cosinus pour 2 phrases / SKUs en utilisant gensim. Le code se trouve ici https://github.com/aviralmathur/Word2Vec
Le code est d'utiliser les données pour Kaggle de la concurrence sur Crowdflower
il a été développé en utilisant le code pour le tutoriel Kaggle sur Word2Vec disponible ici https://www.kaggle.com/c/word2vec-nlp-tutorial
j'espère que cela aide