Як побудувати високоякісну систему для автоматичного виправлення граматичних помилок в англійській мові: досвід Grammarly

Усі статті, обговорення, новини про AI — в одному місці. Підписуйтеся на DOU | AI!

Сервіс Grammarly допомагає розв’язати широке коло мовних і комунікаційних завдань, які виникають під час написання текстів. Важливою складовою цієї допомоги є усунення орфографічних, пунктуаційних, граматичних і лексичних помилок, що в дослідженнях з обробки природної мови (natural language processing, NLP) називають загальним терміном «виправлення граматичних помилок» (grammatical error correction, GEC). Система, яка має на меті вирішити завдання GEC, отримує на вході речення з помилками й видає на виході виправлений варіант. За одинадцять років свого існування компанія Grammarly створила потужну GEC-систему, яка виступає одним із важливих компонентів нашого продукту.

Оригінальне реченняВиправлена версія речення
A ten years old boy go schoolA ten-year-old boy goes to school.

Останнім часом наукова спільнота підходить до задачі GEC як до перекладу: речення з помилками виступають як «мова оригіналу», а виправлені речення — як «мова перекладу». Поєднуючи NMT (neural machine translation, тобто нейронний машинний переклад) і моделі sequence-to-sequence, або seq2seq (послідовність-послідовність) на основі переважно таких архітектур нейронних моделей, як-от transformer (трансформер), групи дослідників досягають передових результатів згідно із загальноприйнятими еталонами. Зараз акцент досліджень у сфері GEC змістився на генерування даних для тренування таких систем на основі NMT.

Проте ці системи все ж краще підходять для наукових досліджень, ніж для практичного застосування. У системах на основі NMT зазвичай реалізована інфраструктура encoder-decoder (кодувальник-декодер), у якій функція encoder відповідає за розуміння мови, а функція decoder — за її генерування. Генерування мови — завдання складніше, ніж її розуміння. Отже, системи на основі NMT потребують значної кількості даних для тренування й багато часу на генерацію тексту. Крім того, без додаткової функціональності неможливо пояснити, помилки якого типу допущено в оригінальному висловлюванні, оскільки нейронна мережа — це фактично чорний ящик.

Щоб розв’язати ці проблеми, команда дослідників Grammarly спробувала інший підхід. Замість того, щоб явно генерувати весь текст та намагатися переписати все речення в правильному вигляді за один раз, ми позначаємо послідовність слів тегами спеціальних трансформацій, які описують потрібні виправлення.

Таке тегування послідовностей зводить завдання до розуміння мовних одиниць, тобто для нашої моделі достатньо лише encoder та базових лінійних шарів. Це дає змогу пришвидшити тренування та використання моделі за рахунок паралелізації обчислень при генеруванні тегів-виправлень. Завдяки тегам також стало можливо (хоча й не так просто) описувати внесені зміни, у зручному та зрозумілому вигляді. З радістю можемо стверджувати, що завдяки такому підходу наші моделі демонструють еталонну якість.

Цей підхід також став темою наукової роботи, яку у квітні 2020 року представили наші дослідники на 15-му семінарі з інноваційного використання NLP для розробки освітніх застосунків (15th Workshop on Innovative Use of NLP for Building Educational Applications (BEA)), який проводився разом із конференцією Асоціації комп’ютерної лінгвістики (ACL, Association for Computational Linguistics).

Трансформаційні теги

Наш підхід — тегування послідовностей — спирається на спеціальні теги трансформацій, які можна розглядати як абстрактні версії підказок Grammarly. Ми визначаємо ці теги на токенах, якими в NLP виступають одиниці тексту (зазвичай це слова, іноді знаки пунктуації — залежно від того, як виконується визначення структурних одиниць).

Наприклад, якщо токен позначено тегом $DELETE, це означає, що його запропоновано видалити. Тег $APPEND_{,} означає, що до цього токена потрібно додати кому, щоб текст відповідав правилам.

