Основные подходы

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

С другой стороны, такие задачи, как определение настроения отзыва клиента или прогнозирование того, какое слово будет следующим в неполном предложении, требуют некоторой формы понимания слов в данном тексте. В конце концов, это то, что мы делаем, когда пытаемся решить эти задачи вручную, но как мы можем научить компьютер делать это за нас? Это то, чем занимается обработка естественного языка (NLP), подраздел искусственного интеллекта (AI), среди других задач, которые включают анализ и понимание человеческого языка. Однако в основе НЛП лежит фундаментальная проблема текстового представления . Другими словами, как мы можем преобразовать данный текст в некоторую числовую форму, которую алгоритм НЛП может обработать и использовать для решения реальных задач? В этой статье я опишу некоторые базовые и продвинутые подходы к решению этой фундаментальной проблемы.

Расширенные подходы

Базовая нумерация

Итак, каков был бы самый простой и простой подход к этой проблеме? Пока вы думаете, позвольте мне предложить один. Просто присвойте уникальный номер каждому слову в словаре и наступите день!

word    | number
_________________
a       |  1
able    |  2
       ...
book    |  325
       ...
paper   |  1024
       ...
zoology |  5067
       ...

Это красивое и простое представление, но у него есть один существенный недостаток. В дополнение к тому факту, что эти числа не передают никакого значения слов, они, с другой стороны, накладывают неявный и ненужный семантический порядок слов. На самом деле нет причин, по которым paper должен быть присвоен больший номер, чем book, и меньший, чем зоология. Алгоритмы машинного обучения очень чувствительны к распределению данных, и это представление может ввести алгоритм в заблуждение, заставив его думать, что paper каким-то образом является лучшим (или худшим) кандидатом, чем книга для определенный контекст. Итак, похоже, наша первая попытка с треском провалилась. Что следующее?

Кодировка символов

В нашей первой попытке мы присвоили словам произвольные номера, и, возможно, в этом проблема. Может быть, нам стоит немного поумнеть в выборе этих чисел и начать думать в терминах чисел, которые каким-то образом связаны со словами. Фактически, одна идея, которая может сразу прийти в голову, - это кодировка символов. Слова состоят из символов, и уже существует взаимно однозначное соответствие между словом и его символьным кодированным представлением в компьютерах. Итак, что, если вместо произвольных чисел мы сопоставим каждое слово с числом, которое представляет его кодировку ASCII или Unicode? Сначала это звучит очень просто и интересно, но если вы присмотритесь, то поймете, что это только говорит вам, что такое слово , а не то, что слово означает. Другими словами (без каламбура), 97 112 112 108 101 может быть кодировкой последовательности символов яблоко ( действительно так), однако это далеко не осмысленное представление. для слова яблоко, поскольку простое сочетание букв не несет никакого внутреннего смысла в слове, которое они образуют. Это представление также страдает той же проблемой семантического упорядочения, что и базовая нумерация.

Быстрое кодирование

Итак, похоже, что мы на правильном пути, но вместо поиска информативных присвоений номеров нам следует рассмотреть другие подходы, которые могут преодолеть присущую им проблему семантического упорядочения, связанную с нумерацией. Здесь на сцену выходят векторы. Давайте вернемся к нашему основному подходу к нумерации и расширим его, чтобы избежать проблем с упорядочением. Таким образом, мы по-прежнему будем присваивать уникальное целое число каждому слову, но вместо того, чтобы сохранять число в десятичной форме, мы будем кодировать число в двоичный вектор (вектор нулей и единиц) размера | V | где V - словарь слов в данном тексте. Этот вектор будет иметь нули везде, кроме индекса, соответствующего номеру, который мы присвоили слову, в которое мы поместим 1. Давайте рассмотрим простой текстовый пример, чтобы проиллюстрировать это:

I think therefore I am.

Учитывая этот текст, наш словарный запас состоит из 4 слов: V = {я, следовательно, думаю, am}. Каждому слову, начиная с 1, присваиваем уникальный номер:

I   think   therefore   am
1     2        3        4

Следовательно, наши новые векторы слов будут выглядеть следующим образом:

            1  2  3  4
I          [1, 0, 0, 0]
think      [0, 1, 0, 0]
therefore  [0, 0, 1, 0]
am         [0, 0, 0, 1]

