Если вы слышали о векторах слов, вы, вероятно, знаете, что они позволяют использовать некоторый тип алгебры для слов. Так, например,

vector(France) — vector(Paris) + vector(Berlin)

дает ответ, наиболее близкий к слову Germany.

Менее известен тот факт, что вы можете использовать ту же векторную алгебру слов для исправления орфографических ошибок. В этом посте описывается, как создать справочную таблицу, содержащую наиболее распространенные орфографические ошибки и их исправления, с использованием предварительно обученных векторов GloVe из Стэнфорда.

К посту прилагается блокнот jupyter на github, в котором можно пройти через код. Вы также найдете версию справочной таблицы для загрузки.

Словарные векторы

Компьютеры имеют дело только с числами, поэтому, чтобы заставить компьютер анализировать текстовые данные - например, чтобы находить темы, переводить, резюмировать и т. Д. - вы должны сначала преобразовать данные в числа. «Вектор слов» - это просто набор чисел, которые представляют слово: внутреннее представление этого слова компьютером.

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

Есть много сообщений в блогах и учебных пособий, которые объясняют механизмы, лежащие в основе процесса обучения векторному слову. Моя цель ниже - дать понимание, почему слова оказываются там, где они находятся, и почему синонимы оказываются близко друг к другу.

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

«Я взял _____ и начал писать».

Что можно сказать о пропущенном слове? Это должно быть существительное; это, вероятно, вещь (хотя это может быть метафорическая вещь); но, скорее всего, это то, чем можно писать или на чем писать.

Предположим, что компьютерное представление слов состоит из двух чисел, т. Е. Вектор слов имеет 2 измерения. Таким образом, мы можем рассматривать каждый вектор как координаты точки на карте мира - каждое слово расположено в отдельной точке этой карты мира (слова?). В начале процесса обучения слова распределяются случайным образом, слова распределяются по всему миру равномерно.

Затем представьте, что компьютер делает прогноз, бросая в карту гипотетический дротик. Его предсказание будет словом, наиболее близким к точке приземления дротика.

Наш гипотетический компьютер для игры в дартс имеет довольно шаткую цель. Столкнувшись с приведенным выше предложением, он считает, что слово «ручка» является наиболее подходящим. Фактически, он представляет собой набор координат - слово вектор - который оказывается точкой, расположенной над Барбадосом. Итак, компьютер нацелен на Барбадос, но дротик приземляется на Сент-Люсии где-то на востоке. Учитывая, что первоначальное распределение слов является случайным, в конечном итоге происходит предсказание слова, не имеющего ничего общего с написанием.

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

Все идет нормально. А как насчет следующего (несколько надуманного) примера:

«Я немедленно отправлю ему письмо».

И «писать», и «перо» кажутся хорошими вариантами, но это доставит нам проблемы. Если и пишущие существительные, и пишущие глаголы сгруппированы вместе, как мы можем избежать предсказания «карандаш» или «биро» в этом примере; или глаголы типа «писать» в первом примере?

Ответ состоит в том, чтобы дать компьютеру больше чисел на слово - вектор слова более высокой размерности. Продолжая уже схематичную аналогию, представьте, что компьютер теперь бросает два дротика: один в карту, а другой - в диаграмму высот с масштабом, простирающимся от дна морского дна до стратосферы. Это дает нам пространство для того, чтобы «дела, связанные с письмом» по-прежнему располагались над Вест-Индией. Слова, похожие на существительные, могут быть найдены около уровня моря, а глаголы - где-то в небе; с «пером», сидящим между ними, возможно, ближе к земле, поскольку чаще всего используется как существительное.

Наиболее широко используемые словесные векторы имеют 300 измерений. То есть для каждого слова выделяем 300 номеров. Это дает огромное пространство для хранения информации обо всех аспектах слов - будь то существительное, глагол, прилагательное и т. Д .; время глагола; существуют ли существительные во множественном числе; различные аспекты, касающиеся значения слова; и, как мы увидим ниже, правильно ли оно написано.

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

Словарные векторы и орфографические ошибки

Одна версия векторов GloVe была обучена на 840 миллиардах слов данных, полученных из Интернета, в результате чего были получены векторы для 2,2 миллиона «слов».

Это много слов. Намного больше, чем 228 132 статей в Оксфордском словаре английского языка. Большая часть разницы состоит в именах собственных - именах людей, мест и т. Д., Которые не появятся в словаре. Кроме того, есть числа, множественное число, различные окончания глаголов, знаки препинания, слова ЗАГЛАВНЫМИ буквами и так далее.

Однако есть также множество векторов для слов, содержащих орфографические ошибки. Это дало мне идею ответа на вопрос, размещенный на форумах fast.ai, в котором просили найти способы выявления и исправления распространенных орфографических ошибок. Учитывая, что слово с ошибкой используется в том же контексте, что и его правильный аналог, тогда, возможно, мы сможем найти правильное написание, посмотрев на соседей неправильно написанного слова в векторном пространстве?

Оказывается, это не работает. Отнюдь не. Но на самом деле все гораздо интереснее.

Параллельный универсум написания словарных статей

