Проверка слова:  

 

Журнал «Грамоты.ру»

 

История развития граммера ОРФО

26.06.2012

Андрей Соколов

ОРФО с самого начала задумывалась не как простой спеллер (система проверки правописания), а как нечто более умное. Спеллер проверяет правильность слов по словарю и не заботится о правильности связи слов в предложении. И я хотел бы рассказать о самой сложной составляющей ОРФО – грамматическом корректоре.

Хочу только вначале заметить, что написать качественный спеллер – тоже не совсем тривиальная задача, это не совсем то же самое, что просто морфологический лематизатор. Спеллер все-таки задает стандарт написания. Морфология для поисковых систем необязательно должна быть точна. Даже, скорее, наоборот, она должна быть малочувствительна к орфографическим ошибкам. Спеллер же должен быть точен.

Первым шагом в направлении граммера была проверка правильности написания слов через дефис. Некоторые слова с дефисным написанием есть в словаре целиком (например, Рио-де-Жанейро). Такие слова относятся к компетенции спеллера. Другие же присутствуют в словаре лишь по частям. Классический орфовский пример «женщина-врач». Здесь склоняются обе части: «женщины-врача», «женщиной-врачом»  и т. п.

1989 году Игорем Ашмановым были алгоритмизованы правила согласования слов, был придуман механизм так называемых морфологических векторов. Морфвектор в терминологии ОРФО – это бинарный массив всевозможных грамматических характеристик слова. 1 в i-ом разряде морфвектора означает, что словоформа удовлетворяет i-ому набору грамматических характеристик, а 0 - что не удовлетворяет. Каждое слово в проверяемом тесте может быть одним из нескольких омонимов. Например, слово «простой» – это прилагательное, но также может быть существительным («простой машины»). Морфвектор слова – это логическая сумма морфвекторов всех омонимов.

При проверке согласованности двух слов сравниваются их морфвектора. Согласование может быть по всем грамматическим характеристикам, как, например, при согласовании существительного и прилагательного. Тогда морфвектора просто перемножаются. Или по части характеристик, как, например, в случае «женщина-врач». Тогда фактически перемножаются некоторые проекции морфвекторов.

На основе морфвекторов был разработан алгоритм проверки согласованности слов в предложении. Здесь я для простоты говорю о согласованности, на самом деле более правильно было бы говорить о предложном управлении и согласованности существительных и прилагательных. Алгоритм согласования пытался выявить в предложении правильную структуру связей предлогов, прилагательных и существительных, перемножая морфвектора или их проекции. Если такой структуры не обнаруживалось, предложение объявлялось несогласованным. Алгоритм пытался также выявить причину несогласованности и выдать соответствующее сообщение.

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

Но живой язык имеет массу исключений и не очень очевидных правил. Например, оказывается, что не всегда предлог стоит перед существительным. Во фразе «справедливости ради» предлог «ради» стоит после управляемого существительного. Есть сложные предлоги, например, «по истечении, по окончании, по завершении, по прибытии», которые порождают излишнюю подсветку, так как для предлога «по» не указана возможность управлять существительным в таком падеже. Есть глаголы состояния, выполняющие роль существительного при кратком прилагательном: «будь осторожен». Всё это выявилось в течение нескольких лет эксплуатации ОРФО.

Игорь Ашманов составил довольно полный документ с анализом таких особенностей русского языка, которых ОРФО не учитывала. Многие проблемы было не так просто решить, тем более что основной разработчик – Натан Рейзин – уехал в 1991 году в Штаты. Программа на С была плохо читаема, так как была оптимизирована для того, чтобы быстро работать при дефиците памяти. Вы будете смеяться, но алгоритм был также оптимизирован к дефициту бумаги! Каждая строчка содержала максимум операторов и минимум комментариев, чтобы при распечатке экономить дефицитную тогда бумагу. Как шутил автор программы Натан Рейзин, пусть наши враги разбираются в наших алгоритмах.