Кількість тегів стала важливим фактором нашого дослідження. Завеликий «словник» для опису виправлень зробив би модель громіздкою та повільною, а замалий не дав би змоги охопити достатню кількість помилок. Зрештою, ми зупинилися на 5 тисячах тегів трансформацій, що охоплюють найпоширеніші помилки, як-от правопис, число іменників, узгодження підмета з присудком і форми дієслів. Загалом цей обсяг тегів охоплює 98 % помилок, які трапляються в тестувальній частині CoNLL-2014, одному з двох наборів даних для завдань GEC, який ми використовували для оцінювання своєї моделі.

Загальні теги

Більшість тегів належать до чотирьох загальних типів.

  • $KEEP означає, що заданий токен правильний і має залишатись незмінним у тексті на виході.
  • $DELETE означає, що заданий токен потрібно видалити з тексту.
  • $APPEND_{t1} — це набір тегів, які додають новий токен до наявного. Поданий у фігурних дужках «суфікс трансформації» вказує, що саме потрібно додати. Наша модель оперує словником, що містить 1167 унікальних тегів типу APPEND.
  • $REPLACE_{t2} — це набір тегів, які заміняють токен оригіналу іншим. Наша модель має 3802 унікальні теги типу REPLACE.

G-трансформації

Решта наших тегів — це так звані «g-трансформації», які виконують складніші операції, як-от змінюють регістр поточного токена (теги CASE), об’єднують поточний і наступний токени в один (теги MERGE), розділяють поточний токен на два нові (теги SPLIT).

За допомогою g-трансформацій NOUN NUMBER і VERB FORM ми можемо перетворювати іменники в однині на їхні форми множини й навіть змінювати форму дієслів відповідно до потрібного числа або часу. Трансформація VERB FORM містить двадцять різних тегів, що описують початкову й кінцеву дієслівні форми, які наша модель виводить за допомогою словників дієвідмін. Наприклад, заміні слова «went» на «gone» відповідатиме такий тег: $VERB FORM VBD VBN. У перекладі з мови тегів запис VBD VBN означає, що в нас є дієслово в минулому часі, а нам замість нього потрібен дієприкметник у минулому часі.

Хоча тегів у категорії g-трансформацій небагато, вони дуже допомагають із виконанням нашого завдання. З використанням лише перших 100 основних тегів наша модель досягла 60% охоплення помилок; після додавання g-трансформацій обсяг охоплення помилок виріс аж до 80%.

Тренування моделі

Наша модель тегування послідовності для задачі GEC (яку ми назвали GECToR) складається з encoder частини та двох лінійних шарів, що відповідають за виявлення та виправлення помилок. Як encoder ми використовували попередньо навчені трансформери з сім’ї BERT моделей. Попереднє навчання нашої моделі відбувалося в три етапи. На першому етапі ми використовували набір синтетичних даних, до якого входили 9 мільйонів пар речень: із помилками й уже виправлених. На другому й третьому етапах ми дотреновували модель за допомогою кількох наборів реальних даних від осіб, які вивчають англійську мову: близько 500 000 речень на етапі 2 й усього 34 000 на етапі 3. Ми з’ясували, що дотренування у два етапи (спершу лише на реченнях із помилками, а потім додаючи речення, які не містять помилок) значно покращує якість виправлень, що генерує модель.

Попередня обробка даних

Алгоритм попередньої обробки даних генерує теги трансформацій для кожного токена оригінального речення на базі пари з оригінального та виправленого речення.

Розгляньмо ще раз наведений на початку статті приклад, щоб коротко проілюструвати, як це працює (додаткову інформацію можна отримати, переглянувши відповідний скрипт у нашому репозиторії).

Оригінальна послідовність: A ten years old boy go school

Виправлена послідовність: A ten-year-old boy goes to school.

Крок 1

По-перше, ми орієнтовно зіставляємо кожний токен оригінальної послідовності з одним або кількома токенами виправленої послідовності.

[A → A], [ten → ten, —], [years → year, —], [old → old], [go → goes, to], [school → school, .].

Для цього ми мінімізуємо загальну відстань Левенштейна можливих переходів між оригінальними та виправленими токенами. По суті, це означає, що ми намагаємося мінімізувати кількість змін, потрібних для трансформації оригінальної послідовності в виправлену.

Крок 2

Потім кожне зіставлення перетворюємо на тег, який позначає трансформацію.

