paper - word2vec medium
Cómo usar word2vec para calcular la distancia de similitud al dar 2 palabras (4)
Word2vec es una herramienta de código abierto para calcular la distancia de palabras proporcionada por Google. Se puede usar ingresando una palabra y generando las listas de palabras clasificadas según la similitud. p.ej
Entrada:
france
Salida:
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
Sin embargo, lo que necesito hacer es calcular la distancia de similitud dando 2 palabras. Si doy ''francia'' y ''españa'', ¿cómo puedo obtener el puntaje 0.678515 sin leer toda la lista de palabras con solo ''francia''?
Como saben, word2vec
puede representar una palabra como un vector matemático. Así que una vez que entrenas el modelo, puedes obtener los vectores de las palabras spain
y france
y calcular la distancia del coseno (producto puntual).
Una forma fácil de hacer esto es usar this envoltorio Python de word2vec. Puedes 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'']))
He desarrollado un código para ayudar a calcular la similitud de coseno para 2 oraciones / SKU utilizando gensim. El código se puede encontrar aquí https://github.com/aviralmathur/Word2Vec
El código está usando datos para la competencia Kaggle en Crowdflower
Se ha desarrollado utilizando el Tutorial de Code for Kaggle en Word2Vec disponible aquí https://www.kaggle.com/c/word2vec-nlp-tutorial
espero que esto ayude
Me topé con esto mientras buscaba cómo hacerlo modificando la versión original de distance.c, no utilizando otra biblioteca como gensim.
No encontré una respuesta, así que investigué un poco y lo estoy compartiendo 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 para 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 la misma que el producto de puntos) de esta 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 completa, el valor ''dist'' es la similitud del coseno entre las dos palabras.
gensim tiene una implementación Python de Word2Vec que proporciona una utilidad incorporada para encontrar similitudes entre dos palabras dadas por el usuario. Puede referirse a 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 similitud entre dos palabras es la siguiente:
>> from gensim.models import Word2Vec
>> model = Word2Vec.load(path/to/your/model)
>> model.similarity(''france'', ''spain'')