Как использовать word2vec для вычисления расстояния подобия, давая 2 слова



Word2vec-это инструмент с открытым исходным кодом для вычисления расстояния между словами, предоставляемый Google.It может использоваться путем ввода слова и вывода ранжированных списков слов в соответствии с подобием. например



Вход:



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 слова. Если я дам "Франция" и "Испания", как я могу получить оценку 0.678515, не читая весь список слов, давая только "Франция".
489   4  

4 ответов:

Gensim имеет Python-реализацию Word2Vec, которая предоставляет встроенную утилиту для поиска сходства между двумя словами, заданными в качестве входных данных пользователем. Вы можете обратиться к следующему:

  1. вступление: http://radimrehurek.com/gensim/models/word2vec.html
  2. учебное пособие: http://radimrehurek.com/2014/02/word2vec-tutorial/

Синтаксис в Python для поиска сходства между двумя словами выглядит следующим образом:

>> from gensim.models import Word2Vec
>> model = Word2Vec.load(path/to/your/model)
>> model.similarity('france', 'spain')

Как вы знаете, word2vec может представлять слово в виде математического вектора. Таким образом, как только вы обучите модель, вы можете получить векторы слов spain и france и вычислить косинусное расстояние (точечное произведение).

Простой способ сделать это-использоватьэту Python-оболочку 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']))

Я просто наткнулся на это, когда искал, как это сделать, изменив исходное расстояние.версия c, а не с помощью другой библиотеки, такой как gensim.

Я не нашел ответа, поэтому я провел некоторые исследования и делюсь ими здесь для других, которые также хотят знать, как это сделать в первоначальной реализации.

Просмотрев источник C, вы обнаружите, что " bi " - это массив индексов. Если вы укажете два слова, индекс word1 будет в bi[0], а индекс word2 будет будьте в bi[1].

Модель 'M' представляет собой массив векторов. Каждое слово представляется в виде вектора с размерностью "размер".

Используя эти два индекса и модель векторов, найдите их и вычислите косинусное расстояние (которое совпадает с произведением точек) следующим образом:
dist = 0;
for (a = 0; a < size; a++) {
    dist += M[a + bi[0] * size] * M[a + bi[1] * size];
}

После этого значение 'dist' является косинусным подобием между двумя словами.

Я разработал код, который поможет вычислить косинусное сходство для 2 предложений / SKU с помощью gensim. Код можно найти здесь https://github.com/aviralmathur/Word2Vec

Код использует данные для конкурса Kaggle на Crowdflower

Он был разработан с использованием кода для учебника Kaggle по Word2Vec, доступного здесь https://www.kaggle.com/c/word2vec-nlp-tutorial

Надеюсь, это поможет

Comments

    Ничего не найдено.