Неносители английского языка – это те, чей родной язык не английский. По некоторым оценкам, их число превышает число носителей языка как минимум в два раза. Изучение иностранного языка, такого как английский, особенно носителями языка, требует погружения и интенсивной практики, которые не всегда могут поддерживаться учителями, репетиторами, корректорами и т. д. Более того, продолжающаяся пандемия Covid-19 привела к чрезвычайный акцент на самостоятельном, компьютеризированном и онлайн-изучении различных областей, включая языки. За прошедшие годы был разработан ряд поддерживаемых компьютером методов и инструментов, помогающих в изучении языка. Исправление грамматических ошибок (GEC) является ключевой задачей в этой области. GEC можно определить как автоматическое обнаружение и исправление грамматических ошибок в письменном тексте. GEC превратился в важную область исследований в области обработки естественного языка (NLP). Для решения проблемы GEC было разработано множество методов НЛП; некоторые из них: основанные на правилах, синтаксические, основанные на машинном переводе и т. д. Экспериментируя с MT, я обнаружил классный трюк, связанный с GEC для английского языка, который я опишу ниже. Позвольте мне сделать четкое заявление о том, что все, что я обсуждаю, еще не предназначено для того, чтобы быть готовым к использованию методом или алгоритмом GEC. Мы не будем выявлять грамматические ошибки отдельно или явным образом в дальнейшем, а попытаемся исправить грамматические ошибки напрямую, если таковые имеются.

Модели Neural MT (NMT) на основе преобразователя привели к значительному улучшению качества МП. Доминирующий подход к GEC состоит в том, чтобы рассматривать его как проблему NMT между двумя языками: ввод, возможно, является грамматически неправильным текстом, а вывод - соответствующим грамматически правильным (отредактированным) текстом. Однако вместо этого мы можем рассматривать это как проблему перефразирования — правильный текст следует рассматривать как перефразирование, возможно, неправильного входного текста. Как сделать это перефразирование? Для достижения желаемого эффекта перефразирования мы будем использовать перевод туда и обратно между двумя языками, например, английским и немецким. Мы должны выбрать английский в качестве исходного языка в начале первого путешествия вперед, так как мы хотим исправить ошибки во входном тексте на английском языке. Затем мы переводим текст на целевой язык, скажем, на немецкий, а затем совершаем обратный перевод с немецкого на английский. Этот окончательный результат перевода в конце пути туда и обратно соответствует желаемому английскому тексту. Я обнаружил, что конечный результат имеет тенденцию быть грамматически правильным, даже если исходный английский текст не таков. Интуиция такова, что машина способна произвести семантически и грамматически правильный перевод, даже если ввод может быть грамматически неверным. Беспрецедентная точность и надежность моделей NMT на базе Transformer являются основой этого явления. Выбор целевого языка, конечно же, зависит от наличия системы NMT, способной осуществлять перевод в обоих направлениях. Это больше не является строгим требованием, поскольку одна и та же инфраструктура NMT может быть обучена переводу между несколькими языками. Позвольте мне проиллюстрировать идею GEC ниже.

Мы воспользуемся набором инструментов Facebook AI Research Fairseq для быстрого эксперимента; набор инструментов общедоступен в эхо-системе PyTorch Transformer. Согласно его веб-странице, «Fairseq — это набор инструментов для моделирования последовательностей, который позволяет исследователям и разработчикам обучать пользовательские модели переводу, обобщению, языковому моделированию и другим задачам генерации текста». Всю приведенную ниже работу можно выполнить с помощью блокнота Google Colab. Для начала давайте импортируем и установим необходимые пакеты; затем загрузите модели (обратите внимание, что размер файлов большой):

!pip install fastBPE regex requests sacremoses subword_nmt
import torch
# Load Transformer-based round-trip translation models between English and German:
en2de = torch.hub.load(‘pytorch/fairseq’, ‘transformer.wmt19.en-de.single_model’, tokenizer=’moses’, bpe=’fastbpe’)
de2en = torch.hub.load(‘pytorch/fairseq’, ‘transformer.wmt19.de-en.single_model’, tokenizer=’moses’, bpe=’fastbpe’)
en2de.eval()  # disable dropout
de2en.eval()  # disable dropout

Как следует из названий, en2de и de2en соответствуют англо-немецкой и немецко-английской моделям NMT соответственно. Если вы получаете сообщение об ошибке отсутствия зависимостей, связанное с гидрой и омегаконфом, во время вышеуказанного шага, сначала установите гидру, как показано ниже (не пропускайте флаг обновления), а затем вернитесь и повторите описанный выше шаг.

!pip install hydra-core — upgrade

После загрузки двух моделей мы готовы попробовать пример. Давайте рассмотрим английское предложение «Люди едят много!» в качестве входных данных. Это грамматически неправильно, так как «Люди» — собирательное существительное, для которого вместо формы единственного числа «ест» следовало бы употреблять форму множественного числа «есть». Давайте попробуем пример:

orig_sent = ‘People eats a lot!’
paraphrase_de = de2en.translate(en2de.translate(orig_sent))
print(“orig_sent: {}”.format(orig_sent))
print(“paraphrase_de: {}”.format(paraphrase_de))

В приведенном выше фрагменте «paraphrase-de» — это наш вывод перевода туда и обратно. Результат после запуска кода:

orig_sent: People eats a lot! 
paraphrase_de: People eat a lot!

Мы видим, что окончательный выход грамматически правильный! Вот еще несколько примеров:

Кстати, я заметил, что для ввода «Я ничего не знаю» машина выводит дополнительный символ одинарной кавычки в конце вывода. Как я уже упоминал в самом начале, этот эффект GEC — всего лишь наблюдение; он не предназначен для использования в качестве инструмента GEC. В отношении инструментов GEC на основе NMT (особенно с механизмом Attention) было замечено, что нейронная сеть учится копировать непосредственно из ввода и вставлять его в вывод. Хотя это в основном безвредно (и на самом деле необходимо), оно также имеет тенденцию копировать ошибочные части, и становится очень трудно выборочно исправить это поведение. Таким образом, старый добрый статистический МТ (SMT) во многих случаях работает лучше. Предлагаемая идея не имеет этой проблемы, так как у нас нет прямого пути между входом и выходом. Во-вторых, у нас есть два шанса исправить ошибки — соответствующие двум поездкам. Конечно, очевидная обратная сторона заключается в том, что МТ может ошибаться дважды (но тогда и любая другая методика GEC тоже может допускать ошибки). Другая проблема заключается в том, что мы можем получить настоящий парафраз, который может не сохранить большую часть входных данных. Однако до тех пор, пока вывод грамматически правилен и семантически эквивалентен исходному вводу, мы можем рассматривать его как предложение, а не как более формальное решение GEC.

Ссылка: (1) https://pytorch.org/hub/pytorch_fairseq_translation/ (2) https://github.com/pytorch/fairseq