Pull to refresh

NLP: проверка правописания — взгляд изнутри (часть 1)

Reading time4 min
Views7.1K
Читавшие мои предыдущие публикации знают, что пишу я достаточно редко, но обычно сериями. Хочется собраться с мыслями на заданную тему и разложить их по полочкам, не втискивая себя в прокрустово ложе одной короткой статейки.

На сей раз появился новый повод поговорить об обработке текстов (natural language processing то бишь). Я разрабатываю модуль проверки правописания для одной конторы. На выходе должна получиться функциональность, аналогичная встроенной в MS Word, только лучше :) Не могу пока назвать себя крупным специалистом в этой области, но стараюсь учиться. В заметках постараюсь рассказать о том, куда движется наш проект, как устроен тот или иной этап обработки текста. Может, в комментариях услышу что-нибудь новое/интересное и для себя. Если проекту с этого будет польза — прекрасно. Как минимум, устаканю данные у себя в голове, а это тоже неплохо.

На плечах гигантов?

Понятно, что без оглядки на существующие решения изобретать свою систему трудно. Однако гигантов вокруг нас как-то не особенно наблюдается. Есть MS Word, который все мы знаем, а ещё… а кто ещё? Вот пусть комментаторы поправят, но кроме модуля LanguageTool для Open Office (о нём мы ещё поговорим) даже в голову ничего не приходит. Штучный товар. (Да, вспомнил ещё о пакете Grammarian Pro X для макинтоша, но он тоже погоды не делает). Соответственно, ориентироваться на «отцов» сложновато. Проверка орфографии худо-бедно много где реализована, а вот с грамматикой совсем беда.

Компиляция vs. статический анализ

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

В теории «модель компиляции», конечно, выглядит очень заманчиво: попытаемся «откомпилировать» текст. Если в нём присутствуют ошибки, анализируемый фрагмент попросту «не склеится», причём системе будет сразу же ясно почему — как это ясно компилятору компьютерного языка. К сожалению, на данный момент полноценных «компиляторов естественного языка» не существует. Это как раз то направление, которое я копаю на досуге, но пытаться встроить сырые идеи в коммерческий продукт я пока не готов. Лучше уж сделать хороший state-of-the-art модуль, заодно понять, как он в наши времена устроен.

Если вы откроете настройки правописания в MS Word, то увидите, что грамматическая проверка действует как раз по принципу статического анализатора. Есть некий набор проверок, и система последовательно прогоняет через них текст:



По правде говоря, рассуждать о «модуле проверки правописания в MS Word» не совсем корректно: в действительности модули для разных языков делались разными командами и на различных алгоритмах. Однако общая идея «прогона» текста через сито проверок вроде как справделива для каждого модуля.

Под сенью фонаря

А вот теперь обсудим вот такой важный вопрос: откуда берутся те самые проверки, о которых только что шла речь? Почему в MS Word встроен именно тот набор правил, который показан на скриншоте выше? Кстати, в справке доступна более развёрнутая информация по каждому виду анализа:



Качество проверки грамматики Вордом не пинал только ленивый. Достаточно изучить хотя бы вот эту известную подборку материалов, чтобы убедиться, что ваш негативный опыт разделяют многие :) Я думаю, недостатки всех грамматических модулей вызваны тремя основными причинами. Во-первых, сам принцип «статической проверки» подразумевает неполное покрытие ошибок правописания. Имя этим ошибкам — легион, и надо обладать недюжинным талантом тестера, чтобы вбить в систему все мыслимые и немыслимые несуразности, потенциально возможные в предложениях. Во-вторых, наши технологии ещё не столь хороши, как хотелось бы. Многие ошибки тестер осознаёт, но не имеет возможности их запрограммировать. Понятно, что не все ошибки одинаково легко ловятся. В-третьих, по всей видимости, ошибки ищутся в соответствии с известной шуткой — «под фонарём», где светло, а не там, где они водятся на самом деле.

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

Автор другой статьи не поленился и прогнал тексты с указанными ошибками через различные модули проверки грамматики. Результаты оказались совершенно неутешительными. Если вкратце, всё плохо (а Word 97 почему-то оказался гораздо лучше всех последующих версий; впрочем, для нас это не имеет значения). Тест наиболее популярных ошибкок либо слишком сложен для программирования, либо попросту упущен разработчиками по недосмотру.

Наш модуль как зеркало современного состояния области

Разумеется, заказчик хочет иметь самый лучший грамматический модуль в мире. По крайней мере, не хуже, чем у MS Word. И мы попытаемся это ему обеспечить, но я, по правде говоря, не надеюсь далеко уйти от нынешних стандартов качества. Слишком многое играет против нас. Действительно, не существует хорошей классификации возможных ошибок с указанием их реальной частотности (как для носителей, так и для иностранцев), а без такого списка любые проверки превращаются в стрельбу по хмурому небу в надежде попасть в пролетающую где-то за тучами дичь. Да и ошибки из списка (я их внимательно изучил) действительно по большей части сложны для отлова. Что ж, будем работать. Да, я не упомянул пока, что начинаем мы с английского, далее по плану немецкий, а там жизнь покажет.

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

Articles