yomacs

Yofication of Russian texts using GNU Emacs 24.3 or newer

View on GitHub

Yofication with Emacs

Yofication is described in English and Russian Wikipedias. This yomacs project provides a means to carry out yofication using GNU Emacs 24.3 or newer. It is based on the E. Minkovskii’s yoficator (GPL). The main assets of yomacs are

  1. the yo.t dictionary (updated version of the Minkovskii’s dictionary);
  2. Elisp package yo.el, which extends the Minkovskii’s package with yo-context function for automatic yofication of some word combinations (like обо всём) and the [recursive edit] option in the dictionary-based replacement function yo-spell;
  3. on-the-the-fly customization of the yofication hash table (the working copy of the dictionary) depending on the lexical scope of the text being yoficated.

This software is available on the terms of GNU General Public License version 3.0 (Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA).

Copyright © 2019 by Sergio Pokrovskij

[recursive edit]: https://www.gnu.org/software/emacs/manual/html_node/emacs/Recursive-Edit.html

Ёфикация с помощью Эмакса

Проект yomacs основан на ёфикаторе Евгения Миньковского и дополняет его в двух отношениях:

  1. внесены некоторые правки в словарь yo.t;
  2. скрипт на Лиспе дополнен функцией контекстной ёфикации yo-context для словосочетаний типа «обо всём», «по нём», «всё, что» и т.д.; кроме того, в диалоговую функцию словарной замены yo-spell добавлена возможность выхода в «[рекурсивное редактирование][recursive edit]».
  3. Добавлены средства настройки словаря на особенности лексики ёфицируемого текста.

Скрипт Е. Миньковского был рассчитан на XEmacs; ныне предлагаемый скрипт ориентирован на GNU Emacs (версии 24.3 или новее). Важное достоинство Эмакса состоит в том, что он снимает проблему использования различных кодировок русского текста.

Установка

Скачайте файлы yo.el и yo.t — скажем, в директорию Ё (можно поместить их и в разные директории).

В файле yo.el в определении defvar yo-database-file (помечено комментарием "; <== FIXME !") пропишите правильный путь к yo.t.

В файл инициализации Эмакса (обычно, .emacs) добавьте:

(autoload 'yo-context "Ё/yomacs/yo.el" "обо всём etc" t)
(autoload 'yo-spell "Ё/yomacs/yo.el" "dict yofication" t)
(autoload 'yo-yo-rm-entry "Ё/yomacs/yo.el" "Исключить слово" t)
(autoload 'yo-yo-rm-many "Ё/yomacs/yo.el" "Исключить список слов" t)

(замените Ё на правильный путь).

Не используйте формы load или require: это замедлит запуск Эмакса за счёт инициализации хэша в пакете yo.el, и приведёт к потере оперативной памяти, занимаемой этим хэшем — даже в сеансах, которые не обращаются к ёфикатору.

Порядок работы

1. Ёфикация небольшого текста

При обработке небольшого текста, вроде статьи для Википедии, можно просто прощёлкать все проблемные слова, используя функцию yo-spell, так же, как при использовании ёфикатора Миньковского:

Откройте ёфицируемый файл и выполните команду

M-x yo-spell

Слова в которых буква Е несомненно занимает место буквы Ё (например, актер, береза), заменяются автоматически; остальные — интерактивно, о каждом вхождении сомнительного слова в минибуфере появляется вопрос. Например:

Меняем "запрет" на "запрёт"? (Да={SPC|y}, Нет={DEL|n}, Нигде='-')

Пробел, y, Y замену подтверждают; DEL, Backspace, n, N замену запрещают. Заглавные буквы Y и N кроме того приостанавливают ёфикацию (см. ниже, п. 6).

Минус ‘-‘ (Нигде) исключает данное слово из поиска до конца сеанса. Т.е. если по характеру статьи невероятно, чтобы в ней появилось слово “запрёт” (но уместно слово “запрéт”), ответьте минусом — и в данном сеансе программа оставит в покое все дальнейшие вхождения этого слова.

2. Контекстная замена

Обратимся теперь обработке больших текстов (например, целая книга ebook.fb2). Несомненно, самая частая проблемная пара — это местоимения все/всё. Нередко все (всё?) имеет по нескольку вхождений на странице. Сотни страниц — сотни запросов про все/всё. Человек устаёт и начинает ошибаться.

Чтобы уменьшить количество тупых запросов я собрал некоторое количество устойчивых сочетаний в функции yo-context, которую я рекомендую применить перед вызовом yo-spell:

M-x yo-context

Эта функция автоматически, без вопросов, ёфицирует такие словосочетания, как

{во, на, при, обо} всем
{в, на, при, о} нем
{в, на, при, о} чем
…лось все, все …лось (напр. «все получилось»}
все {время, больше, меньше, равно, …ство}
все, {что, то, это}

Не все эти сочетания однозначно требуют ёфикации. Сочетания с предлогами однозначны (о нём, обо всём); тогда как последние из перечисленных имеют статистический характер: чаще такие сочетания выступают с Ё (особенно в деловой или научной прозе), хотя грамматически возможны и подобные сочетания с Е (особенно в неформальных текстах). Например:

решительно всё, что только служило целям пропаганды … всё, что он говорил и делал … собирали всё, что удавалось получить …

однако:

Знают все, что я — Принцесса

Лично я предпочитаю сначала произвести слепую ёфикацию таких сочетаний, а затем реЕфицировать исключения при вычитке (см. п. 7); но для каких-то стилей (или для каких-то пользователей) это может оказаться неприемлемым. Поэтому предусмотрен вызов с аргументом:

C-u M-x yo-context

при котором производятся только достоверные ёфикации.

3. Правка словаря ёфикации

Если вы хотите добавить или откорректировать слово в базе yo.t, то откройте его в Эмаксе и отредактируйте, соблюдая нехитрые правила:

  1. каждое слово с новой строки;
  2. проблемные слова, требующие запроса редактору: писать ли ё или е («все/всё», «чем-чём»), должны предваряться двумя литерами: * и пробелом;
  3. строки, начинающиеся с решётки # — комментарии (или слова, выбросить которые не поднялась рука).

Ни одна из программ пакета не требует какой-либо сортировки базы — однако сортировка полезна программисту.

4. Оперативная правка хэша

Если вы правите религиозный или астрономический текст, то велика вероятность, что в тексте часто будет встречаться слово «небо», и yo-spell будет постоянно спрашивать, не исправить ли его на «нёбо». Чтобы подавить такие запросы, можно на время сеанса исключить слово «небо» из хэша (рабочей копии базы) при помощи функции yo-rm-entry:

M-x yo-rm-entry RET небо RET

На самом деле досаждать будет не только именительный падеж единственного числа, но и вся парадигма:

* нёба
* нёбе
* нёбо
* нёбом
* нёбу

Скучно исключать столько слов по одному; можно завести файл, скажем ignore.t, и скопировать в него ненужные слова; в ходе сеанса, когда хэш уже заполнен, можно вызвать

M-x yo-rm-many RET ignore.t RET

Пример такого файла ignore.t включён в дистрибутив (свой файл исключений вы можете назвать иначе; можно завести несколько таких файлов для текстов ориентированных на разную лексику; можно последовательно исключить слова из нескольких таких файлов).

Как видно из приложенного ignore.t, исключаемым словам может быть предпослана звёздочка; она игнорируется (просто так удобнее копировать из yo.t). Вы также можете закомментировать решёткой слово, которое в почему-то в данном сеансе не хотите исключать.

Теперь предположим, что вы редактируете книгу по анатомии или фонетике. В такой книге актуально слово «нёбо», и маловероятно появление слова «небо». В таком случае удобно перенести слово «небо» в разряд слов безусловно (без запроса) ёфицируемых. Чтобы так поправить хэш надо вместо звёздочки поставить плюс:

M-x yo-rm-entry RET + небо RET

(или аналогично в файле исключений для yo-rm-many). Исключаемое слово можно подать в форме с Ё или с Е — эффект будет одинаковый (в любом случае ключ поиска — слово с Е).

В дистрибутивном ignore.t присутствуют слова нём, всём, чём — предполагается, что нужные замены уже произвела функция yo-context, и нечего нервировать пользователя вопросами про незаменённые Е-формы.

5. Ёфикация выделенной области

Если в ёфицируемом буфере выделена область редактирования (active region), то функции yo-context и yo-spell будут применяться только к содержимому этих областей.

6. Приостановка диалога

В ходе диалога с функцией yo-spell вы можете заметить опечатку рядом с местом запроса, и захотите тут же её исправить; или возможно вы захотите исключить из хэша слово, альтернатива которому в данном тексте неактуальна (как описано в п. 4).

В таком случае можно приостановить диалог ёфикации и выйти в режим «рекурсивного редактирования» (recursive edit), подобно тому, как это делается при query-replace. В диалоге с yo-spell надо сначала принять решение о ёфикации данного места, и выразить его заглавной буквой Y или N; это решение будет исполнено, и вы окажитесь в режиме рекурсивного редактирования (о чём будет свидетельствовать пара скобок [ ] в Modeline). После завершения редакций можно вернуться в диалог ёфикации обычной комбинацией C-M-c. Однако в отличие от возврата в query-replace, возврат в yo-spell вернёт вас не в точку рекурсивного выхода, а пробросит на следующее проблемное место.

7. Вычитка текста

По-настоящему качественная ёфикация требует вычитки полученного текста. Буква ё так трудно внедряется в частности потому, что реально существует много разных стилей и вариантов её употребления. В стиле церковно-славянском часто употребляется Е там, где русский язык требует ё («Братья и сéстры!»). Такие славянизмы появляются даже у совершенно русского Крылова:

Когда в товарищах согласья нет На лад их дело не пойдет

Для ёфикатора пойдет безусловно (без вопросов) подлежит ёфикации. И наоборот, в народной песне

Славный корабль, омулёвая бочка … Молодцу плыть недалёчко

рифма требует нелитературного ё (хотя т.н. «народные» хоры поют хоть и не в рифму, но «грамотно»: недалéчко).

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

См. статью А. Суперанской в «Науке и жизни» (2008 №1).

8. Возврат к стандартной ёфикации

Оперативные изменения словаря ёфикации, заданные командой -' или вызовами функций yo-rm-entry, yo-rm-many, сохраняются от одного вызова yo-spell до другого. Это удобно, пока вы редактируете одну и ту же книгу (или однотипные книги); но при смене жанра установленные изменения могут оказаться неуместными, и возникнет необходимость вернуться к основному словарю.

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

M-x yo-hash-revert

9. Технические детали

Для экономии памяти я использовал однобайтную виндовую кодировку windows-1251-unix. В целом Эмакс обеспечивает незаметную перекодировку между разными приложениями и компонентами, и работая в среде utf-8 (ёфицируя текст в utf-8 с клавиатурой в режиме utf-8) я не столкнулся с какими-либо шероховатостями.

10. Проблема с nxml-mode

yo-spell не дружит с nxml-mode (и, возможно, другими подобными режимами?). Поэтому yo-spell по умолчанию переходит в fundamental-mode, который таких проблем не вызывает. Если вам это не нужно, вызывайте yo-spell с префиксом:

M-x C-u yo-spell

Лицензия

Продукт yomacs предоставляется с лицензией GPL-3.0. Согласно лицензии GPL авторы не несут никакой ответственности за функционирование своей продукции.