Solución:
gensim tiene una implementación Python de Word2Vec que proporciona una utilidad incorporada para encontrar similitudes entre dos palabras dadas como entrada por el usuario. Puede consultar lo siguiente:
- Introducción: http://radimrehurek.com/gensim/models/word2vec.html
- Tutorial: http://radimrehurek.com/2014/02/word2vec-tutorial/
La sintaxis en Python para encontrar similitudes entre dos palabras es la siguiente:
>> from gensim.models import Word2Vec
>> model = Word2Vec.load(path/to/your/model)
>> model.similarity('france', 'spain')
Como tú sabes word2vec
puede representar una palabra como un vector matemático. Entonces, una vez que entrenes el modelo, puedes obtener los vectores de las palabras spain
y france
y calcular la distancia del coseno (producto escalar).
Una forma fácil de hacer esto es utilizar este contenedor de Python de word2vec. Puede obtener el vector usando esto:
>>> model['computer'] # raw numpy vector of a word
array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
Para calcular las distancias entre dos palabras, puede hacer lo siguiente:
>>> import numpy
>>> cosine_similarity = numpy.dot(model['spain'], model['france'])/(numpy.linalg.norm(model['spain'])* numpy.linalg.norm(model['france']))
Me encontré con esto mientras buscaba cómo hacer esto modificando la versión original de distance.c, no usando otra biblioteca como gensim.
No encontré una respuesta, así que investigué un poco y la comparto aquí para otros que también quieran saber cómo hacerlo en la implementación original.
Después de mirar a través de la fuente de C, encontrará que ‘bi’ es una matriz de índices. Si proporciona dos palabras, el índice de word1 estará en bi[0] y el índice de word2 estará en bi[1].
El modelo ‘M’ es una matriz de vectores. Cada palabra se representa como un vector con dimensión ‘tamaño’.
Usando estos dos índices y el modelo de vectores, búsquelos y calcule la distancia del coseno (que es lo mismo que el producto escalar) de la siguiente manera:
dist = 0;
for (a = 0; a < size; a++) {
dist += M[a + bi[0] * size] * M[a + bi[1] * size];
}
después de que esto se complete, el valor ‘dist’ es la similitud de coseno entre las dos palabras.