Python.Gensim Wrod2vec.Сходство слов - PullRequest
0 голосов
/ 08 февраля 2019

У меня проблема / вопрос с Word2Vec

Как я понимаю: давайте обучим модель на корпусе текста (по-моему, это корпус размером ~ 2 Гб)Давайте возьмем одну строку из этого текста и вычислим вектор этой строки (вектор строки = сумма векторов слов).Это будет что-товот так:

for w in words:
    coords += model[w]

Чем посчитаем длину этого вектора.Со стандартной библиотекой:

import numpy as np
vectorLen = np.linalg.norm(coords)

Зачем нам нужен Word2Vec?Да, для преобразования слов в векторы И контекстуальная близость (близкие слова, которые встречаются и слова, близкие по значению, имеют схожие координаты)!

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

Но на самом деле - значения этих векторов (до добавления слова (слов) и после) очень похожи!Более того - они практически одинаковы!Почему я получаю этот результат?Если я правильно понимаю, для строки координаты слов будут совершенно одинаковыми (контекстная близость), но новые слова будут иметь довольно разные координаты, и это должно повлиять на результат (длину вектора строки с новыми словами)!

Например, это настройки моей модели W2V:

#Word2Vec model

model = gensim.models.Word2Vec(
    sg=0,
    size=300,
    window=3,
    min_count=1,
    hs=0,
    negative=5,
    workers=10,
    alpha=0.025,
    min_alpha=0.025,
    sample=1e-3,
    iter=20
)

#prepare the model vocabulary
model.build_vocab(sentences, update=False)

#train model
model.train(sentences, epochs=model.iter, total_examples=model.corpus_count)

ИЛИ это:

#Word2Vec model

model = gensim.models.Word2Vec(
    sg=1,
    size=100,
    window=10,
    min_count=1,
    hs=0,
    negative=5,
    workers=10,
    alpha=0.025,
    min_alpha=0.025,
    seed=7,
    sample=1e-3,
    hashfxn=hash,
    iter=20
)

#prepare the model vocabulary
model.build_vocab(sentences, update=False)

В чем проблема?И как я могу получить необходимый результат?

1 Ответ

0 голосов
/ 08 февраля 2019

Зачем вам нужно, чтобы «длина вектора» заметно изменялась как «желаемый результат»?

Длина слов-векторов (или их суммы) обычно не представляет большого интереса.На самом деле, перед сравнением принято нормализовать слова-слова на единицу длины.(И иногда, когда делаются суммы / средние значения в качестве простого способа создания векторов для пробегов нескольких слов, векторы могут быть нормализованы до или после такой операции.)

Вместо этого обычно направление (угол), которое представляет наибольший интерес.

Кроме того, что вы имеете в виду, когда описываете значения длины как "довольно похожие"?Без показа фактической длины, которую вы видели в своих тестах, неясно, верны ли ваши интуиции относительно того, какими должны быть изменения.

Обратите внимание, что в многомерных пространствах - и особенно в многомерных пространствах - наша интуиция довольно часто ошибочна.

Например, попробуйте добавить группу пар случайных единичных векторов в 2d-пространстве и посмотреть на длину нормы суммы.Как и следовало ожидать, вы, вероятно, увидите различные результаты, варьирующиеся от почти 0,0 до почти 2,0 - представляющие перемещение ближе или дальше к исходной точке.

Попробуйте вместо этого добавить несколько пар случайных единичных векторов в пространстве 500d,Теперь нормальная длина суммы почти всегда будет близка к 1,4.По сути, при наличии 500 направлений, большинство сумм не будет значительно перемещаться ближе или дальше к исходной точке, даже если они по-прежнему отодвигаются на 1,0 от любого вектора в отдельности.

Вы, вероятно, наблюдаете то же самое с вашими векторами слов.Они в порядке, но мера, которую вы выбрали - норма векторной суммы - просто не меняет того, чего вы ожидаете, в многомерном пространстве.

Отдельно, не связанный с вашей основной проблемой, но с вашими отображаемыми параметрами word2vec:

  • Вы можете подумать об использовании нестандартного min_count=1, сохранив больше слов / информации, результатовв лучших векторах.Однако, как правило, больно сохранять качество слова-вектора, чтобы сохранить такие редкие слова.Слово-векторное качество требует много разных примеров использования слова.Слова с одним или несколькими примерами не получают хорошие векторы из этих нескольких уникальных примеров использования, но do служат тренировочным шумом / помехой в улучшении других слов.векторы с большим количеством примеров.
  • Обычная оптимизация стохастического градиентного спуска опирается на alpha скорость обучения, снижающуюся до незначительного значения в течение обучения.Установка окончания min_alpha на то же значение, что и начало alpha, препятствует этому.(Как правило, большинству пользователей не следует изменять ни один из параметров alpha, и если им вообще нужно повозиться, изменение начального значения имеет больше смысла.)
...