Комментарии к программе "Yo"

Здесь изложены некоторые сведения о программе, не вошедшие в базовый текст. Они относятся к полной версии программы, кое-что (редактор словарей и т.п.) не будет работать в облегчённой версии, выложенной на github.

О словарях

Основной словарь yox.dat, который содержится в архиве с программой, создан на основе словарной базы для скриптов Е. Миньковского и затем существенно дополнен. В настоящий момент он содержит около 140 000 слов, в том числе некоторое количество устаревших, диалектных и просторечных. Кроме того, в состав архива входит маленький примерный словарь регулярных выражений yo_regexpr.dat, который используется в режиме "Анализ регулярных выражений" (см. подробности ниже). Программа будет работать и без него, однако он, по мысли автора, может повысить скорость ёфикации.

При создании баз слов на "ё" нужно решать две задачи: с одной стороны, учесть все возможные варианты написания (включая, по возможности, устаревшие, просторечные, поэтические), а с другой - не слишком отступить от правил современной русской орфографии. Разумеется, эти задачи в каком-то смысле противоречат друг другу. Кроме того, в словаре могут быть ошибки и лакуны. Поэтому обработанные программой тексты не следует рассматривать как тексты, гарантированно не содержащие ошибок в расстановке "е/ё". Если вы хотите получить текст, близкий к идеалу (вообще говоря, недостижимому) в смысле ёфикации, то включайте опцию "Всегда подтверждать замену" и в сомнительных случаях справляйтесь в словарях - например, на сайте www.gramota.ru (хотя и это не всегда помогает).

Замечу также, что словари, используемые программой, не нужно рассматривать в качестве нормативных. Сомнения в существовании варианта слова с "ё" иногда решались в его пользу (то есть оно заносилось в словарь со знаком "?"). Таким образом, то, что программа предлагает вам выбрать один из вариантов написания, может не означать, что оба они одинаково грамотны!

Смысл некоторых пунктов меню

"Редактировать"

"Ёфикация"

"Опции"

Смысл информации в статустной строке

При ёфикации в строке под экраном редактора выводится информация о статистике процесса в формате:

t=t1+t2 A:a=a1+a2 RE:r=r1+r2 REQ:q E:e T:tm S:s,

где

Основной словарь

Словарь слов ("основной словарь", или ОС, или просто "словарь") - это упорядоченный по алфавиту (при этом "е" и "ё" считаются неразличимыми) список словарных строк и комментариев. Комментарий - это произвольная строка, начинающаяся с "#", программа её игнорирует. Словарная строка - это слово с буквой "ё", состоящее из букв русского алфавита в кодировке CP-1251 (пробелы и знаки препинания не допускаются), к которому может быть добавлен служебный символ "?".

После слова должен стоять знак "?", если допустимы оба варианта - как с буквой "е" так и с буквой "ё" (в этом случае программа попросит подтверждение при замене буквы "е" на "ё").

Словарь регулярных выражений

Начиная с версии 0.95 в программу введён режим "Анализ регулярных выражений" и соответствующий ему "Словарь регулярных выражений" (СРВ). Каждая его строка построена в соответствии с синтаксисом регулярных выражений (с некоторыми особенностями) и описывает некоторое правило расстановки "е/ё" в тексте.

Назначение данного режима - сократить количество случаев, когда программа обращается с запросом к пользователю. на замену. Неформально можно описать работу режима следующим образом. Если программе нужно сделать запрос, но она находит в СРВ регулярное выражение, соответствующее проверяемому слову в некотором контексте, то запроса она не делает и расставляет "е/ё" в слове так, как это сделано в словаре. Пусть, например, в СРВ имеется регулярное выражение "всё \w+ьше лет". Программа переводит его во "внутренний формат" - "\bвсё\s+\w+ьше\s+лет\b". Тогда в строках текста "все больше лет" и "все меньше лет" "все" замениться на "всё", а "лет" останется без изменения, при этом в выражении "все больше летают, чем ходят пешком" программа запросит замену "все" на "всё" (оно не соответствует строке СРВ). (Подразумевается, что в основном словаре есть строки "всё?" и "лёт?", а WordsBufferLength >= 5). Более формальные правила обработки строк СРВ описаны ниже.