В следующем списке показаны 10 слов, наиболее близких к слову «надежный» в векторном пространстве:

'dependable',
'trustworthy',
'cost-effective',
'efficient',
'economical',
'Reliable',
'accurate',
'reliability',
'trusted',
'reputable'

Теперь рассмотрим ближайших соседей слова "надежный" с ошибкой:

'relyable', 
'realible', 
'relable', 
'reliabe', 
'realiable', 
'relaiable', 
'relaible', 
'trustworth', 
'trustfull', 
'consitant'

У нас есть 7 дополнительных способов написания "надежный" неправильно, за которыми следуют синонимы "надежный" с ошибками. Правильного написания «надежный» нигде не видно.

Странный результат. Несомненно, relieable является синонимом reliable? Они могут быть найдены в очень похожих контекстах - возможно, в идентичных предложениях. Итак, почему эти орфографические ошибки не появляются в одном и том же месте в векторном пространстве?

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

Ответ в том, что вы можете, и это очень просто. Она работает точно так же, как упомянутая выше концептуальная алгебра. Вместо того:

[France] - [Paris] + [Berlin] ==> [Germany]

У вас есть что-то вроде:

[reliable] - [relieable] + [foriegn] ==> [foreign]

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

Вектор преобразования правописания

На следующих диаграммах показаны значения разницы между векторами правильно и неправильно написанных слов по 300 измерениям для набора часто неправильно написанных слов. (Обратите внимание, что между каждым из измерений нет последовательной связи. Я нарисовал линейную диаграмму, чтобы сделать узоры более заметными).

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

Также похоже, что более серьезные орфографические ошибки вызывают более длинные всплески, или, другими словами, очень распространенные орфографические ошибки вызывают более короткие всплески. Например, у recieve — receive и calender — calendar очень короткие шипы. В то время как мы не смогли найти reliable среди ближайших соседей relieable, receive является вторым ближайшим соседом recieve (после recive).

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

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

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

Применяя это к нашему набору из 17 слов, нам удалось исправить 15 (88%). Единственные два, с которыми он борется, - это pharaoh и Fahrenheit. Как и в случае с calendar и receive, вполне вероятно, что они пишутся неправильно так часто, что разница между соответствующими правильными и неправильными векторами слов очень мала.

Создание лучшего вектора преобразования орфографии

88% - это хорошо, но мы можем добиться большего. Мы можем построить гораздо больший набор примеров для «обучения», применив нашу первоначальную трансформацию в обратном порядке, чтобы обнаружить больше орфографических ошибок. Например, применительно к because получаем:

'becasue',
'becuase',
'beacuse',
'becuse',
'becouse',
'beacause',
'becaue',
'unfortunatly',
'beause',
'bacause'

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

Применительно к and получаем:

'and',
'annd',
'anf',
'ansd',
'adn',
'abd',
'andd',
'cuase',
'alll',
'becuse'

В этом списке есть пара моментов, на которые следует обратить внимание.

  • Все примеры - опечатки - вы не можете правильно написать and. Таким образом, на них явно влияет раскладка клавиатуры QWERTY (s и f расположены по обе стороны от d, а b - рядом с n), но в списке отсутствует amd. Причина в том, что amd чаще всего относится к компании, производящей компьютерные микросхемы, и поэтому это считается правильным написанием в непосредственной близости от athlon, pentium, intel и cpu.
  • Он по-прежнему содержит and. Мы могли бы исправить это, продвинувшись дальше в направлении орфографической ошибки - добавив множитель вектора преобразования орфографии.

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

Оценка правильности написания

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

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

Возможно, это было бы хорошо, но мы можем сделать немного лучше. Мы можем использовать наш начальный вектор преобразования орфографии, чтобы оценить вероятность того, что слово написано с ошибкой. Помните, что вектор преобразования указывает в сторону орфографических ошибок. Если мы спроецируем вектор слова на вектор преобразования, мы сможем измерить, как далеко он указывает в этом направлении. То есть мы берем скалярное произведение двух векторов и называем его "орфографической оценкой".

Вот несколько примеров слов с наивысшей и самой низкой оценкой в ​​соответствии с этой метрикой. (Чтобы преувеличить оценку, следующее основано на скалярном произведении между ненормализованными векторами слов и нашим вектором преобразования).

