Как использовать word2vec для вычисления расстояния подобия, давая 2 слова
Word2vec - это инструмент с открытым исходным кодом для вычисления расстояния слов, предоставляемого Google. Его можно использовать, вводя слово и выводя список ранжированных слов в соответствии с подобием. например.
Input:
france
Вывод:
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
Однако, мне нужно сделать, чтобы вычислить расстояние подобия, указав 2 слова. Если я дам "france" и "spain", как я могу получить оценку 0.678515, не читая весь список слов, давая просто "france".
Ответы
Ответ 1
gensim имеет реализацию Python для Word2Vec, которая предоставляет встроенную утилиту для поиска сходства между двумя словами, указанными в качестве ввода пользователем. Вы можете обратиться к следующему:
Синтаксис в Python для нахождения сходства между двумя словами происходит следующим образом:
>> from gensim.models import Word2Vec
>> model = Word2Vec.load(path/to/your/model)
>> model.similarity('france', 'spain')
Ответ 2
Как вы знаете, word2vec
может представлять слово как математический вектор. Поэтому, как только вы тренируете модель, вы можете получить векторы слов spain
и france
и вычислить расстояние косинуса (точечный продукт).
Легкий способ сделать это - использовать this Python wrapper word2vec. Вы можете получить вектор, используя это:
>>> model['computer'] # raw numpy vector of a word
array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
Чтобы вычислить расстояния между двумя словами, вы можете сделать следующее:
>>> import numpy
>>> cosine_similarity = numpy.dot(model['spain'], model['france'])/(numpy.linalg.norm(model['spain'])* numpy.linalg.norm(model['france']))
Ответ 3
Я просто наткнулся на это, ища, как это сделать, изменив исходную версию distance.c, а не используя другую библиотеку, такую как gensim.
Я не нашел ответа, поэтому сделал некоторые исследования, и я поделился им здесь для других, которые также хотят знать, как это сделать в оригинальной реализации.
После просмотра источника C вы обнаружите, что "bi" - это массив индексов. Если вы укажете два слова, индекс для слова 1 будет в би [0], а индекс слова2 будет в би [1].
Модель "M" представляет собой массив векторов. Каждое слово представляется как вектор с размером "размер".
Используя эти два индекса и модель векторов, просмотрите их и вычислите расстояние косинуса (то же самое, что и точечный продукт), как это:
dist = 0;
for (a = 0; a < size; a++) {
dist += M[a + bi[0] * size] * M[a + bi[1] * size];
}
после этого завершается, значение "dist" - это совпадение косинусов между двумя словами.
Ответ 4
Я разработал код, который поможет с вычислением подобия косинуса для 2 предложений /SKU с использованием gensim. Код можно найти здесь
https://github.com/aviralmathur/Word2Vec
В коде используются данные для соревнования Kaggle на Crowdflower
Он был разработан с использованием кода для Kaggle Tutorial на Word2Vec, доступного здесь
https://www.kaggle.com/c/word2vec-nlp-tutorial
Я надеюсь, что это поможет