Как видите, не существует понятия неявного упорядочивания между этими векторами, поэтому мы достигли более эффективного и в то же время простого представления слов. Уф!

Однако на практике эта схема используется редко из-за следующих основных ограничений:

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

Мешок слов

Давайте попробуем следовать нашей традиции постепенного преодоления недостатков подхода, чтобы, надеюсь, создать лучший метод репрезентации. Одним из основных недостатков «горячего» кодирования было очевидное отсутствие поддержки для установления семантических отношений между словами. Давайте посмотрим, сможем ли мы справиться с этим ограничением, используя наши знания о семантике. Когда два слова семантически похожи? На самом деле это сложный вопрос, и мы вернемся к нему позже в статье. Вместо этого давайте рассмотрим другой, относительно более простой вопрос. Когда два фрагмента текста семантически похожи? Один интуитивно понятный и простой ответ - когда в этих текстах используется значительное количество одних и тех же слов. Итак, давайте попробуем придумать представление, которое кодирует этот факт, преобразуя фрагменты текста (также известные как документы) вместо отдельных слов в векторы на основе составляющих их слов. Подобно нашим предыдущим подходам, мы присваиваем каждому слову уникальный номер, но вместо того, чтобы представлять слова этими числами, мы используем их и соответствующие частоты слов для построения полезного представления для данного документа.

В частности, мы конвертируем каждый документ в вектор размерности | V | где V - наш словарь, а элемент с индексом i - это просто количество раз, когда слово, соответствующее числу i, встречается в документе. Давайте рассмотрим несколько примеров, чтобы лучше понять эту концепцию:

Document 1: I think therefore I am
Document 2: I love dogs
Document 3: I love cats

Тогда наш словарный запас V = {я, следовательно, думаю, am, love, dogs, cats}, и давайте присваиваем уникальные числа, как и раньше:

I   think   therefore   am   love   dogs   cats
1     2         3       4      5     6       7

Тогда наши векторы документов будут:

              I  think  therefore  am  love  dogs  cats
Document 1: [ 2,   1,      1,      1,    0,   0,    0 ]
Document 2: [ 1,   0,      0,      0,    1,   1,    0 ]
Document 3: [ 1,   0,      0,      0,    1,   0,    1 ]

Эти векторы, по сути, представляют соответствующий документ как мешок (набор) слов без учета контекста и порядка слов. Если вы заметили, векторы документа 1 и документа 3 очень близки друг к другу в векторном пространстве, что отражает тот факт, что у них много общих слов. Действительно, евклидово расстояние между этими документами значительно меньше, чем расстояние, например, между документом 1 и документом 2. Следовательно, это представление позволяет нам измерять семантическое сходство документов в отличие от однократного кодирования, но если вы посмотрите еще глубже , вы поймете, что это представление не далеко от однократного кодирования и фактически может быть достигнуто путем простого суммирования однократно закодированных векторов для слов в документе. Настоящая разница в том, что мы работаем на основе документов, а не слов.

Хотя этот подход, кажется, предлагает более богатое, но простое представление и фактически широко используется на практике, особенно для классификации текста, он страдает несколькими серьезными недостатками:

  • Новая функция семантического сходства довольно жесткая и в значительной степени зависит от буквального лексикографического соответствия между общими словами. Например, векторы для документов «Я плаваю», «Я плавал» и «Я шел» одинаково разнесены друг от друга в векторном пространстве, хотя первые два предложения очень близки по значению.
  • Порядок в предложениях может существенно изменить значение, поэтому рассмотрение предложений как простого набора слов без порядка и контекста приводит к тому, что такие документы, как «Собака ела еду» и «Еда ела собаку», представлены одним и тем же вектором.
  • Проблема нехватки словаря (OOV) все еще не решена.
  • Это человек?

Пакет н-граммов

