При обработке естественного языка (NLP) мы часто преобразуем слова в векторы, содержащие числовые значения, чтобы машина могла их понять. Встраивание слов - это тип сопоставления, который позволяет словам с одинаковым значением иметь одинаковое представление. В этой статье будут представлены два современных метода встраивания слов, Word2Vec и FastText с их реализацией в Gensim.

Традиционный подход

Традиционный способ представления слов - это горячий вектор, который по сути является вектором, в котором только один целевой элемент равен 1, а остальные равны 0. Длина вектора равна размеру общего уникального словаря в корпусе. Обычно эти уникальные слова кодируются в алфавитном порядке. А именно, вы должны ожидать горячих векторов для слов, начинающихся с «a» с целевой «1» более низкого индекса, в то время как для слов, начинающихся с «z» с целевой «1» более высокого индекса.

Хотя такое представление слов просто и легко реализовать, есть несколько проблем. Во-первых, вы не можете сделать вывод о какой-либо связи между двумя словами, учитывая их однозначное представление. Например, слова «терпеть» и «терпеть», хотя и имеют схожее значение, их цели «1» далеки друг от друга. Кроме того, разреженность - еще одна проблема, поскольку в векторах присутствует множество повторяющихся «0». Это означает, что мы теряем много места и нуждаемся в лучшем представлении слов для решения этих проблем.

Word2Vec

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

Существует два типа Word2Vec, Skip-gram и Continuous Bag of Words (CBOW). Я кратко опишу, как работают эти два метода, в следующих параграфах.

Скип-грамм

Для скип-граммы входом является целевое слово, а выходом - слова, окружающие целевые слова. Например, в предложении «У меня есть симпатичная собака» вводом будет «a», а на выходе - «I». , «иметь», «мило» и «собака», предполагая, что размер окна равен 5. Все входные и выходные данные имеют того же размера и с горячим кодированием. Сеть содержит 1 скрытый слой, размер которого равен размеру встраивания, который меньше размера вектора ввода / вывода. В конце выходного слоя применяется функция активации softmax, так что каждый элемент выходного вектора описывает, насколько вероятно конкретное слово появится в контексте. На приведенном ниже графике показана структура сети.

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

При использовании skip-gram размер представления уменьшается от размера словаря (V) до длины скрытого слоя (N). Кроме того, векторы более «значимы» с точки зрения описания взаимосвязи между словами. Векторы, полученные вычитанием двух связанных слов, иногда выражают значимое понятие, такое как род или время глагола, как показано на следующем рисунке (размерность уменьшена).

CBOW

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

Самая большая разница между Skip-gram и CBOW заключается в том, что генерируются векторы слов. Для CBOW все примеры с целевым словом в качестве цели передаются в сети и принимают среднее значение извлеченного скрытого слоя. Например, предположим, что у нас есть только два предложения: «Он хороший парень» и «Она мудрая королева». Чтобы вычислить представление слова для слова «а», нам нужно передать эти два примера «Он хороший парень» и «Она мудрая королева» в нейронную сеть и взять среднее значение из скрытого слоя. . Skip-gram подает только одно и только одно целевое слово one-hot vector в качестве входных данных.

Утверждают, что Скип-грамм, как правило, лучше в редких словах. Тем не менее, показатели Skip-gram и CBOW в целом схожи.

Реализация

Я покажу вам, как выполнять встраивание слов с помощью Gensim, мощного инструментария НЛП и набора данных TED Talk.

Сначала мы загружаем набор данных с помощью urllib, извлекая субтитры из файла.

Давайте посмотрим, что хранит переменная input_text, как частично показано на следующем рисунке.

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

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

Это форма, готовая к загрузке в модель Word2Vec, определенную в Gensim. Модель Word2Vec можно легко обучить одной строчкой, как показано в приведенном ниже коде.

  • предложения: список разделенных предложений.
  • size: размерность вектора внедрения.
  • окно: количество контекстных слов, на которые вы смотрите
  • min_count: указывает модели игнорировать слова с общим количеством меньше этого числа.
  • worker: количество используемых потоков.
  • sg: использовать ли скип-грамм или CBOW

А теперь давайте попробуем, какие слова больше всего похожи на слово «мужчина».

Оказывается, слова, относящиеся к мужчинам / женщинам / детям, больше всего похожи на «мужчина».

Хотя Word2Vec успешно справляется с проблемой, связанной с одним горячим вектором, у него есть несколько ограничений. Самая большая проблема заключается в том, что он не может представлять слова, которых нет в наборе обучающих данных. Даже при использовании более крупного обучающего набора, содержащего больший словарный запас, некоторые редкие слова, которые используются очень редко, никогда не могут быть сопоставлены с векторами.

FastText

FastText - это расширение Word2Vec, предложенное Facebook в 2016 году. Вместо ввода отдельных слов в нейронную сеть FastText разбивает слова на несколько n-граммов (подслов). Например, триграммы для слова яблоко - это app, ppl и ple (без учета начала и конца границ слов) . Вектор встраивания слов для apple будет суммой всех этих n-граммов. После обучения нейронной сети у нас будут вложения слов для всех n-граммов из обучающего набора данных. Редкие слова теперь могут быть правильно представлены, поскольку весьма вероятно, что некоторые из их n-граммов также присутствуют в других словах. В следующем разделе я покажу вам, как использовать FastText с Gensim.

Реализация

Как и в Word2Vec, нам нужна только одна строка, чтобы указать модель, обучающую внедрению слов.

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

Несмотря на то, что слово гастроэнтерит не существует в наборе обучающих данных, он все же способен определить, что это слово тесно связано с некоторыми медицинскими терминами. Если мы попробуем это в Word2Vec, определенном ранее, выскочит ошибка, потому что такого слова нет в наборе обучающих данных. Хотя для обучения модели FastText требуется больше времени (количество н-граммов ›количество слов), она работает лучше, чем Word2Vec, и позволяет правильно представлять редкие слова.

Заключение

Вы узнали, что такое Word2Vec и FastText, а также их реализацию с помощью набора инструментов Gensim. Если у вас возникнут проблемы, не стесняйтесь оставлять комментарии ниже. Если вам понравилась эта статья, не забудьте подписаться на меня в twitter, чтобы не пропустить ни одного отличного сообщения в блоге о машинном обучении / глубоком обучении!