В данный момент с программой поставляется маленький примерный СРВ yo_regexpr.dat и предполагается, что пользователи по мере необходимости будут заполнять его сами.

СРВ - прямой наследник существовавшего в версиях 0.91-0.936 "Словаря словосочетаний" (СС). Для того, чтобы использовать старый СС как СРВ, следует отредактировать его вручную, заменив: 1) метасимвол "\0" на "\d+" и 2) символы, имеющие в регулярных выражениях специальный смысл - ".", "|", "(", ")", "[", "\", "^", "{", "+", "$", "*", "?" - на их версии, предварённые знаком "\".

Порядок строк в СРВ может быть любым, но следует иметь в виду, что программа просматривает его с начала, и доходит только до первого выражения, соответствующего конексту. Размер СРВ формально неограничен, однако практика показала, что большие словари замедляют работу программы. Разумно включать в СРВ только выражения, которые встречаются в тексте достаточно часто - например, контексты слов "все"/"всё", "лет"/"лёт", "чем"/"чём" и т.д.

Об анализе регулярных выражений из СРВ

Для анализа возможных странностей режима "Анализ регулярных выражений" ниже приведён формальный алгоритм его работы. Точнее - того, как это должно работать. Напоминаю, что режим отлаживается, так что возможно всякое.

Итак, пусть программа проверят слово W и должна выдать запрос на выбор между его формами W1 и W2. Если анализ регулярных выражений включён, то проводится следующая процедура:

  1. Из текста выделяется строка контекста C, состоящая из проверяемого слова W, окружённого справа и слева n = WordsBufferLength div 2 "словами" (или меньшим количеством - если слово находится в начале или конце текста). Таким образом, C в общем случае содержит WordsBufferLength слов. "Словом", вопреки правилам русской грамматики, считается последовательность букв (здесь и далее - русских букв), ограниченных небуквенными символами, включая дефис (например, в строке "он всё-таки тёмно-серый" - пять слов, а в строке "12 негритят" - одно). WordsBufferLength - внутренняя переменная, которая должна быть нечётной и по умолчанию равна 5.
  2. Из СРВ берётся очередное регулярное выражение R. Если выражений больше нет - переход к 9.
  3. R переводится во "внутренний формат" (RI) следующим образом:
    • "е" и "ё" заменяются на "([её])";
    • "Е" и "Ё" заменяются на "([ЕЁ])";
    • последовательности пробельных символов заменяются на "\s+" (соответствует одному и более пробелов)
    • дефис "-" заменяется на "-(\r\n){0,1}" (возможность разрыва после дефиса);
    • если выражение начинается (кончается) буквенным символом, то его в начале (конце) добавляется "\b" (соответствует границе слова).
  4. В C ищется первое выражение, которое a) соответствует RI, b) имеет непустое пересечение с W. При поиске совпадения включены модификаторы /m (многострочная мода) и /s (точка соответствует и концу строки). Кроме того, если в R нет букв верхнего регистра, то совпадение ищется в регистро-независимом режиме (модификатор /i). Если таких выражений нет, повторяется пункт 2.
  5. Строится выражение C', путём замены всех подвыражений в C (то есть подстрок, заключённых в RI в скобки), которым в R соответствует "е" или "ё", на соответствующую букву (с сохранением регистра).
  6. Из C' выделяется модифицированное слово W'.
  7. Если W' совпадает со словом W1 или W2 - переход к 8. Иначе - переход к 2
  8. В тексте W без запроса меняется на W'. Конец процедуры.
  9. Запрашивается выбор между формами W1 или W2. Конец процедуры.

Примечание 1: Метасимвол \w в регулярных выражениях соответствует только русским буквам.

Примечание 2: Как следует из описания, частные правила нужно помещать в СРВ перед общими - иначе первые не сработают. Например, выражение "при всём" дожно стоять перед "всем".

Примечание 3: Для изменения переменной WordsBufferLength нужно отредактировать файл yo.ini, добавив в секцию [Yo] строку WordsBufferLength=x, где x - нечётное натуральное число большее 1.

