SAGE: коррекция орфографии с помощью языковых моделей |
||
|
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2023-10-10 11:43 Коррекция правописания является одной из основополагающих задач в области Natural Language Processing (NLP). Достаточно прозаичная формулировка и кажущаяся жёсткой структура орфографической системы скрывают под собой нетривиальные внутриязыковые взаимодействия, являющиеся традиционно сложными для языковых моделей. В этом посте мы расскажем, как решали эту проблему внутри SberDevices, и как это привело к созданию проекта по исследованию задачи коррекции текста. SAGE (Spelling correction via Augmentation and Generative distribution Emulation) — это проект, целью которого является изучение и решение проблемы коррекции правописания (далее по тексту «спеллчекинг» или «спеллчек», от английского «spellcheck»). На текущий момент мы представляем:
Подробно наши наработки и эксперименты описаны в наших статьях A Methodology for Generative Spelling Correction via Natural Spelling Errors Emulation across Multiple Domains and Languages (review EACL 2024) и Augmentation methods for spelling corruption (Dialogue-2023). Что будет дальше
Задача Начнем с постановки. В наивной формулировке задача коррекции правописания звучит довольно просто: все слова привести к норме языка (в этом случае и далее по тексту будем называть «нормой языка» словарные эквиваленты словоформ), учитывая согласование между членами предложения*. Такая постановка однако может приводить к потере эмоциональной и даже смысловой палитры исходного текста, что на практике выражается в излишних и местами ненужных исправлениях пользовательского ввода. * строго говоря, это выходит за рамки орфографии и вовлекает в дискуссию грамматику, но будем считать, что грамматические ошибки тоже нужно исправлять. Рассмотрим пример: ОМГ, какооооой фильм, сто проц побегу смотртеь)) Следуя наивной формулировке задачи нужно исправлять «какооооой», «проц» и «смотртеь». И если в случае с «смотртеь» можно с большой долей достоверности сказать, что это опечатка, то «какооооой» и «проц» представляют собой скорее намеренные искажения нормы языка с целью насыщения текста большей экспрессивностью, либо сленг, который более удобен пользователю в обращении. Подобные размышления приводят к тому, что исправление всех слов на их словарные эквиваленты кажется избыточным. Большую роль в принятии решения исправлять / не исправлять играет контекст, а также смысловая и эмоциональная составляющие исходного текста. Определить, где пользователь намеренно «ошибается», а где опечатался или просто написал неправильно по незнанию — задача не из лёгких (если вообще из решаемых) ввиду многообразия словоформ в русском языке и их потенциальных взаимодействий. Наиболее очевидным решением в этом случае является сбор коллекции подобных примеров, — где «ошибка» на самом деле является необходимой и убирать её не стоит, так как она задумана пользователем. Кроме этого необходимо дополнить коллекцию текстами, где ошибка — действительно нарушение нормы языка и не обнаруживает собой авторскую задумку. В нашей работе мы также хотели исследовать границы применимости современных языковых моделей и их способность адаптироваться к новым задачам, поэтому мы решили отказаться от традиционных словарных подходов и решать проблему коррекции орфографии в генеративном стиле, то есть исправляя текст на лету. Однако, как всегда, нужно сначала собрать выборку подходящих примеров, что приводит нас к следующему шагу исследования. Датасеты Кроме неоднозначной постановки задача коррекции правописания предлагает практически полное отсутствие качественных датасетов. На момент старта нашей работы был известен только один параллельный вручную размеченный датасет — RUSpellRU с соревнования SpellRuEval Dialogue-2016. RUSpellRU отражает идею о влиянии контекста на решение об исправлении ошибки, но покрывает всего лишь один домен интернет-блогов и состоит из 4000 примеров, что кажется недостаточным для обучения качественного инструмента. Было решено сделать новый датасет, а затем объединить все существующие, чтобы получилась коллекция датасетов (или бенчмарк) для оценки систем коррекции орфографии. Первым делом мы собрали исходный текстовый материал. Критериями были: разнообразие доменов и наличие потенциальных ошибок (то есть, например, тексты википедии брать практические бесполезно, так как опечатки и ошибки там встречаются довольно редко). Таким образом, остановились на следующих доменах:
Чтобы сузить круг примеров, которые будут отправлены на ручную разметку, мы проверяли тексты с помощью Yandex.Speller и оставляли только те, в которых он заметит ошибку, а потом просматривали отсеянные тексты и убирали ложные срабатывания. Затем тексты отправлялись на Яндекс.Толоку и размечались в два последовательных этапа:
Особое внимание мы уделили подбору разметчиков и разработке инструкций, по которым размечались тексты. В первой итерации мы требовали прохождение экзамена на знание русского языка и использовали контрольные задания для фильтрации и проверки качества разметки. В результате было отсеяно 85% всех разметчиков прошедших тестовую итерацию. Остались лишь те, кто не совершил ни одной ошибки. С ними мы продолжили разметку на следующих итерациях. Итоговая статистика процедуры разметки по 5 доменам представлена в таблице: Постановка задачи была нетривиальной, поэтому необходимо было составить подробную инструкцию для разметчиков. Мы описывали достаточно общие рекомендации касательно просторечий, сленга, сокращений, аббревиатур, диалектизмов и заимствований, призывая оценивать корректность их употребления с точки зрения контекста. Нестрогость инструкции мы старались компенсировать тщательным отбором разметчиков и их языковым чутьём. Так выглядит итоговая статистика числа текстов после всех процедур разметки: ![]() В процессе работы над нашими датасетами мы столкнулись с проблемой нехватки открытых данных для доменных областей. Было найдено два корпуса, содержащих естественные ошибки. Это сет медицинских анамнезов и мультиязычная коллекция коммитов гитхаба. Такие датасеты содержат в себе характерные особенности области использования языка и потому представляют собой ценный ресурс. Поэтому, если у вас есть данные для спеллчека, — мы открыты для коллаборации. Мы прогнали найденные сеты через второй этап ручной разметки и получили итоговую статистику по собранным корпусам: По итогу мы создали хаб с датасетами, посвящёнными задаче коррекции правописания и объединёнными в один бенчмарк. Бенчмарк доступен на HuggingFace, и вы можете использовать его стандартными средствами библиотеки В бенчмарке на текущий момент доступны следующие датасеты:
Несмотря на то, что размеченные параллельные датасеты сами по себе являются ценным ресурсом, первоначальная цель заключалась в сборе их именно в качестве коллекции для обучения моделей спеллчека, к чему мы и переходим в следующем разделе. P. S. С английскими датасетами все получилось проще — мы взяли существующие признанные и изученные датасеты BEA60k и JFLEG, так как проблема коррекции текста для английского языка представлена шире в плане датасетов. Эксперименты После нескольких экспериментов с простым дообучением на имеющемся датасете RUSpellRU и провальными результатами, мы быстро поняли, что решать задачу необходимо основательнее. Следующие несколько разделов посвящены нашей методологии. Выбор моделей Задача генеративного спеллчека, то есть генерации правильного текста по некоторому входному, хорошо ложится в парадигму sequence-to-sequence задач, поэтому очевидным выбором было попробовать описанные в этом посте модели семейства FRED-T5 (на момент написания данной статьи лучшая модель на лидерборде RussianSuperGLUE) и T5 для английского языка. Однако, в целях исследования возможности использования моделей для перевода в задачах генерации произвольного текста, было решено расширить линейку используемых моделей. Опираясь на статью, описывающую zero-shot генерацию парафраз с помощью моделей перевода, мы решили попробовать M2M100 в нашей задаче. M2M100 — это мультиязычная модель для перевода текста со 100 языков на 100 языков, среди которых есть и русский. Мы выбрали русские и часть английских токенов из словаря модели, убрали эмбединги, которые не соответствуют этим токенам, и переоборудовали токенайзер под новый набор токенов. После этого мы начали разработку процедуры предобучения. Задача искажения правописания Искажение правописания — это задача, обратная задаче исправления ошибок. Аугментация данных с помощью вставки опечаток — идея не новая, но эффективная. Мы решили подготовить процедуру предобучения на основе этого метода. Процедура организована следующим образом:
После нескольких экспериментов со стратегиями вставки ошибок, стали очевидны две вещи:
И если вторую проблему решить не сложно, то первая требовала более тщательной проработки. Ествественно, взять корпус, в котором предположительно много ошибок, -— не решает проблемы, потому что мы не можем получить коррекции в автоматическом режиме. Вставлять ошибки вручную — долго и дорого. Очевидна необходимость делать это автоматически, при этом делать качественно, с той точки зрения, что синтетические ошибки должны напоминать то, как выглядят естественные ошибки. Для решения этих проблем были разработаны два метода расстановки ошибок, каждый из которых по-своему основан на статистике естественных опечаток. Оба метода подробно описаны в нашей статье с конференции Dialogue-2023, а их код вместе с демо есть в нашей открытой библиотеке SAGE. Статистический алгоритм Идея проста: мы хотим имитировать поведение человека, когда он совершает ошибки в тексте. В первую очередь мы постарались описать ошибку числовыми характеристиками, чтобы потом можно было их воспроизводить на корректных текстах:
Далее нам нужен параллельный корпус: тип ошибки определяется относительно корректного предложения, то есть определить тип ошибки по одному исходному предложению без коррекции не получится. По всему корпусу собираем статистику по трём величинам и приводим их к дискретным распределениям. Таким образом, получается распределение числа ошибок, их типов и позиций (внутри каждого типа). Математическое описание корректности всех введённых определений и вытекающих свойств описаны в нашей статье. Непосредственно шаг эмулирования ошибок в изначально корректных текстах довольно прост: берём текст, выбираем количество ошибок, для каждой ошибки выбираем тип ошибки и её относительную позицию в предложении, потом масштабируем относительную позицию в абсолютную, выбираем подходящее место в «доверительном интервале» вокруг абсолютной позиции и вставляем ошибку. Отдельно стоит упомянуть, как определять тип и позицию ошибки. Для этого мы:
Такая постановка позволяет определять корректность работы алгоритма расстановки ошибок в том числе визуальными средствами: можно взять параллельный датасет, считать распределения ошибок, «обучить» статистический алгоритм, взять коррекции из исходного датасета, расставить там ошибки и сравнить полученные распределения и исходные. Визуальное сравнение проводится на графиках распределений числа ошибок на предложение, их относительных позиций в предложении и типов ошибок: ![]() Augmentex Этот метод аугментации строится на статистических данных и эвристиках, основанных на поведении человека при использовании клавиатуры. Наверное каждый за собой замечал, что при печатании допускает одни и те же ошибки, которые можно выделить в определенные подгруппы: написание слов с ошибками, промахивание пальцем по клавише, смену мысли и как следствие употребление слов в неправильном порядке, залипание клавиш и другие. Отсюда и появилась идея сделать общий инструмент с гибкими настройками для таких ошибок, чтобы в следствии обучать нейросети понимать ошибки. Для удобства использования мы поделили их по принципу атомарной единицы, на которой каждый тип аугментаций работает:
Вы можете контролировать количество аугментаций, используя три основных параметра: min_aug, max_aug и unit_prob. Последний отвечает за количество аугментаций, указывая количество процентов слов или символов исходной строки, к которым следует применить аугментации. Первые два параметра задают нижний и верхний пределы количества применений аугментаций к фразе. Также есть четвертый параметр batch_prob, который используется в методе aug_batch и указывает процент фраз, к которым будут применены аугментации в пакетной обработке. На момент написания статьи библиотека поддерживает только русский язык, но в будущем разнообразие языков будет расширяться. Статистика ошибок была взята из репозитория открытых лингвистических датасетов. Ниже мы приводим краткое описание всех методов:
С исходным кодом и примерами работы можно ознакомиться в репозитории Augmentex. Предобучение Мы рассказали о двух методах, с помощью которых проводили эксперименты по подготовке текстов для обучения моделей. Для того, чтобы подготовить корпуса для предобучения, мы использовали статистический метод, статистику брали с обучающей части датасета RUSpellRU. В качестве корректных текстов брали дамп русскоязычной Википедии и транскрипции русскоязычных видео. Из обоих доменов взяли по 3,5 Гб текстов, предварительно убрав все неалфавитные символы (брали русский и английский алфавиты) и тексты короче 40 символов. На этом корпусе мы обучали три модели: M2M100-1.2B обучалась около двух недель на 8 A100, чтобы обучить M2M100-418M нужно было 2 карты A100 в течение полутора недель, а FredT5-large обучался около недели на тех же 8 картах. Для предобучения англоязычной модели брали 6 Гб текстов: по 3 Гб из Википедии и новостных блогов, заранее обработанных по той же методологии. T5-large обучалась аналогично FRED’у — неделю на 8 картах A100. Дообучение Мы провели большое количество экспериментов с предобученными моделями, чтобы выяснить эффективность процедуры предварительного обучения на зашумлённых данных. Для русскоязычных моделей мы замеряли качество предобученных моделей как в формате zero-shot (без дополнительного обучения), так и при дообучении на имеющихся датасетах. Для англоязычных моделей померили только zero-shot, чтобы сравниться с аналогами из статей. Дообучение мы проводили на четырёх собранных корпусах, описанных в секции про датасеты. RUSpellRU и MultidomainGold каждый включают в себя наборы для обучения и тестирования, в то время как в MedSpellchecker и GitHubTypoCorpusRu есть только тестовый срез данных. Модели дообучались на каждом из RUSpellRU и MultidomainGold по отдельности, а также на объединённом датасете. Мы получили следующие результаты: ![]() Чтобы посмотреть, как методы аугментации, которые мы описали в главе Задача искажения правописания, влияют на поведение моделей во время дообучения, мы также аугментировали каждый из обучающих наборов с помощью Augmentex и статистического метода. Чтобы сравнение было как можно более честным, мы использовали две стратегии аугментации:
Табличка с результатами получилась объёмной, однако содержит интересные наблюдения: ![]() Мы оценивали в первую очередь способность алгоритмов генерации искусственных ошибок улучшать метрики существующих решений (в таблице они обозначены Best-of-FT/PT.). Как видно из результатов экспериментов, и Augmentex, и статистический метод способны улучшать результаты моделей спеллчека не только путём подготовки корпусов для предобучения, но и в качестве эффективной аугментации текстов уже содержащих естественные ошибки. Сравнение с ChatGPT и с открытыми спеллчекерами Мы сравнивали наши решения для русского и английского языков с моделями от OpenAI (gpt-3.5-turbo-0301 gpt-4-0314; text-davinci-003) и с публичными системами. В качестве открытых корректоров для русского языка мы взяли Hunspell, Jamspell и Yandex.Speller, для английского языка — модели из проекта Neuspell (не стали брать Hunspell и Jamspell по той причине, что модели из Neuspell тоже с ними сравниваются и превосходят). Для сравнения с моделями OpenAI были написаны три промпта (точнее сказать, оставлены после проб, ошибок и эмпирической валидации) для русского и английского языков, с которыми мы впоследствии запускали модели. Анализируя полученные результаты, мы отобрали лучшие комбинации модель-промпт и сравнились с нашими моделями и открытыми решениями. Результаты представлены в таблицах: ![]() ![]() Выбранные комбинации модель-промпт для русского языка:
Выбранные комбинации модель-промпт для английского языка:
Наше лучшее решение В ходе экспериментов, мы получили модель, которая обходит открытые спеллчекеры и модели OpenAI на большинстве датасетов, на которых мы проводили замеры: ![]() Модель на базе M2M100-1.2B обучалась на 7 Гб параллельных текстов из Википедии и транскриптов видео, с правописанием, предварительно искажённым при помощи статистического метода, семь эпох в течение двух недель. Затем она дообучалась на комбинации датасетов RUSpellRU и MultidomainGold. Существенный прирост в метриках относительно других решений является следствием двухэтапного обучения модели на обширном текстовом корпусе, покрывающем различные текстовые домены, типы и распределения как естественных, так и искусственно сгенерированных ошибок. Кроме того, мультиязычная природа исходной модели может способствовать более стабильному обучению на задачах со сложными внутриязыковыми взаимодействиями. Это решение мы обернули в AI Service, который доступен в Cloud по внутренней ссылке для зарегистрированных пользователей. Базовое использование модели в AI Service подразумевает работу с уже обученной моделью в режиме инференса. Мы предоставляем API для взаимодействия с нашей лучшей моделью, которая умеет переписывать переданный текст без ошибок. На вход подаётся оригинальный текст в поле text, модель генерирует текст без ошибок и выдаёт результат: На сегодняшний день решение публикуется в виде beta версии и открыто для использования. Мы будем рады обратной связи ;) SAGE Результаты исследования мы обернули в библиотеку SAGE:
Библиотека открытая, её код находится здесь, есть также демо по работе с инструментами аугментации, а также демо как пользоваться моделями и датасетами. Вместо заключения: мы открыты для новых экспериментов и языков Сегодня мы рассказали про проблему коррекции правописания и про то, как мы её решали с помощью генеративных языковых моделей. Мы открыты для коллаборации и готовы продолжать исследования в данной области и дообучение моделей на других языках. Если у вас есть идея, на каком языке ещё стоит дообучить спеллчекер, есть данные и новые домены, а также желание с нами коллаборировать, пишите пожалуйста нам в ТГ-коммьюнити SaluteTechGroup и авторам статьи. По вопросам связанным с продуктизацией решения и использованием API Cloud — пожалуйста, напишите на почту. Ccылки:
модели-correction Команда разработчиков: SberDevices, AGI NLP — идея и обучение моделей и команда SberDevices, Собеседника — создатели Augmentex@Andriljo, @e0xextazy <3 Источник: habr.com Комментарии: |
|