Но разбираться пришлось нам самим. Переписыванием и доработкой морфологической части занялась Люся Березкина. Фактически она руководствовалась документом, составленным Игорем Ашмановым еще спустя много лет после его ухода из «Информатика». Каждый пункт документа описывал некие языковые конструкции, которые нужно было считать согласованными или, наоборот, несогласованными: в некоторых случаях из-за омонимии и прочего ОРФО не обнаруживала заявленных ошибок. Не всегда было понятно, как это реализовать так, чтобы не ухудшить уже работающие случаи. Но постепенно в течение 10 лет с перерывами эти сложности и некоторые вновь обнаруженные ситуации были преодолены в ОРФО. Некоторые, правда, до сих пор ждут своего решения.

Алгоритмически в граммере ОРФО реализовано несколько других опций. Не буду на них подробно останавливаться, скажу только, что в их разработке принимали участие такие люди, как Марина Костина и Александр Михайлов.

Кроме алгоритмических опций, в граммере ОРФО задействован еще один интересный механизм – механизм шаблонов. История его такова. В 1994 году (или что-то около этого) к нам обратился Николай Харин. У него была достаточно простая, но эффективная идея обнаружения пропущенных запятых. Его алгоритм был основан на шаблонах, описывающих ошибочные конструкции с пропущенной запятой. Проект поражал своей простотой. Он был прост как колумбово яйцо. То есть прост, но догадаться до такой простоты совсем непросто. Приведу самый наглядный пример. Один из шаблонов выглядел так: слово <#> а. Он описывал ситуацию, когда перед словом «а» нет знака препинания. Если алгоритм обнаруживал такую конструкцию, он требовал постановки запятой перед «а».

Меня его идеи поразили своей простотой и одновременно эффективностью практической реализации. Фактически этот шаблон ловил пропуск запятой в некоторых сложных предложениях с союзом «а», и при этом не было никакого грамматического разбора предложения. Николая Харина взяли на работу в «Информатик» для дальнейшего развития алгоритма.

Игорь Ашманов усовершенствовал язык описания шаблонов, введя туда морфологические данные, которых не было у Николая. Фактически это был новый язык шаблонов описания грамматических ошибок.

На создание и доводку алгоритма поиска грамматических ошибок ушло несколько лет. Зато, когда он был уже достаточно отлажен, добавлять новые опции стало технически довольно просто. Достаточно было лингвистам написать какое-то количество шаблонов, скомпилировать новый словарь – и граммер обнаруживал новые ошибки, соответствующие шаблонам. Основная работа ложилась на плечи лингвистов. После добавления нового словаря начиналась его кропотливая отладка. Нужно было прогнать граммер через массу текстов, чтобы понять, где опция «стучит», и затем уточнять шаблоны, добавляя исключения и новые шаблоны.

Словари  шаблонов сейчас ловят более 40 видов грамматических ошибок. Это не только запятые, но и стилистические и даже орфографические ошибки, выявляемые на основе контекста. Разработанные лингвистами шаблоны обнаружения ошибок сейчас уже довольно большие, хорошо продуманные и отлаженные. Для разработки лингвистической части ОРФО много сделали лингвисты Мария Роскова, Александра Шеймович, Елена Крученицкая.

Граммер ОРФО представлял собой гибрид С и С++ кода. Многие поругивали этот код, но никто не брался взвалить на себя сложнейшую работу по рефакторингу, пока наконец за это дело не взялась Елена Тенькова. К тому времени уже отрефакторили спеллер (Алексей Осипенко) и тезаурус (Алексей Карягин), но граммер – это нечто уникальное по сложности и напичканности разными лингвистическими алгоритмами многими поколениями программистов!

Если сравнивать возможности человека и грамматического корректора ОРФО, то, конечно, человек может найти больше ошибок, чем ОРФО. Но. Во-первых, не все такие грамотные, а во-вторых, не все грамотные жаждут постоянно проверять и перепроверять свои тексты. Большинство самых досадных грамматических ошибок вносится грамотным человеком не во время написания текста, а во время его правки. Поправил в одном месте, но забыл поправить в другом, связанном с этим. Человек устает, глаз, что называется, «замыливается», а ОРФО никогда не дремлет.

Текущий рейтинг: