Какая операция скрывается за аналогией в Word2vec? - PullRequest
0 голосов
/ 17 сентября 2018

Согласно https://code.google.com/archive/p/word2vec/:

Недавно было показано, что векторы слов охватывают много лингвистических закономерности, например, вектор векторных операций («Париж») - vector ('France') + vector ('Italy') приводит к очень близко к вектору («Рим») и к вектору («король») - вектор («человек») + вектор ('женщина') близок к вектору ('королева') [3, 1]. Вы можете попробовать простая демонстрация, запустив demo-analogy.sh.

Итак, мы можем попробовать из прилагаемого демонстрационного скрипта:

+ ../bin/word-analogy ../data/text8-vector.bin
Enter three words (EXIT to break): paris france berlin

Word: paris  Position in vocabulary: 198365

Word: france  Position in vocabulary: 225534

Word: berlin  Position in vocabulary: 380477

                                              Word              Distance
------------------------------------------------------------------------
                                           germany      0.509434
                                          european      0.486505

Обратите внимание, что paris france berlin - подсказка для ввода, предложенная демоверсией. Проблема в том, что я не могу воспроизвести это поведение, если я открываю одни и те же векторы слов в Gensim и пытаюсь вычислить векторы самостоятельно. Например:

>>> word_vectors = KeyedVectors.load_word2vec_format(BIGDATA, binary=True)
>>> v = word_vectors['paris'] - word_vectors['france'] + word_vectors['berlin']
>>> word_vectors.most_similar(np.array([v]))
[('berlin', 0.7331711649894714), ('paris', 0.6669869422912598), ('kunst', 0.4056406617164612), ('inca', 0.4025722146034241), ('dubai', 0.3934606909751892), ('natalie_portman', 0.3909246325492859), ('joel', 0.3843030333518982), ('lil_kim', 0.3784593939781189), ('heidi', 0.3782389461994171), ('diy', 0.3767407238483429)]

Итак, что же на самом деле делает слово аналогия? Как мне это воспроизвести?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Вы должны четко понимать, какой именно набор слов-векторов вы используете: разные наборы будут по-разному справляться с заданиями аналогии.(Те, кто обучен крошечному набору данных text8, могут быть довольно слабыми; большой набор GoogleNews, выпущенный Google, вероятно, преуспеет, по крайней мере, при определенных условиях, таких как отбрасывание слов с низкой частотой.)

Выделать неправильную арифметику для аналогии, которую вы пытаетесь решить.Для аналогии "А - это В, как С - это?"часто записывается как:

A : B :: C : _?_

Вы начинаете с 'B', вычитаете 'A', затем добавляете 'C'.Итак, пример:

France : Paris :: Italy : _?_

... дает формулу в вашем выдержанном тексте:

wv('Paris') - wv('France') + wv('Italy`) = target_coordinates  # close-to wv('Rome')

И вместо этого решить:

Paris : France :: Berlin : _?_

Вы бы попробовали:

wv('France') - wv('Paris') + wv('Berlin') = target_coordinates

... тогда посмотрим, что ближе к target_coordinates.(Обратите внимание на разницу в порядке операций с вашей попыткой.)

Вы можете думать об этом как:

  1. начать с вектора страны («Франция»)
  2. вычесть (страна и столица) -вектор («Париж»).Это оставляет вас с промежуточным вектором, который, своего рода, «ноль» страны и «отрицательный» капитал.
  3. добавить еще один (страна и капитал) -вектор («Берлин»).Это оставляет вас с вектором результата, который, опять-таки, «одна» страна и «нулевой» капитал.

Обратите также внимание, что gensim most_similar() использует несколько положительных и отрицательных примеров слов, чтобы выполнить арифметику за вас.Так что вы можете просто сделать:

sims = word_vectors.most_similar(positive=['France', 'Berlin'], negative=['Paris'])
0 голосов
/ 17 сентября 2018

Это должно быть просто поэлементное сложение и вычитание векторов.И косинусное расстояние, чтобы найти самые похожие.Однако, если вы используете оригинальные вложения word2vec, между "paris" и "Paris" есть разница (строки не были опущены или лемматизированы).

Вы также можете попробовать:

v = word_vectors['France'] - word_vectors['Paris'] + word_vectors['Berlin']

или

v = word_vectors['Paris'] - word_vectors['France'] + word_vectors['Germany']

потому что вы должны сравнивать идентичные понятия (город - страна + страна -> другой город)

...