'Best' spellings:
U.S.;  officials;  political;  whose;  States;  significant;  percent;  University;  economic;  increasingly;  efforts;  individuals;  government;  former;  York;  such;  their;
'Worst' spellings:
!!!!!!;  Fav;  THANKS; omg;  EVINRUDE;  ur;  Airbags;  :{;  hes;  ppl;  ps3;  points3;  Mercruiser;  aint; fromServlet;  plz;  awsome;

Наш подход сейчас:

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

Сравнение начального и орфографического вектора

Новый вектор - это, по сути, более крайняя версия оригинала. Корреляция между двумя векторами превышает 90%, но дисперсия нового вектора намного выше. На следующей диаграмме новый вектор отображается синим цветом, а исходный - оранжевым:

Применительно к нашему первоначальному набору тестов из 17 примеров, теперь они все в порядке - даже «фараон»!

Применительно к 14 000 или около того парам, из которых мы построили вектор трансформации, и с помощью нескольких дополнительных приемов и настроек, мы в конечном итоге получаем правильность более чем на 90%. Просматривая некоторые примеры ошибок, становится ясно, что многие из них представляют собой ошибки в обучающем наборе - следствие автоматизированного способа, которым мы построили набор данных.

Почему орфографические ошибки группируются в векторном пространстве?

Теперь мы можем лучше объяснить, почему все орфографические ошибки вынесены в параллельное пространство? Наиболее очевидный ключ к разгадке лежит в приведенных выше списках лучших и худших слов по написанию. «Лучшее» написание слов - это те, которые вы можете найти в серьезной новостной статье; слова с «худшим» написанием - это в основном примеры неформального языка.

В сети вы найдете две совершенно разные группы текстового контента:

  1. Контент, который был тщательно проверен, отредактирован и / или проверен перед публикацией.
  2. Нефильтрованный пользовательский контент с форумов, электронных писем, твиттера и т. Д.

Второй набор текстов, скорее всего, будет содержать орфографические ошибки. Такие слова, как plz или ROFL, будут очень сильным индикатором того, что вы смотрите на контент, создаваемый пользователями. Таким образом, вы с большей вероятностью увидите опечатки и орфографические ошибки. Точно так же, когда мы начинаем читать percentage, economics, Government и т. Д., Разумно предположить, что текст был взят из источника новостей и, следовательно, будет написан правильно.

Еще одно подтверждающее свидетельство состоит в том, что если мы попытаемся использовать векторы слов GloVe, обученные на дампе Википедии и корпусе новостей Gigaword - данные, которые будут включать намного меньше пользовательского контента, - метод не сработает. Есть еще область / направление для орфографических ошибок, но оно гораздо менее четко определено, с меньшим количеством примеров орфографических ошибок.

Если приведенный выше аргумент верен, то нашу «оценку орфографии» лучше рассматривать как оценку «формальности», показывающую, насколько вероятно, что слово было взято из опубликованного источника, а не из пользователя.

Чтобы проверить эту идею - и увидеть, может ли эта новая метрика иметь какое-либо практическое применение - я построил набор данных, состоящий из деловых новостей BBC из этого источника, и сравнил его с набором образцов из фильма IMDB. набор данных обзоров ». Каждое предложение или отзыв получает оценку, основанную на средней оценке формальности слов в этом тексте.

Результаты невелики, но этому методу удается разделить по крайней мере некоторые тексты, как видно на следующем графике. Оценки новостей BBC формируются синим цветом, а обзоры IMDB - оранжевым.

Заключительные мысли

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

Однако стоит признать его ограничения:

  • Даже если бы он работал идеально, он мог бы исправлять только орфографические ошибки, которые появляются в предварительно подготовленном словаре векторных слов.
  • Он не может исправить опечатки, partw ay в словах. Он может работать только с токеном одного слова.
  • Точно так же он не может исправить ошибки, в которых twowords не хватает пробела.
  • Хотя векторы слов построены на контексте, мы пытаемся исправлять слова по отдельности. Таким образом, этот метод не может справиться с более сложными случаями, когда опечатка или орфографическая ошибка создают другое (но правильно написанное) слово, как в нашем amd примере выше.
  • Как отмечалось выше, у нас, как правило, нет примеров опечаток в длинных словах, предположительно потому, что они встречаются недостаточно часто. Таким образом, мы можем исправить misstake, но не misdtake.

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

  • Использование символа-rnn для изучения шаблонов из примеров распространенных орфографических ошибок, которые мы определили в процессе выше, которые затем могут быть использованы для слов вне словарного запаса. Интересная мысль здесь заключается в том, что вы можете разделить словарный запас по длине слова, а затем потренироваться на примерах коротких слов, чтобы изучить шаблоны для QWERTY-опечаток.
  • Использование языковой модели для построения новых векторов слов для расширения словарного запаса.
  • Используйте более традиционные методы проверки орфографии, чтобы увидеть, можете ли вы разделить слова с плохой орфографической / формальной оценкой на два или более отдельных правильно написанных слова. Даже здесь может помочь структура векторного пространства слов: например, ближайшие соседи downloadand - это theand, yourand, _43 _, _ 44_.

Последнее слово - благодарность Рэйчел Томас и Джереми Ховарду за создание fast.ai. Лекции - это фантастический ресурс, и теперь у них есть растущее, увлеченное и поддерживающее сообщество. Если вы, как и я, начинаете заниматься машинным обучением и по какой-то причине еще не знакомы с их курсом, я не могу его рекомендовать.

| ¹ Хотя на сегодняшний день, похоже, никто не предпринял шагов, чтобы превратить эту функцию в практический словарь / средство проверки орфографии, по крайней мере, некоторые в сообществе машинного обучения / НЛП знали о взаимосвязи в векторном пространстве слов. Например, Джейк Манникс упоминает об этом в этой презентации.

Подробнее откуда это взялось

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

Следите за нашей публикацией, чтобы увидеть больше историй о продуктах и ​​дизайне, представленных командой Journal.