web-dev-qa-db-fra.com

Comment utiliser Word2vec pour calculer la distance de similitude en donnant 2 mots?

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".

32
zhfkt

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:

  1. Intro: http://radimrehurek.com/gensim/models/Word2vec.html
  2. Tutoriel: http://radimrehurek.com/2014/02/Word2vec-tutorial/

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')
33
Satarupa Guha

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']))
29
phyrox

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.

4
binarymax