[A → A]: $KEEP, [ten → ten, —]: $KEEP, $MERGE HYPHEN, [years → year, —]: $NOUN NUMBER SINGULAR, $MERGE HYPHEN], [old → old]: $KEEP, [go → goes, to]: $VERB FORM VB VBZ, $APPEND to, [school → school, .]: $KEEP, $APPEND {.}].

Крок 3

Оскільки ми використовуємо ітеративний підхід до тегування (докладніше описаний у наступному розділі), кожному токену може відповідати лише один тег. Тому якщо в одного токена є кілька тегів, на останньому кроці залишиться лише один: перший, відмінний від $KEEP.

A ⇔ $KEEP, ten ⇔ $MERGE HYPHEN, years ⇔ $NOUN NUMBER SINGULAR, old ⇔ $KEEP, go ⇔ $VERB FORM VB VBZ, school ⇔ $APPEND {.}.

Генерація тексту за допомогою ітеративного тегування послідовностей

Наша модель прогнозує закодовані тегами трансформації для кожного токена в оригінальній послідовності. Потім ми можемо застосувати ці трансформації, щоб отримати змінену модифіковану послідовність. Проте, оскільки деякі виправлення в реченні можуть залежати від інших, однократного застосування засобу тегування послідовності для завдань GEC може бути недостатньо, щоб повністю виправити речення. Тому ми використовуємо ітеративний підхід до виправлення: змінюємо речення, знову запускаємо процес тегування й повторюємо процедуру. Розгляньмо, який це має вигляд, на попередньому прикладі (виправлення позначені жирним шрифтом).

Оригінальна послідовність: A ten years old boy go school

Ітерація 1. A tenyears old boy goes school (загалом 2 виправлення)

Ітерація 2. A ten-year-old boy goes to school (загалом 5 виправлень)

Ітерація 3. A ten-year-old boy goes to school. (загалом 6 виправлень)

Зазвичай із кожною наступною ітерацією кількість виправлень зменшується — більшість із них відбувається під час двох перших ітерацій. Ми протестували свою модель із мінімум однією та максимум п’ятьма ітераціями і з’ясували, що зменшення кількості ітерацій прискорює загальний процес, але знижує якість виправлення.

Щоб зробити процес генерації гнучкішим, ми також ввели два додаткових гіперпараметри. По-перше, на рівні передбачення для кожного токена, ми додали можливість штучно збільшувати імовірність тегу $KEEP, який відповідає за те, щоб оригінальний токен не змінювався. По-друге, на рівні всього речення, ми додали можливість відсікати всі виправлення, якщо ймовірність, згенерована шаром для виявлення помилок, менша за заданий поріг. Так ми підвищили precision (точність), поступившись recall (повнотою). Значення цих гіперпараметрів були знайдені методом випадкового пошуку на основі BEA-2019 (dev), стандартного набору даних для завдань GEC.

Результати

Якість моделі

Використовуючи канонічні набори даних для GEC, ми отримали для одиничної моделі показники F-міри, які відповідають досягненням рівня state-of-the-art: F0,5=65,3 для тесту CoNLL-2014 і F0,5=72,4 для тесту BEA-2019. У разі ансамблевого підходу, коли береться середнє значення ймовірності на виході від трьох моделей, результати ще кращі: F0,5 у 66,5 і 73,6 для тих самих наборів даних відповідно.

Швидкість генерації

Вимірювання середнього часу, потрібного нашій моделі GECToR для генерації виправленої версії тексту, доводять, що вона приблизно в 10 разів швидша за попередні системи рівня state-of-the-art на основі NMT.

Система GECЧас, с
Transformer-NMT, ширина променя = 124,35
Transformer-NMT, ширина променя = 41,25
Transformer-NMT, ширина променя = 10,71
GECToR, 5 ітерацій0,40
GECToR, 1 ітерація0,20

У цій таблиці наведено час генерації на прикладі NVIDIA Tesla V100, тесту CoNLL-2014, одиничної моделі та набору речень розміром 128. Варто зауважити, що стратегія beam search (променевого пошуку), що широко використовується в NMT моделях, генерує слово перекладу зліва направо, зберігаючи фіксовану кількість активних кандидатів на кожному кроці (залежно від заданої ширини променя). Збільшення ширини променя підвищує якість, але водночас знижує швидкість генерації.