Как обычно, давайте еще раз попробуем исправить некоторые проблемы предыдущего подхода и посмотрим, где мы окажемся. Одной из основных проблем с методом мешок слов, казалось, было отсутствие порядка и контекста. Можете ли вы придумать простой способ уловить эти концепции? Давайте сделаем шаг назад и определим первопричину проблемы. Причина, по которой подходу мешка слов не хватало контекста, было то, что он трактовал слова как независимые атомарные единицы. С другой стороны, контекст обычно не может быть определен из одного слова, а скорее возникает в присутствии последовательностей слов. Итак, вместо того, чтобы представлять документ как набор отдельных слов, давайте посмотрим на него как на набор непрерывных последовательностей слов (a.k.a n-граммов) некоторого фиксированного размера, таким образом, улавливая некоторый контекст. Тогда наш словарь будет состоять из n-граммов, и, как и раньше, мы присвоим уникальный номер каждому элементу словарного запаса и представим документы векторами, кодирующими частоты этих элементов, присутствующих в документе. Давайте применим эту концепцию к нашим документам, упомянутым выше. Если мы разбиваем каждый документ на куски по 2 смежных слова (т. Е. По 2 грамма или биграммы), мы получаем следующий словарь:

V = {Я думаю, поэтому думаю, поэтому я, я, люблю, люблю собак, люблю кошек}

Затем мы присваиваем уникальный номер каждому члену словаря:

I think:         1
think therefore: 2
therefore I:     3
I am:            4
I love:          5
love dogs:       6
love cats:       7

Теперь мы можем построить наши векторы биграмм для каждого документа:

              1  2  3  4  5  6  7
Document 1: [ 1, 1, 1, 1, 0, 0, 0 ]
Document 2: [ 0, 0, 0, 0, 1, 1, 0 ]
Document 3: [ 0, 0, 0, 0, 1, 0, 1 ]

Если вы заметили, наш предыдущий подход к пакету слов был просто частным случаем пакета n-граммов, где n = 1. Мы также рассмотрели один из наиболее часто используемых случаев этого подхода, называемый представлением bigram. Другой популярный случай называется моделью триграммы, где n = 3, что неудивительно. Как видите, расширение нашего представления о том, что является лучшим представителем семантического значения в документе, помогло нам уловить больше контекста. Фактически, более высокие значения n включают в себя еще больший контекст, однако приводят к более разреженным векторам. В общем, подход мешок n-граммов с n = 2,3 предпочтительнее метода мешок слов из-за его контекстных преимуществ, но другие проблемы, такие как высокий вектор размерность, разреженность и отсутствие поддержки слов OOV (вне словарного запаса) по-прежнему делают его менее эффективным для практических целей.

TF-IDF

Где каждая функция определяется следующим образом:

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

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

Как видите, мы получили наименьшее значение для слова I, которое не является центральным для рассматриваемого документа, в то время как более высокие значения были присвоены более релевантным словам. Это означает, что представление TF-IDF также позволяет нам измерять семантическое сходство между документами, и, хотя оно обычно используется для приложений НЛП, таких как классификация текста и поиск информации, оно по-прежнему страдает фундаментальными недостатками, такими как высокая размерность, разреженность и неспособность обрабатывать OOV. слова.

word   TF score     IDF score          TF-IDF score
I      1/3 = 0.33   log(3/3) = 0       0.33 * 0 = 0
love   1/3 = 0.33   log(3/2) = 0.18    0.33 * 0.18 = 0.059     
dogs   1/3 = 0.33   log(3/1) = 0.48    0.33 * 0.48 = 0.158
                    I   think   therefore   am   love   dogs   cats
Document 2 vector: [0     0        0        0    0.059  0.158    0]

Вложения слов

Заключение

Мы прошли долгий путь в поисках значимого представления слов и увидели несколько интересных фундаментальных подходов, но не смогли избежать проклятия высокой размерности и разреженности. Предыдущие представления также, кажется, не смогли передать истинное семантическое значение слов. Можем ли мы сделать лучше? Давайте вернемся к сложному вопросу, который мы поставили, но которого было удобно избежать ранее в статье: когда два слова являются семантически похожими? Давайте немного отделим понятие семантического сходства. Как определить, похожи ли два слова? Например, похожи ли слова мужчина и женщина? Конечно, да, поскольку оба относятся к людям. Ага! Итак, в контексте людей эти слова семантически похожи. По этой аналогии другие слова, такие как король, королева, мальчик, и девочка, также имеют одинаковое отношение в одном контексте. Но если мы изменим контекст, скажем, на пол, то вдруг эти термины, похоже, не будут иметь одинаковую степень сходства. Очевидно, что в этом контексте мужчина больше похож на мальчика, чем женщину, которая сама по себе больше похожа на девушку чем человек. Итак, что мы можем сделать из этого наблюдения? Дело в том, что контекст играет ключевую роль в определении семантического сходства. Итак, следуя этому рассуждению, если бы мы каким-то образом смогли закодировать эти контексты в вектор чисел, тогда результирующие векторы были бы гораздо более репрезентативными для соответствующих им слов, чем то, что мы видели до сих пор. Позвольте мне проиллюстрировать это на примере. Я собираюсь построить некий фиктивный вектор для каждого из упомянутых выше слов (плюс несколько дополнительных слов) на основе следующих контекстов:

