Если вы занимаетесь обработкой естественного языка, то, возможно, вы хорошо знакомы со встраиванием слов. Это распределенное представление слов, где каждому слову присвоен вектор n-мерности. В этой статье я объясняю это векторное представление, генерируя несколько векторов слов с помощью Keras и объясняю его влияние на задачу НЛП. Кроме того, попробуйте записную книжку Jupyter (ссылка ниже), чтобы получить четкое представление.

Давайте восполним пробел:

У Аниндиты есть домашнее животное, коричневое ___.

Что вам приходит в голову, что может поместиться в пробел для предложения? Коричневый питомец может быть «кошкой» или «собакой». Но вы отвечаете на него, исходя из своих эмпирических знаний. Как машина может это угадать? Коричневая вещь также может быть рисом, рубашкой или бумагой.

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

Если у нас есть векторы слов, то сходство между двумя словами можно определить по углу между этими двумя словами в векторном пространстве. Уравнение для определения угла между двумя векторами:

Это называется косинусоидальным подобием. Идея заключается в том, что чем более похожи два слова, тем меньше угол между ними. Значение косинуса может быть от 0 до 1. Если два слова совпадают, то угол будет равен 0, а подобие косинуса будет равно 1.

Теперь, как мы можем получить векторное представление для слов?

Идея впервые появилась в 1957 году у английского лингвиста Дж. Р. Ферт, который придумал слоган : « Вы должны знать слово по компании, которую оно составляет».

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

Вот и делаю что-то похожее. Я дам нашей нейронной сети контекстное слово и скажу, чтобы она предсказывала три целевых слова. Этот тип архитектуры известен как скип-грамм. Вот первое предложение из первого сюжета:

В салоне работает бармен, разнося напитки клиентам.

Теперь, если мы удалим стоп-слова и знаки препинания, получится:

бармен, работающий в салоне, обслуживающий клиентов с напитками

Теперь мы сдвинем окно, чтобы получить наш контекст и целевые слова. Для размера окна 4 первое слово в окне будет нашим контекстным словом, а следующие три слова будут нашими целевыми словами. На следующем рисунке я проиллюстрировал процесс.

Подчеркнутые слова находятся в скользящем окне. В окне будет отображаться только одно слово за раз. Для первых 200 сюжетов фильмов из набора данных Wikipedia Movie Plots алгоритм пропуска грамм дает следующий результат: [показывает мало результатов]

0 Context : bartender ---> Target: ['working', 'saloon', 'serving']
1 Context : working ---> Target: ['saloon', 'serving', 'drinks']
2 Context : saloon ---> Target: ['serving', 'drinks', 'customers']
3 Context : serving ---> Target: ['drinks', 'customers', 'fills']
.............................................
.............................................
.............................................
18359 Context : free ---> Target: ['peacefully', 'ride', 'away']

Итак, мы дадим нашей нейронной сети эти 18359 контекстных слов (X) и позволим ей предсказать эти целевые наборы слов (Y) для первых 200 сюжетов фильма. Эти контекстные слова и целевые слова должны быть быстро закодированы, чтобы соответствовать нейронной сети.

Итак, мы делаем двухслойную нейронную сеть. Функция активации первого уровня - сигмоид, а функция активации второго слоя - softmax. Берем 100 скрытых юнитов в первом слое. Если вы знаете, как работает нейронная сеть, то для вас очевидно, что обучение нейронной сети означает обновление значений веса с помощью обратного распространения.

Вот определение модели Кераса:

Теперь читайте внимательно, чтобы получить некоторые важные интуитивные представления.

В этом эксперименте у нас есть 5779 уникальных слов (кодовая ссылка приведена ниже). Таким образом, каждое измерение слова с горячим кодированием будет (1,5779), и поскольку у нас есть 18360 контекстных слов против 18360 целевых наборов слов, поэтому входной размер будет (18360, 5779).

Поскольку мы берем 100 скрытых единиц в первом слое, размер матрицы весов в первом слое будет (5779, 100). Что ты видишь сейчас? У нас есть 5779 строк для 5779 слов, и каждая строка содержит 100-мерный вектор для каждого слова.

Я проиндексировал 5779 слов в словаре Python. Первая строка веса представляет вектор слова с индексом 0. Точно так же 5578-я строка весовой матрицы представляет векторное представление слова с индексом 5578.

Итак, после обучения нейронной сети веса обновятся, и мы получим настроенный вектор. Мы можем получить значительный результат для одной эпохи. Вот результат сходства слова «мужчина»:

print(most_similiar(‘man’,weight,word2idx))
------------------------------------------------
[('father', 0.95607513), ('young', 0.9553033), ('wife', 0.94956106), ('back', 0.94942164), ('comes', 0.9466744)]

Первые три слова имеют значение. Итак, можно сказать, что наша модель работает. Кроме того, мы заметили, что вектор слов уменьшил размерность матрицы для каждого слова с (1,5579) до (1,100), что уменьшило вычислительную сложность в задаче НЛП.

Итак, мы создали языковую модель, по которой мы можем легко определить отношения между словами. Модель с такими семантическими отношениями очень полезна для многих задач НЛП, таких как классификация документов, ответы на вопросы, машинный перевод и т. Д. Кроме того, у нас есть вектор низкой размерности для каждого слова, что снижает сложность вычислений.

Полный код: GitHub
Поиграйте с кодом, вы можете получить более глубокое понимание.

Ссылка на статью:
1. Mikolov, Tomas, et al. «Эффективная оценка представлений слов в векторном пространстве». препринт arXiv arXiv: 1301.3781 (2013).
2. Миколов, Томас и др. «Языковые модели на основе нейронных сетей для языков с высокой степенью флективности». Международная конференция IEEE по акустике, речи и обработке сигналов, 2009 г.. IEEE, 2009 г.