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

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

    На сей раз появился новый повод поговорить об обработке текстов (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. И мы попытаемся это ему обеспечить, но я, по правде говоря, не надеюсь далеко уйти от нынешних стандартов качества. Слишком многое играет против нас. Действительно, не существует хорошей классификации возможных ошибок с указанием их реальной частотности (как для носителей, так и для иностранцев), а без такого списка любые проверки превращаются в стрельбу по хмурому небу в надежде попасть в пролетающую где-то за тучами дичь. Да и ошибки из списка (я их внимательно изучил) действительно по большей части сложны для отлова. Что ж, будем работать. Да, я не упомянул пока, что начинаем мы с английского, далее по плану немецкий, а там жизнь покажет.

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

    Похожие публикации

    Комментарии 13
      0
      я поставил программу ОРФО, она собственно от разразрабочиков русского проверочного модуля для MS Word но с расширенными функциями. Так вот увы ошибается программа все так же часто, в основном из за своей ограниченности. Например она знает что такое то определение должно соседствовать с существиетльным, но если искомое существительно находится в 2-3-х словах от него то выдается ошибка. Или программа знает что такое то слово надо брамлять запятыми, но существуют вполне очевидные случаи когла этого не требется, но они не учтены. Очень раздражает неумелая проверка закрытых-открытых скобок, ошибка практически всегда выдается если в скобках встречается точка с запятой и программа уже не видит закрывающей скобки и просит проверить есть ли она.
      в то же время не ловится куча несогласованных падежей (ошибки этого рода сложнее всего поймать замыленным взглядом и в то же время они самые неприятные, даже хуже запятых).
        +3
        При разработке таких вещей нужны лингвисты. Много хороших, умных лингвистов. Вы с лингвистами сотрудничаете?
          +1
          Пока ещё мы не на том уровне, чтобы обсуждать вещи, выходящие за разумение простого человека (не-лингвиста).
          С другой стороны, даже если бы у меня под боком был лингвист, я с ходу не могу придумать, чего этакого бы ему поручить.

          Учебник/справочник по грамматике у меня есть. Руководство по стилистике языка тоже. И ресурсы вроде этого. Вот чего бы действительно пригодилось от лингвистов — так это классификация ошибок и анализ их частотности, но ведь не делают они этого почему-то.
            +3
            > С другой стороны, даже если бы у меня под боком был лингвист, я с ходу не могу придумать, чего этакого бы ему поручить.

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

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

            0
            Не совсем понял. Термин «проверка правописания» используется в MS Word именно в этом контексте, я ничего не выдумывал. По поводу алгоритмизации правил — это как? Взять учебник по грамматике и «вбить» его в компьютер?.. Мы до этого ещё дойдём, но ведь всё равно получится «исправление известных ошибок».

            Если же речь о том, чтобы предложения, не удовлетворяющие правилам языка вообще за предложения не считались — да, окей, но это как раз случай «компиляции», в теории интересный, но на практике пока не применимый. Не доросли мы до него.
            0
            Пользуясь случаем спрошу, как решить такую задачу: На вход подается слово, на выходе нужно получить возможные опечатки(разумеется не все возможные, а реальные, часто встречающиеся), существуют ли алгоритмы? Есть ли словари опечаток(для русского языка)? Или как можно составить такой словарь?
              0
              У опечаток специфика, имхо, в том, что «неправильная» буква заменяется «клавиатурно» близкой, то есть метрика по клавиатуре. А дальше обычный алгоритм поиска ближайшего по этой метрике слова из словаря, наверное. Такое приходит в голову навскидку.
                0
                Да, правильно говорили — мой товарищ писал такую систему. Упрощённо говоря, суть в поиске в словаре слов, ближайших по edit distance + некоторые эвристики в виде частых ошибок, расширяющих поиск. Для каких-то европейских языков там есть ещё свои хитрости, но я в подробности не вдавался.
                +2
                6 лет назад общался с Шамаевым Алексеем Эдуардовичем, он был мозгом проекта под названием SemLP (ООО «Рубрикант»). Одной из целей проекта был перевод текста на любые языки по смыслу, а также практически безошибочный грамматический анализатор. Они (а точнее, Алексей) достигли этих целей! Мне довелось видеть результат работы системы. Пусть она была раздробленной и недоделанной, но я был впечатлён. Идея перевода по смыслу воплотилась в жизнь! Впереди предстояло ещё много работы, но, что самое главное, фундамент был готов. К сожалению, вскоре Алексей Эдуардович скоропостижно скончался, проект был заброшены, а исходники… надеюсь они ещё есть у спонсора «на антресолях».

                Порывшись в интернетах мне удалось найти крупицы информации по данному проекту, возможно они кому-нибудь пригодятся:
                * web.archive.org/web/www.semlp.com/
                * www.apmath.spbu.ru/ru/info/tuzov/onapr.html
                * www.dialog-21.ru/materials/archive.asp?id=7403&y=2002&vol=6077

                Также рекомендую ознакомиться с публикациями Тузова В. А. Его труды использовались при построении теоретической базы для SemLP:
                * www.apmath.spbu.ru/ru/staff/tuzov/
                * www.apmath.spbu.ru/ru/staff/tuzov/paper.rtf

                Если кто-нибудь желает реанимировать этот проект, пишите личным сообщением, попробую связаться со спонсором.
                  0
                  Как бывший аспирант Тузова я хорошо знаю эту систему. Скажем прямо, там всё не так просто — сейчас другие времена и совершенно другие требования к подобного уровня системам. Я сам по логике вещей именно это направление продолжаю копать («компиляция» текста — неслучайный термин), но уже на несколько освежённых принципах. Правда, у меня одного сил не хватает, может, удастся привлечь побольше людей.
                  0
                  Жалко, что нет реализации для русского языка. На хабре очень помогла бы эта программа — тут каждый второй безграмотный

                  Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                  Самое читаемое