Изучение и применение орфографической коррекции в автономных системах распознавания рукописного текста

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

Во-первых, я хотел бы поблагодарить всех, кто связался со мной и отправил отзывы о других сообщениях / проектах, спасибо! Это меня мотивирует, и теперь я представляю новый проект.

В этом посте я расскажу о моем путешествии в этой области языка естественной обработки, поэтому здесь никаких кодов, а только мой опыт, некоторые концепции, которые я изучил, некоторые результаты и выводы. Если вы любитель кода, вот проект с учебником Jupyter Notebook и файлами python:

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

Вступление

Начиная с моей миссии здесь. Моей целью было изучить и представить некоторые альтернативы постобработке текста в HTR, потому что в настоящее время в этой области исследований инструментарий Kaldi с SRILM используется в выходных данных HTR посредством статистического подхода, таким образом улучшая распознаваемый текст. по оптической модели. ~ Это вся информация, которая у меня была ~

Исправление текста или Исправление орфографии. Что вы думаете? При первом поиске я обнаружил несколько статистических подходов, таких как методы Norvig и SymSpell, а также несколько тривиальных сомнений.

Что такое токен? н-грамм? фильтрация? лемматизация? Языковое моделирование? Где Калди и SRILM? И что еще позже, ‹EOS›? ‹SOS›? кодировщики? декодеры? внимание? многоголовое внимание?

Таким образом, я нашел этот отличный пост Deep Spelling и этот репозиторий GitHub. Итак, я увидел, что нейронные сети также развиваются в этой области. ~ C слушатели ~

На самом деле у меня было больше сомнений, чем я ожидал, но, с другой стороны, я знал, что буду использовать токены на уровне персонажа и показатели HTR (например, коэффициент ошибок символов и Word Error Rate) вместо токенов на уровне слов и показателей GER (например, Precision и BLEU). Наконец, моя цель тоже была бы проще, в отличие от подходов машинного перевода и исправления грамматических ошибок.

В конце долгого исследования я резюмировал существующие методы, которые я бы использовал в проекте (их, конечно, больше), а именно:

  • Статистические: Сходство (n-грамм), Norvig, Symspell, Kaldi + SRILM.
  • Нейронная сеть: Seq2Seq (внимание Бахданау и Луонга), Transformer.

Для эксперта эти методы обычные и ничего нового. Я согласен. Более новые подходы уже касаются Трансформера-XL и Развитого трансформера, но я предпочел идти простым и простым в этой задаче. Затем я постараюсь быстро объяснить каждый из них, а также используемые термины и методы.

Статистический подход

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

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

Жетоны и N-граммы

Ну, токены - это части нашей контекстной работы, то есть тексты. Все просто, правда? Нет! Что означают части текста ? И теперь у нас есть два подхода: это могут быть части слов (уровень слова) или части символов (уровень символов).

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

Но теперь, что такое n-граммовый подход? Представьте, как мы можем разделить (сегментировать) наш текст на несколько частей одинакового размера, не пропуская никаких комбинаций. Да, это n-грамм, где N - это размер, который мы хотим разделить. Мне очень нравится примерная фигура определения N-граммы из Википедии, простая, объективная и интуитивно понятная:

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

Сходство

Этот прием самый простой из всех. Он просто делает n-граммы из нашего набора данных и использует подход подобия для поиска возможного правильного текста. Подход подобия просто проверяет, сколько n-граммов разделяется между текстами, и наиболее часто используемое является потенциальным исправлением.

Я использовал модуль Python N-грамм. Простой и нечеткий поиск по производительности:

PyPI: https://pypi.org/project/ngram

Github: https://github.com/gpoulter/python-ngram

Норвиг

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

Я использовал модуль Python Pyspellchecker:

PyPI: https://pypi.org/project/pyspellchecker/

Github: https://github.com/barrust/pyspellchecker

SymSpell

Это мое удивление, SymSpell был первой техникой, которую я нашел, в этих замечательных сообщениях: Коррекция орфографии в 1000 раз быстрее и «SymSpell против BK-дерева: в 100 раз быстрее поиск нечетких строк и проверка орфографии". Да, по названиям вы могли заметить, что он быстрый.

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

Это изображение от автора Вольфа Гарбе, специально для сравнения скорости:

В любом случае, я использовал модуль Python Symspellpy (вы также можете найти его на нескольких других языках):

PyPI: https://pypi.org/project/symspellpy/

Github: https://github.com/mammothb/symspellpy

Исходный GitHub: https://github.com/wolfgarbe/SymSpell

Калди + SRILM

Хорошо, итак ... это подход, который я меньше всего понимал, самый сложный, который я нашел, однако наиболее часто используемый в HTR (по крайней мере, так мне сказали они), но быстрее (конечно, единственный на C ++) и с лучшими результатами.

Давайте сделаем это по шагам.

Kaldi - это набор инструментов для распознавания речи (да, распознавание речи), а SRILM - это набор инструментов для построения и применения статистических языковых моделей (LM).

Итак, нам нужно загрузить и скомпилировать исходный код двух инструментов и интегрировать их (Kaldi использует SRILM). После этого нам нужно будет выполнить некоторые команды Kaldi для декодирования вывода оптической модели (теперь список матриц прогноза, то есть вывод модели без прохождения через декодер CTC). В общем, Kaldi будет декодировать прогнозы, создавать языковую модель с использованием SRILM, создавать статистическую структуру с использованием скрытых марковских моделей, создавать лексические структуры, исправлять прогнозы и, наконец, декодировать в текст, используя словарь символов набора данных. Уфф !!!

Просто чтобы вы знали, Kaldi - очень хороший выбор, но я думаю, что это обходной путь для контекста HTR (извините за это). Почему? Спроси меня. Я действительно не знаю, просто чувствую, что нарушает процесс ...

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

Этот вывод представляет собой серию стандартизованных файлов для упрощения ввода Kaldi (вы можете получить эти файлы с помощью параметра kaldi_assets:]).

И, наконец, я использовал сценарий в проекте Коррекция орфографии, чтобы получить эти стандартизованные файлы, и наборы инструментов Kaldi + SRILM (уже скомпилированные вами) для автоматического выполнения / исправления. ~ Думаете, я сделаю это вручную? ~

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

Подход нейронной сети

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

Просто чтобы вы знали, процесс токенов такой же, просто забудьте пока о n-граммах, потому что здесь мы должны кормить модель с помощью чисел, а не текстов. Итак, я дополню эту тему One Hot Encoding и Embeddings.

Кодировать / декодировать токены

Чтобы работать с нейронной сетью, мы должны работать с числами. Затем, если мы работаем с токенами уровня символов, нам нужно использовать One Hot Encoding. Вместо этого токены уровня слова могут быть лучше с использованием подхода Embeddings.

Вкратце, One Hot Encoding - это преобразование текста в двоичную матрицу, сопоставление токенов. Для isntance:

Где ABC = [[1, 0, 0], [0, 1, 0], [0, 0, 1]]

Вкратце, встраивание - это преобразование текста в числа, а затем использование слоя встраивания в модель для вычисления дополнительной информации из текстов. Для isntance:

Где ABC = [1, 2, 3]

Я действительно, правда, упростил, но это действительно концепция. Кроме того, в обоих сценариях у вас есть специальные токены, предопределенные и обязательные в данном контексте. Специальные токены могут быть любым уникальным токеном во всем наборе данных, поэтому:

Начало предложения: чтобы указать начало предложения. Мы можем использовать ‹SOS› или ‹B› для уровня слова или какой-либо специальный символ для уровня символа.

Конец предложения: указывает на конец предложения. Мы можем использовать ‹EOS› или ‹E› для уровня слова или какой-либо специальный символ для уровня символа.

Пробел: для обозначения пробела в предложении. Мы можем использовать ‹SPACE› или ‹S› только на уровне слов.

Padding: для обозначения заполнения предложения (помните, что в нейронной сети входом являются матрицы закодированных текстов). Мы можем использовать ‹PAD›, или PAD, или ‹P› для уровня слова или какой-либо специальный символ для уровня символа. Другая интересная информация заключается в том, что существует стандартизация постоянного использования этого токена в первом индексе, то есть в индексе 0.

Неизвестно: указывает на неожиданный элемент, которого никогда не было в наборе данных. Мы можем использовать ‹UNK›, или UNK, или ‹U› для уровня слова или какой-либо специальный символ для уровня символа.

Чтобы было понятнее, вот несколько примеров для обоих уровней, кодирующих предложения «Я кодирую» и «Вы кодируете».

Во-первых, для одной горячей кодировки (уровень символов) мы будем использовать словарь символов, который отображает все возможности символов: [¶, t, d, I, Y,, u, e, c, o, «, ¤,»]. ~ вы видите специальные жетоны? ~

Итак, на самом деле мы кодируем:

«I code» ¶¶ → 10 токенов

«Ваш код» → 10 токенов

Потом:

Теперь для встраивания (на уровне слов) мы будем использовать словарь, который отображает все возможные варианты слов: [‹P›, I, You, ‹S›, code, ‹B›, ‹U›, ‹E›] ~ снова , видишь специальные жетоны? ~

Итак, на самом деле мы кодируем:

‹B› I ‹S› код ‹E› → 6 токенов

‹B› You ‹S› код ‹E› → 6 токенов

Потом:

Проще, правда? Это связано с тем, что слои Embeddings также будут преобразовываться в матрицы и добавлять дополнительную информацию с десятичными значениями вместо целочисленных значений (0, 1). Но нам не о чем беспокоиться.

О процессе декодирования. Что ж, со словарем в руках просто сделайте обратный процесс.

От последовательности к последовательности

Самый популярный подход в этой области, Sequence to Sequence или Seq2Seq для наиболее интимных, этот метод заключается в использовании рекуррентной нейронной сети для работы с текстом. «Работайте с текстом», потому что вы можете классифицировать, извлекать информацию, понимать чувства, исправлять, создавать диалоги и, среди прочего, все из текста. Я знаю, мощно.

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

Во всяком случае, концепция здесь такая же. Seq2Seq имеет одну модель кодировщика и декодера. Кодер получит состояния входа, которые будут переданы декодеру, который обработает состояния входа и состояния основной истины, чтобы дать результат предсказания. Сложно.

Если вы поняли выше, вы заметили, что существует более одного входа. Следовательно, в качестве входных данных для нашей модели мы имеем: (i) входные данные кодировщика; (ii) вход декодера (наземная истина); и для вычисления функции потерь: (iii) истина. Суть в том, что каждый из этих входов имеет свою кодировку (текст → число). Потом:

Вход с помощью кодировщика: ‹S› your_text ‹E› ‹P› ‹P›…

Ввод декодера: ‹S› your_text ‹P› ‹P›…

Подлинная правда: your_text ‹E› ‹P› ‹P›…

Существует несколько подходов к кодированию входных данных кодировщика. Однако эта, которую я представил, охватывает текущие модели (использующие двунаправленные рекуррентные нейронные сети # спойлер).

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

Bahdanau Внимание

Все изменилось с появлением слоя Внимание, предложенного Bahdanau (изначально в 2014 году). Теперь точность моделей повысилась с 60% до 95%. Просто применяя процесс внимания между состояниями кодировщика и декодера.

А что означает процесс Внимание? в общем и быстро, внимание - это «выравнивание» между двумя векторами / матрицами на основе оценок. Богданов предложил рассчитывать эти баллы на основе конкатенации. Это делает обработку, использование памяти и время обучения усугубляющим фактором, хотя дает прекрасные результаты и в настоящее время чаще всего используется наиболее известными инструментами НЛП.

Луонг Внимание

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

Трансформатор

Наконец, модель Transformer или Multi-Head Attention от Vaswani et al. (2017) и с лучшим титульным листом Внимание - это все, что вам нужно.

Я действительно возлагал большие надежды на эту модель и шаг за шагом следовал превосходному руководству Google (Transformer Model for Language Understanding).

Концепция действительно интересная. Также используйте процесс скалярного произведения, но здесь нет повторяющихся слоев, только внимание. Да, здесь процесс основан только на рекурсивном внимании или самовнимании.

Плохая вещь - это процесс декодирования. Потому что если для декодирования используется рекурсия. Мой контекст заключался в использовании предложений со 128 токенами (высокое значение для обычного). Затем представьте себе декодирование «Самовнимание» в цикле токен за токеном, предложение за предложением. Если вы потратите много времени, это будет для меня огромным компромиссом, потому что он очень быстро тренируется и дает очень хороший результат, но медленно декодирует. ~ Мне нужно ввести код на C ++! ~

Как бы то ни было, сегодня есть исследования, направленные на решение этой проблемы, улучшающие, конечно, результаты (например, Transformer-XL и Evolved Transformer).

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

Наборы данных

Этот шаг сложен для области HTR. Позвольте мне объяснить, как машинный перевод, так и исправление грамматических ошибок имеют огромные наборы данных для работы с текстом. Могу перечислить BEA2019, CoNLL13, CoNLL14 и One Billion by Google (проект их поддерживает:]). В этих наборах данных нет методологии разделения, поэтому мы можем разделить его на 10% для проверки, 10% для тестирования и остальное для обучения. Обучение будет работать нормально, и по прошествии длительного времени наша модель предскажет исправление предложения. Пока все ОК.

Однако я хочу работать с наборами данных HTR, чтобы исправить их, используя небольшую модель. Здесь я перечисляю Бентам, ИАМ, Римз, Сент-Галл, Вашингтон. Кроме того, целью этих наборов данных является только распознавание текста на изображении для цифровой среды. Вот тут и возникли проблемы.

Первая проблема - нехватка данных. BEA2019 содержит около 35 тысяч предложений, в то время как в самом большом наборе данных HTR, к которому я имел доступ, их было 11 тысяч.

Вторая проблема, наиболее серьезная, - это отсутствие распределения токенов в рамках разбиения наборов данных HTR. А почему самое серьезное? Что ж, мы не можем обучить модель выучить «Я знаю» и поставить предложение «Я знаю» для предсказания. Результатом будет «Да» (неверно), потому что модель не знает о существовании токена «потребности» и затем исправляет его правильно.

Мне потребовалось много времени, чтобы осознать это, и единственным решением (не идеальным), которое я нашел, было создание новых предложений из набора данных с использованием n-граммов на уровне слов (да !!). Процесс в чем-то похож, но вместо того, чтобы просто использовать значение N, мы собираемся использовать некоторые значения и некоторые ограничения. Я назвал его мультиграммами, чтобы облегчить понимание. Итак, чтобы проиллюстрировать:

Используя разделенный набор данных, я перераспределил мультиграммы в разделах для обучения и проверки (чтобы поддерживать соотношение 10%) и сохранил исходный тестовый раздел. Это значительно увеличило объем данных.

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

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

Бентам

База данных Бентам представляет собой собрание рукописей, написанных английским философом Джереми Бентам (1748–1832).

Я

База данных Institut für Informatik und Angewandte Mathematik (IAM) содержит формы с английскими рукописями.

Иней

База данных Reconnaissance et Indexation de données Manuscrites et de fac similÉS (Rimes) представляет собой собрание текстов, написанных на французском языке.

Saint Gall

В базе данных Saint Gall собраны рукописи на латыни IX века.

Вашингтон

Наконец, база данных Вашингтон (меньшая) была создана из Записок Джорджа Вашингтона (англ.) В 18 веке.

Настройка эксперимента

На этом этапе для статистического подхода использовался обычный процесс: создание корпуса из набора данных; создание словаря / языковой модели с вхождениями; найти лучшее значение N для этого набора данных + метод; наконец, получите возможное исправление.

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

Специально для этого контекста нейронных сетей, коррекции орфографии и HTR я использовал уровень символов (One hot enconding) и сохранил исходное разбиение наборов данных (с добавлением мультипрограмм при обучении и проверке).

Кроме того, я не привел результаты, используя Bahdanau Attention и модель Transformer, поскольку они не соответствовали моим ожиданиям (например, время обучения или декодирования), но я также сохранил реализацию кода в репозитории проекта.

Таким образом, я использовал комбинацию модели Bahdanau (которая приносит шаг кодировщика с двунаправленным слоем), используя Gated Recurrent Layers (вместо обычного LSTM), используя Luong Attention с Layer Normalizaton после (последнее я узнал из модели Transformer). ~ да, отличный микс ~

Наконец, я оставил единицы измерения на уровне 512 и оставил 0,2 (нормальное значение для небольших моделей), используя пакеты со 128 предложениями. ReduceLRonPlateau и Early Stopping также применялись через 15 и 20 эпох без улучшения значения потери валидации соответственно.

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

Шум

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

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

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

Кроме того, мне пришлось пойти немного дальше, поскольку этот проект связан с моим проектом HTR, поэтому я добавил еще две возможности в remove mode, а именно: accentuation и повторяющиеся буквы последовательно. Итак, я сохранил процент сгенерированных ошибок от 10% до 15%, как вы можете видеть ниже в примере:

Метрики

В отличие от машинного перевода и показателей GER (таких как точность или BLEU), которые нацелены на более глубокую и семантическую оценку исправления. Здесь я внес еще одно изменение в области оптического распознавания символов (OCR). Итак, я использовал показатели частоты ошибок символов (CER), частоты ошибок слов (WER) и частоты ошибок последовательности (SER).

Помимо показателей OCR, я также проанализировал время в секундах при выполнении коррекции / прогноза для каждого элемента.

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

Google Colab: обучающий режим

Наконец, все тренировки и прогнозы проводились на платформе Google Colab. Платформа предлагает операционную систему Linux с оперативной памятью 12 ГБ и графическим процессором Nvidia Tesla P100 объемом 16 ГБ. ~ еще раз спасибо, Google ❤❤ ~

Полученные результаты

Сначала объясним, что все входы - это выходы первого проекта (HTR). При этом у нас есть 5 наборов данных и 3 архитектуры оптических моделей (Bluche, Flor, Puigcerver). Таким образом, существует 15 типов входных данных для 5 подходов, используемых в этом эксперименте (4 статистических и 1 Se2Seq). ~ много результатов ~

В целом результаты были благоприятными для Seq2Seq, особенно если входной сигнал имеет низкий уровень ошибок. Однако среда выполнения осталась с Kaldi + SRILM (конечно!). Но интересно отметить, что SymSpell близок по скорости и результату (помните, c ++ vs python !!). Кроме того, подход Norvig имел самое медленное время выполнения, а подобие - худший результат.

Бентам

Набор данных Бентама дал очень близкие результаты. Входные данные Bluche имеют ошибку почти 13%, при этом обучение модели составляло от 10% до 15%, поэтому Seq2Seq проиграл Kaldi в этой архитектуре (только значение CER). Тем не менее, Seq2Seq достиг невероятных 2,91% CER, 6,75% WER и 33,12% SER.

Некоторые примеры исправлений:

Я

Набор данных IAM был самым сложным по токенам в его предложениях. Опять же, входные данные Bluche имеют ошибку почти 13%, затем Seq2Seq проиграл Kaldi в этой архитектуре (только значение CER), а Seq2Seq достиг 2,85% CER, 6,41% WER и 32,65% SER.

Некоторые примеры исправлений:

Иней

Набор данных Rimes начинает становиться интересным, поскольку предложения имеют определенный контекст и улучшается совместное использование токенов. Seq2Seq достиг 1,71% CER, 4,88% WER и 23,71% SER. ~ фантастический ~

Некоторые примеры исправлений:

Saint Gall

Набор данных Saint Gall также был легким, потому что он представляет собой латинский язык, потому что он имеет латинский язык, в нем нет знаков препинания или ударения. Количество токенов было наименьшим. Seq2Seq достигает 2,11% CER, 5,03% WER, 24,53% SER.

Некоторые примеры исправлений:

Вашингтон

Наконец, у Вашингтона самая маленькая база данных, но не такая сложная, как IAM или Bentham. Seq2Seq имеет 1,29% CER, 2,97% WER, 16,88% SER. Большинство ошибок было сосредоточено в нескольких предложениях.

Некоторые примеры исправлений:

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

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

Заключение

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

  • SymSpell - отличный вариант для быстрого и практичного внедрения и получения хороших результатов. ~ здесь не на что жаловаться ~
  • Kaldi + SRILM - хорошая альтернатива и мощный инструмент, однако я считаю его довольно трудоемким и сложным (особенно для новичков вроде меня). С этой точки зрения, было бы лучше потратить немного больше времени и усилий на выполнение модели Seq2Seq / Transformer для этой задачи.
  • Я понял, что модели кодировщиков-декодеров все еще только начинаются в области HTR, даже с хорошими результатами, это еще не весь потенциал, который они могут предложить. Возможно, мы можем сказать, что область исследований HTR еще не оставила позади статистический подход, усложняя, например, работу с несовместимыми / ограничивающими наборами данных. ~ Я знаю, что это непросто, но никто не сказал, что это будет ~

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

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