Автоматическое исправление орфографии, несмотря на то, что над ним работают с 70-х годов, по-прежнему сложно решить из-за отсутствия значительных пользовательских данных.

Шумный текст проблематичен для многих задач НЛП, поскольку он приводит к снижению точности методов, основанных на машинном обучении, и увеличивает количество слов вне словарного запаса (OOV), которые не могут быть обработаны популярными методами, такими как Word2Vec или GloVe.

Следовательно, в рамках предварительной обработки нашего конвейера мы изучили несколько подходов к упреждающей коррекции орфографии наших входных данных, чтобы повысить точность выполнения последующих задач. Здесь мы сосредоточимся на попытке решить эту проблему с помощью встраивания на уровне персонажа. Наша работа, которая позволяет обучать с нуля, использовать и визуализировать, доступна для скачивания и экспериментирования по этой ссылке [1].

Введение

Орфографические ошибки можно разделить на три группы, требующие разных подходов:

  1. Реальные ошибки в словах: «три» пишется как «там».

Реальные словесные ошибки сложнее всего исправить, поскольку они зависят от контекста. Чтобы исправить их, мы должны проанализировать все данные на предмет семантической согласованности и грамматики. В зависимости от используемого алгоритма мы вводим возможность ошибочно исправлять точные предложения и увеличиваем время обработки. Наиболее частый способ решения этой проблемы - модель seq2seq или использование статистических данных, таких как токен ngram.

2. Краткие формы: «вы» пишется как «.

Короткие формы имеют свойство разделять несколько букв с намеченным словом. Что касается расстояния редактирования, то u ближе к I, чем к you, поэтому словарный подход менее эффективен.

3. Ошибки без слов: «быстро» пишется как «fsat».

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

Исправление орфографии можно разделить на три основные задачи:

  1. Взяв в качестве входных данных предложение, определите, какие слова написаны с ошибками.
  2. По слову с ошибкой найдите список кандидатов на замену.
  3. Выберите подходящего кандидата из списка. (В случае автоматической коррекции)

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

Отбор кандидатов

Выбрать кандидатов можно несколькими способами:

  • Самый наивный подход - вычислить выбранное вами расстояние редактирования между вашим словом и всем вашим словарем. Хотя такой подход является точным, он слишком дорогостоящий.
  • Фонетические алгоритмы [2], такие как Soundex, Phonex или Metaphone. Эти алгоритмы кодируют любую строку в короткую последовательность, которая позволяет индексировать строку по произношению. Оба слова спешите и спешите вернут H600. Путем предварительной обработки всего словаря и индексации его по фонетическому коду вы можете легко найти фонетически похожих кандидатов. Быстро во время выполнения, но исправляет только фонетические ошибки.
  • Составление списка возможных орфографических ошибок (вставка, удаление, транспонирование или замена) вашего слова и сопоставление его со словарем. Хотя это лучше, чем наивный подход, он довольно медленный из-за набора орфографических ошибок, увеличивающихся в размере со скоростью 54 * длина + 25. См. Прекрасную статью от Питера Норвига [3] для получения дополнительных объяснений.
  • Симметричная коррекция орфографии, которая берет предыдущую идею и расширяет ее, вычисляя орфографические ошибки как для словаря, так и для слова с ошибками. См. Symspell [4] для получения дополнительной информации. Этот метод является одновременно точным и невероятно быстрым, но за счет значительных предварительных вычислений и дискового пространства и требует частотного списка вашего словаря.

Вложения на уровне персонажа

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

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

Наш подход следующий:

  • Обучите модель создавать вложения слов на уровне символов
  • Векторизуйте весь наш словарь и создайте индекс для эффективного поиска
  • Векторизуйте слово с ошибкой и ищите ближайших соседей

Модель использует двухуровневый LSTM для создания вложения выбранного размера. Более высокое измерение обеспечивает более точные результаты за счет более длительного времени вычислений, для нашего использования мы остановились на измерении 150. Модель обучается путем передачи ей кортежа слов, которые являются либо двумя совершенно разными словами, либо слово и его неправильное написание. Цель обучения - минимизировать норму разницы между двумя вложениями для аналогичного кортежа и максимизировать ее для разных слов.

Данные для обучения были сгенерированы с использованием словаря из 600 тыс. Слов и нескольких орфографических ошибок с расстоянием редактирования 1 или 2 для каждого слова. Мы присвоили более высокую вероятность орфографическим ошибкам рядом с исходными символами на клавиатуре AZERTY (поскольку мы работаем на французском языке), чтобы модель поддерживала их. Из-за отсутствия четких показателей обучения трудно точно знать, когда следует прекратить обучение, но, пройдя несколько миллионов примеров обучения, мы остались довольны результатами.

После обучения модель можно использовать для векторизации слов. Спроецируя их на 2D-плоскость с помощью PCA, мы можем получить следующую визуализацию:

python usage_visualisation.py

Успех ! Похоже, что похожие слова сгруппированы вместе в векторном пространстве.

Само по себе это не очень полезно, поэтому теперь мы собираемся векторизовать весь наш словарь на 600 тысяч слов. На современном процессоре этот процесс занимает около 10 минут.

Последний шаг - построение индекса, который позволяет эффективно искать ближайшие векторы. Поскольку нам не нужна стопроцентная точность и мы больше озабочены скоростью вычислений, мы будем использовать nmslib [5], библиотеку, специализирующуюся на поиске ANN (приблизительного ближайшего соседа).

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

Это дает нам следующий результат (на французском):

python usage_correction.py 'langqge'

Изменить расстояние 1:
langqge: [‘langage’]

Изменить расстояние 2:
langqge: ["langages", "lange", "langé", "langage"]

Результаты

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

В целом модель chars2vec дает нам точность 85%, в то время как стандартный фонетический алгоритм составляет около 40%. Объединение двух подходов дает нам точность 90%. Основное узкое место - это слова из 4 или менее символов, которые не работают должным образом.

Этого следовало ожидать, поскольку:

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

Выбор коррекции

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

Мы испробовали два разных подхода:

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

Эмпирическим путем мы обнаружили, что семантический подход достаточно хорошо работает для более длинных, менее частых слов, а вероятностный подход лучше для более коротких слов. Объединение двух подходов с созданными вручную правилами дает нам около 70% поправки на наш случайно сгенерированный корпус.

Будущая работа: жетон N-граммов

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

Для построения этих таблиц подсчитываются последовательные последовательности из N слов, которые составляются в очень большом корпусе. Лучшим ресурсом, доступным для этого, является N-грамм Google Книг [6] , созданный на основе анализа около 5 миллионов книг в различных языков.

Необработанные данные доступны по этой ссылке [7], хотя из-за огромного количества текста требуется значительное время для загрузки и компиляции в пригодное для использования состояние.

Вывод

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

Дальнейшие работы будут включать надлежащий тест с уже существующими популярными решениями и использование токенов n-грамм. А пока можно поэкспериментировать с этим пакетом: char2vec [1].

Предоставлено: Максенс Аллуин.

[1] https://github.com/Lettria/Char2Vec

[2] https://en.wikipedia.org/wiki/Phonetic_algorithm

[3] https://norvig.com/spell-correct.html

[4] https://github.com/wolfgarbe/SymSpell

[5] https://github.com/nmslib/nmslib

[6] https://books.google.com/ngrams/

[7] http://storage.googleapis.com/books/ngrams/books/datasetsv2.html