Здесь значения в каждом измерении представляют степень нашей уверенности в связи слова с рассматриваемым контекстом. Как видите, слова, семантически похожие в некотором контексте, также близки друг к другу в векторном пространстве в измерении, связанном с одним и тем же контекстом. Теперь обратите внимание на принципиальные отличия этого вектора. Его размерность больше не коррелирует с размером нашего словаря, а скорее с количеством контекстов (функций), которое обычно значительно меньше, и это означает, что мы можем представлять слова с помощью низкоразмерных, плотных векторов, которые в то же время предлагают решающее преимущество обнаружения семантического сходства. Но на самом деле преимущества на этом не заканчиваются. Это представление также позволяет нам ответить на другие интересные вопросы о языковых моделях. Например, мы можем спросить мужчина для короля, как женщина для чего? Лингвистический ответ - королева, и вы действительно можете прийти к этому ответу, манипулируя векторами следующим образом:

  1. Это мужчина?
  2. Это женщина?
  3. Это правитель государства?
  4. Это неодушевленное?
  5. Давайте рассмотрим последний базовый подход к векторизации, прежде чем переходить к более продвинутым. На этот раз давайте рассмотрим другой аспект слов в документе, чтобы использовать наше векторное представление. Мы все еще ищем осмысленное представление документа, и вопрос в том, что еще характеризует документ? Хорошо, представьте, что вам дали такой текст, как эта статья, и попросили резюмировать его с помощью нескольких ключевых слов. Как бы вы это сделали? Вы бы просто указали 5 самых частых слов? Скорее всего, нет, потому что вы, скорее всего, получите такие слова, как am, are, is, like, this, that (также известные как стоп-слова). Итак, вы бы вместо этого стали искать слова, которые в целом более важны для документа, не так ли? Например, текстовое представление и векторизация слов были бы хорошими кандидатами для представления этой статьи. Это основная идея нашего следующего метода представления. Вместо того, чтобы назначать произвольные числа, мы хотим связать каждое слово в документе с какой-либо оценкой важности или релевантности и представить документ с вектором этих оценок. Теперь возникает вопрос, как рассчитать эти баллы? Прежде чем переходить к формулам, давайте разберемся с их интуицией. Наша цель - разработать формулу, которая будет выдавать более высокий балл за важные слова (также известные как термины) в документе, чем за менее важные. Мы знаем, что слова, которые важны для какого-либо документа, могут часто встречаться в этом документе (хотя в большинстве случаев и редко), однако почти всегда гораздо меньше, чем стоп-слова. Это означает, что термин частота (TF) недостаточно просто для обозначения важности и, по сути, большую часть времени ошибочен. Однако это необходимая информация, которую мы хотели бы использовать для расчета окончательной оценки. Итак, давайте попробуем скорректировать это значение для наших целей. По сути, нам нужно умножить эту оценку TF на другую оценку, которая намного ниже для игнорируемых слов и выше для важных терминов. И этот новый множитель известен как показатель обратной частоты документов (IDF), который по существу основан на простом понимании того, что стоп-слова часто встречаются не только в одном документе, но и во всех документы. Итак, если мы просто возьмем обратную частоту документов, в которых встречается слово, тогда это значение должно быть выше для важных слов, поскольку они, скорее всего, присутствуют только в соответствующих документах (а значит, меньше документов). Следовательно, мы получаем следующую формулу для вычисления оценки для каждого термина t в данном документе d:
word/context   1.    2.    3.     4.    5.
king         [ 0.9   1     0      1     0 ]
queen        [ 0.9   0     1      1     0 ]
man          [ 1     1     0      0.5   0 ]
woman        [ 1     0     1      0.5   0 ]
boy          [ 1     1     0      0.5   0 ]
girl         [ 1     0     1      0.5   0 ]
book         [ 0     0     0      0     1 ]
paper        [ 0     0     0      0     1 ]

Это также интуитивно имеет смысл в том смысле, что если вы уберете мужественность из короля, вы останетесь с чистой концепцией королевской власти, а добавление женственности к этому результату должно дать вам Королева. Бинго!

Итак, теперь у нас есть гениальный подход, который представляет слова более семантически интуитивно понятным образом с компактными векторами (также известными как вложения слов), возникает вопрос, как мы на самом деле придумали эти векторы? Мы рассмотрели небольшой корпус образцов с несколькими контекстами, но в реальном мире огромных словарей создание этих векторов вручную было бы практически невозможно. Кроме того, неясно, сколько контекстов мы должны учитывать для векторной размерности. В 2013 году революционная работа Миколова и др. [1] показали, что модель представления на основе нейронной сети под названием «word2vec» может достичь результатов, показанных в примерах выше. Эта модель изучает вложения слов заданного измерения (гиперпараметра) на основе большого количества текста, однако изученные векторы не так интерпретируемы, как те, которые используются в примере, в том смысле, что какой тип контекста представляет каждое измерение, не является довольно ясно, глядя на векторы. Я не буду вдаваться в подробности того, как работает модель (возможно, в будущем посте), но основная идея, лежащая в основе предлагаемых в документе архитектур моделей, также основана на важности контекста. Их подход «непрерывный мешок слов» по ​​существу пытается предсказать слово в предложении, учитывая слова вокруг него в качестве контекста, в то время как подход «SkipGram» делает противоположное и определяет контекст для данного слова.

Хотя представление встраивания слов решило большинство ключевых проблем с базовыми подходами, одна проблема, а именно способность обрабатывать слова OOV, все еще не решена. Для решения этой проблемы в одной популярной технике под названием «fastText» [6] была предложена интересная модификация обучения встраиванию слов с использованием информации о частях слова, таких как морфологические свойства (например, префиксы, суффиксы и т. Д.). Ключевая идея, лежащая в основе этого метода, состоит в том, чтобы представить слово составляющими его символами n-граммами и изучить вложения для слов и символьных n-граммов вместе. Чтобы создать вложение для слова, которое мы никогда не видели, например, ограниченного, мы разбиваем его на n-граммы символов, такие как par, aro, roc, och,…, ial и объедините вложения для этих n-граммов, чтобы получить вложение для слова местечко.

Подход с внедрением слов оказался фундаментальным строительным блоком для НЛП и с тех пор вдохновил на создание более сложных схем представления текста. Один из них, который называется «Doc2Vec» [2], расширил подход «word2vec» для непосредственного изучения представлений для текстов произвольной длины. В последние несколько лет были введены более глобальные (GloVe [3]) и контекстные представления слов (ELMo [4], BERT [5]), которые решают проблему неоднозначности слов (т.е. представляют слова, которые означают разные вещи в разных контекстах, например как омонимы) среди других, связанных с простыми вложениями слов. Эти представления довольно сложны и требуют отдельных постов в блоге.

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

Хотя наш игрушечный пример был коротким, в реальном мире вам придется обрабатывать большие объемы текста с большим словарным запасом. Поскольку размерность нашего однократно закодированного вектора слов прямо пропорциональна размеру словаря, мы получим большие разреженные векторы, где большинство записей - нули, и с этим неэффективно иметь дело с вычислительной точки зрения. Редкость также может стать причиной «переобучения».

Ссылки

[1] «Томас Миколов», «Кай Чен», «Грег Коррадо», «Джеффри Дин», «Эффективное оценивание представлений слов в векторном пространстве» (2013)

[2] Куок В. Ле, Томаш Миколов, Распределенное представление приговоров и документов (2014)

[3] Джеффри Пеннингтон, Ричард Сохер и Кристофер Д. Мэннинг. 2014. Перчатка: глобальные векторы для представления слов.

[4] Мэтью Э. Питерс, Марк Нойман, Мохит Айер, Мэтт Гарднер, Кристофер Кларк, Кентон Ли, Люк Зеттлмойер, Глубокие контекстуализированные представления слов

[5] Джейкоб Девлин, Мин-Вэй Чанг, Кентон Ли, Кристина Тутанова, BERT: предварительная подготовка глубоких двунаправленных преобразователей для понимания языка

[6] Петр Бояновски, Эдуард Граве, Арман Жулен, Томаш Миколов, Обогащение векторов слов с помощью подсловной информации

От слов к векторам