Моделі на основі NMT зазвичай авторегресійні, тобто кожний наступний згенерований токен залежить від усіх попередніх токенів, тож виправлення відбувається послідовно. Підхід GECToR не є авторегресійним і не має залежностей між передбаченими тегами. Таким чином GECToR добре паралелізується і працює значно швидше.

Відкриваємо нові горизонти GEC

Це дослідження доводить, що можна розробити швидшу, простішу й ефективнішу систему GEC — якщо ризикнути піти незвіданим шляхом. Перш ніж іти за трендом (у цьому випадку — GEC на основі NMT), варто запитати себе, чи не спробувати щось кардинально інше. Ви можете зазнати невдачі, але новий шлях може привести до цікавих відкриттів і кращих результатів.

Наукову статтю «GECToR — виправлення граматичних помилок: тегування замість переписування» (GECToR — Grammatical Error Correction: Tag, Not Rewrite) написали Костянтин Омелянчук, Віталій Атрасевич, Артем Чорнодуб і Олександр Скуржанський. Стаття була представлена на 15-му семінарі з інноваційного використання NLP для розробки освітніх застосунків, який проводився разом із конференцією ACL 2020. Матеріал перекладено й адаптовано спеціально для розміщення на DOU.

👍ПодобаєтьсяСподобалось2
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

А як взагалі з переносом подібних моделей на інші мови? З англійською ясно, є море корпусів і претренованих моделей, а якщо не англійська?

Конкретно ця система є мовнозалежною (мовнонезалежні системи поступаються якістю виправлень у більшості випадків), проте її можливо адаптувати для інших мов.
Для цього потрібно в першу чергу побудувати новий словник тегів-операцій характерних для обранної мови (це потребує лінгвістичної експертизи). Також нагенерувати багато синтетичних даних, що не надто складно і у якості encoder використати багатомовну версію трансформера (huggingface.co/...​formers/multilingual.html).

Звісно при наявності хоча б невеликого корпусу GEC речень специфічних для обранної мови, якість можна суттєво покращити за рахунок дотренування на цих даних. Сподіваюсь, що з часом ситуація з корпусами буде покращуватись для інших мов. Зокрема для української є ось така ініціатива:
ua-gec-dataset.grammarly.ai

Grammarly тупо вистрілила, попавши на ринок малограмотних користувачів. Оце і увесь досвід.
А за «високоякісну систему» розкажіть носіям. Мама мила раму — ось ваш рівень якості.

Але, по суті, це і є їх основна аудиторія. Можу уявити, що як україномовним не потрібно ніяких засобів для повідомлень українською (навіть в офіційній переписці, бо всім начхати,
і на ваші помилки зверне увагу тільки філолог), так само і англомовним не вперлось Грамарлі.

Але воно робить вигляд, що воно дуууже потрібне, що ви самі лайно та нічого не можете без їхньої допомоги. Приблизно так само, як людей підсаджують на фуфломіцин чи релігію. Комплекс вивченої безпорадності — от що таке насправді Grammarly.

В чому проблема просто не купувати продукт?) Підгорає — ось що насправді. Відчуття страху стати лайном висить у повітрі топірцем.

Відчуття страху стати лайном

по суті і є продукт. Звісно, люди які хоч трохи мають досвід живого спілкування, такий продукт як продукт не куплятимуть. Ви ж, звісно, скористалися п.8 Техніки безпеки.

Канадські середні школи купують Grammarly в державних масштабах.

Українські середі школи теж багато чого купують в державних масштабах. Все покраще і покраще.

Пєніє тупо вистрілив, попавши на ринок малограмотних користувачів. Оце і увесь досвід.
А за «високоякісний коментар» розкажіть іншим. Мама мила раму — ось ваш рівень якості.

ПС дякую за шаблон коментаря, і в правду зручно :)

Молодець. А тепер сам купи собі оте «щастя», за яке ти так сміливо йшов в бій проти повітряних млинів вентилятора

Я маю підписку на Grammarly, якраз рік завершився. Якщо коментар був про це.

Підписатись на коментарі