Примечание 4: Если в секции [Yo] файла yo.ini есть строка RegExprLog=1, то все замены по СРВ записываются в файл regexpr.log.

О регистре слов в словарях

Начиная с версии программы 0.935 в ОС допускается использование слов с первой буквой в верхнем регистре. При этом словарь упорядочивается согласно следующему порядку букв: "АаБб...Е(=Ё)е(=ё)...Яя". Словарная строка, написанная с использованием заглавной буквы, относится только к словам в тексте, первая буква которых тоже большая. Так, строка "Алёша" будет относиться только к словам "Алёша", "АЛЕША" и т.д. (но не "алёша"), тогда как строке "алёша" будут соответствовать любой регистр букв. Программа ищет в ОС сначало слово с заглавной буквой, а если не находит его, то с прописной.

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

О русских фамилиях

Нормы написания фамилий, вообще говоря, гораздо более размыты, чем в случае нарицательных имён. Поэтому при дополнениях и изменениях большого словаря, начиная с версии 1.3, русские фамилии и производные от них почти всегда имеют знак запроса "?". Дело в том, что, скажем, фамилии Ж.И. Алфёрова и Е.И. Пугачёва пишутся через "ё", но никто не поручится, что не существуют вариантов написания этих же фамилий через "е". Исключения могут касаться только известных иностранных фамилий (например, "Гёдель") и популярных русских, алтернативное написание которых кажется мне весьма сомнительным (например, "Семёнов"). Если вас не устраивает подобная ситуация, вы всегда можете использовать кнопки "Всегда Е/Ё" в окне запроса.

Редактор словарей

Внимание! Режим "Редактор словарей" протестирован существенно хуже, чем собственно ёфикатор. Если вы будете им пользоваться, то готовьтесь к глюкам и не забывайте архивировать обрабатываемые словари. По умолчанию этот режим отключён: чтобы включить его, в файле yo.ini замените 0 на 1 в строке Editor=0.

Не предполагается, что вы будете часто нуждаться в редакторе словарей, поэтому опишу его очень кратко. Редактор вызывается нажатием клавиш Ctrl-E. Он состоит из "окна словаря" (вверху или слева) и "окна (добавляемых) слов" (внизу или справа). В редакторе вы можете:

  • Загрузить словарь (Ctrl-L);
  • Сохранить словарь (Ctrl-S);
  • Вычесть из загруженного словаря другой (в окне словаря остаются только слова, которые есть в первом словаре и отсутствуют во втором);
  • Сортировать словарь (F8);
  • Удалить дубли из словаря (Ctrl-D);
  • Добавить слово из "окна слов", на котором стоит позиция курсора, в правильное место "окна словаря" (Insert) ;
  • Создать формы слова из основной (Ctrl-Insert) ;
  • Найти следующую ошибку в "окне словаря", начиная с позиции курсора (Ctrl-E);
  • Опция Режим "Словарь словосочетаний" - при установке этой опции словарь считается словарём словосочетаний (в нём допускаются слова с "е" и небуквенные символы);
  • Опция Вести лог новых слов - ведётся файл insert.log, в который заносятся все слова, заносимые из "окна слов" в "окно словаря";

Команда "Создать формы слова" может быть полезна при массированной вставке новых слов в словарь. Она работает, если в рабочем каталоге программы присутствует файл morphs.dat. Файл описывает правила генерации косвенных форм слова из основной (существительного или прилагательного именительного падежа единственного числа, инфинитива глагола). О формате файла не рассказываю - тот, кому понадобится его редактировать, разберётся сам. Для генерации форм слова следует:

  1. Подвести курсор к нужному слову в "окне слов";
  2. Нажать Ctrl-Insert;
  3. Выбрать тип слова из выпадающего списка;
  4. Отредактировать созданные словоформы (среди них могут быть лишние или несуществующие!);
  5. Нажать кнопку "Принять";

История изменения программы и словарей

См.
здесь.

Известные проблемы

Владимир Иванов, 2003-2019.