Как использовать 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

Я надеюсь, что это поможет