Предсказание слова с использованием модели Word2vec

20

Принимая во внимание предложение: «Когда я открываю ?? дверь он начинает нагрев автоматически»

Я хотел бы получить список возможных слов в ?? с вероятностью.

Основная концепция, используемая в модели word2vec, заключается в том, чтобы «предсказать» слово в заданном окружающем контексте.

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

Это просто линейная сумма?

model.most_similar(positive=['When','I','open','the','door','it','starts' ,'heating','automatically'])
DED
источник
Я реализовал описанный выше алгоритм и натолкнулся на вопрос: почему используется softmax? Позвольте мне показать вам пример двух функций нормализации: def softmax (w, t = 1.0): # Source: gist.github.com/stober/1946926 e = np.exp (w / t) return e / np.sum ( e) нормализация по умолчанию (w): возвращаемая w / np.sum (w) a = np.array ([. 0002, .0001, .01, .03]) нормализация печати (a) печать softmaxmax (a, t = 1 ) Давайте сравним выходные данные: [0,00496278 0,00248139 0,24813896 0,74441687] [0,24752496 0,24750021 0,24996263 0,25501221] Как мы видим, softmax дает .03 примерно такую ​​же вероятность по сравнению с .0001 (то есть

Ответы:

9

Word2vec работает в двух моделях CBOW и Skip-Gram. Давайте возьмем модель CBOW, поскольку ваш вопрос идет так же, как и прогнозирование целевого слова с учетом окружающих слов.

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

По сути, прогнозирование целевого слова из заданных контекстных слов используется в качестве уравнения для получения матрицы оптимального веса для заданных данных.

Чтобы ответить на вторую часть, это кажется немного сложнее, чем просто линейная сумма.

  1. Получить все векторы слов контекстных слов
  2. Усредните их, чтобы узнать вектор скрытого слоя hразмераNx1
  3. Получить выходную матрицу syn1( word2vec.cили gensim), которая имеет размерVxN
  4. Умножьте syn1на h, результирующий вектор будет иметь zразмерVx1
  5. Вычислить вектор вероятности y = softmax(z)с размером Vx1, где наибольшая вероятность обозначает горячее представление целевого слова в словаре. Vобозначает размер словаря и Nобозначает вектор вложения.

Источник: http://cs224d.stanford.edu/lecture_notes/LectureNotes1.pdf

Обновление: модели краткосрочной памяти в настоящее время делают большую работу в предсказании следующих слов. Модели seq2seq описаны в руководстве по тензорному потоку . Также есть запись в блоге о генерации текста.

yazhi
источник
Спасибо ! Вам известно о какой-либо реализации этого? (например, в рамках Gensim). Иначе, это не кажется слишком сложным для вычисления.
DED
Привет, не могли бы вы дать мне более подробную информацию о том, как извлечь выходную матрицу (в вашем примере syn1) из обученной модели встраивания w2v? Я думаю, что w2v сбросил матрицу вывода, когда закончил обучение.
Чарльз Чоу
Исходя из моего понимания, ваш ответ на второй вопрос состоит в том, чтобы восстановить выходную матрицу, это правильно?
Чарльз Чоу
1
Я думаю, что стоит отметить, что это не работает как классификатор последовательности. Порядок слов игнорируется.
displayname
Можно получить выходную матрицу syn1, просто сохранив модель. да, порядок игнорируется, поскольку для приложения можно использовать модель seq2seq на основе LSTM.
Яжи
4

Предсказание отсутствующего слова было добавлено в качестве функциональной возможности в последней версии Word2Vec. Конечно, ваше предложение должно соответствовать синтаксису ввода модели Word2Vec, используемому для обучения модели (строчные буквы, стоп-слова и т. Д.)

Использование для предсказания трех главных слов «Когда я открою? Дверь»:

print(model.predict_output_word(['When','I','open','door']), topn = 3)
Кристоф Хенкель
источник
Как он узнал, что centerмежду 3-м и 4-м словом? Это не имеет смысла для меня. Я бы предположил, что можно вставить только четные контекстные слова, и он выбрал бы слово между floor(len(n)/2))иfloor(len(n)/2))+1
BMC