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
- the
yo.t
dictionary (updated version of the Minkovskii's dictionary); - Elisp package
yo.el
, which extends the Minkovskii's package withyo-context
function for automatic yofication of some word combinations (like обо всём) and the recursive edit option in the dictionary-based replacement functionyo-spell
; - 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
--------
Проект yomacs
основан на
ёфикаторе Евгения Миньковского и
дополняет его в двух отношениях:
- внесены некоторые правки в словарь
yo.t
; - скрипт на Лиспе дополнен функцией контекстной ёфикации
yo-context
для словосочетаний типа «обо всём», «по нём», «всё, что» и т.д.; кроме того, в диалоговую функцию словарной заменыyo-spell
добавлена возможность выхода в «рекурсивное редактирование». - Добавлены средства настройки словаря на особенности лексики ёфицируемого текста.
Скрипт Е. Миньковского был рассчитан на 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
, и приведёт к потере
оперативной памяти, занимаемой этим хэшем — даже в сеансах, которые
не обращаются к ёфикатору.
При обработке небольшого текста, вроде статьи для Википедии, можно
просто прощёлкать все проблемные слова, используя функцию yo-spell
,
так же, как при использовании ёфикатора Миньковского:
Откройте ёфицируемый файл и выполните команду
M-x yo-spell
Слова в которых буква Е несомненно занимает место буквы Ё (например, актер, береза), заменяются автоматически; остальные — интерактивно, о каждом вхождении сомнительного слова в минибуфере появляется вопрос. Например:
Меняем "запрет" на "запрёт"? (Да={SPC|y}, Нет={DEL|n}, Нигде='-')
Пробел, y
, Y
замену подтверждают; DEL
, Backspace
, n
, N
замену запрещают. Заглавные буквы Y
и N
кроме того
приостанавливают ёфикацию (см. ниже, п. 6).
Минус '-' (Нигде) исключает данное слово из поиска до конца сеанса. Т.е. если по характеру статьи невероятно, чтобы в ней появилось слово "запрёт" (но уместно слово "запрéт"), ответьте минусом — и в данном сеансе программа оставит в покое все дальнейшие вхождения этого слова.
Обратимся теперь обработке больших текстов (например, целая книга
ebook.fb2). Несомненно, самая частая проблемная пара — это
местоимения все/всё
. Нередко все
(всё
?) имеет по нескольку
вхождений на странице. Сотни страниц — сотни запросов про все/всё
.
Человек устаёт и начинает ошибаться.
Чтобы уменьшить количество тупых запросов я собрал некоторое
количество устойчивых сочетаний в функции yo-context
, которую я
рекомендую применить перед вызовом yo-spell
:
M-x yo-context
Эта функция автоматически, без вопросов, ёфицирует такие словосочетания, как
{во, на, при, обо} всем
{в, на, при, о} нем
{в, на, при, о} чем
…лось все, все …лось (напр. «все получилось»}
все {время, больше, меньше, равно, …ство}
все, {что, то, это}
Не все эти сочетания однозначно требуют ёфикации. Сочетания с предлогами однозначны (о нём, обо всём); тогда как последние из перечисленных имеют статистический характер: чаще такие сочетания выступают с Ё (особенно в деловой или научной прозе), хотя грамматически возможны и подобные сочетания с Е (особенно в неформальных текстах). Например:
решительно всё, что только служило целям пропаганды … всё, что он говорил и делал … собирали всё, что удавалось получить …
однако:
Знают все, что я — Принцесса
Лично я предпочитаю сначала произвести слепую ёфикацию таких сочетаний, а затем реЕфицировать исключения при вычитке (см. п. 7); но для каких-то стилей (или для каких-то пользователей) это может оказаться неприемлемым. Поэтому предусмотрен вызов с аргументом:
C-u M-x yo-context
при котором производятся только достоверные ёфикации.
Если вы хотите добавить или откорректировать слово в базе yo.t
, то
откройте его в Эмаксе и отредактируйте, соблюдая нехитрые правила:
- каждое слово с новой строки;
- проблемные слова, требующие запроса редактору: писать ли ё или е
(«все/всё», «чем-чём»), должны предваряться двумя литерами:
*
и пробелом; - строки, начинающиеся с решётки
#
— комментарии (или слова, выбросить которые не поднялась рука).
Ни одна из программ пакета не требует какой-либо сортировки базы — однако сортировка полезна программисту.
Если вы правите религиозный или астрономический текст, то велика
вероятность, что в тексте часто будет встречаться слово «небо», и
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
, и нечего нервировать пользователя вопросами про
незаменённые Е-формы.
Если в ёфицируемом буфере выделена область редактирования (active
region), то функции yo-context
и yo-spell
будут применяться только
к содержимому этих областей.
В ходе диалога с функцией yo-spell
вы можете заметить опечатку рядом
с местом запроса, и захотите тут же её исправить; или возможно вы
захотите исключить из хэша слово, альтернатива которому в данном
тексте неактуальна (как описано в п. 4).
В таком случае можно приостановить диалог ёфикации и выйти в режим
«рекурсивного редактирования» (recursive edit), подобно тому, как это
делается при query-replace
. В диалоге с yo-spell
надо сначала
принять решение о ёфикации данного места, и выразить его заглавной
буквой Y
или N
; это решение будет исполнено, и вы окажитесь в
режиме рекурсивного редактирования (о чём будет свидетельствовать пара
скобок [ ]
в Modeline). После завершения редакций можно вернуться
в диалог ёфикации обычной комбинацией C-M-c
. Однако в отличие от
возврата в query-replace
, возврат в yo-spell
вернёт вас не в точку
рекурсивного выхода, а пробросит на следующее проблемное место.
По-настоящему качественная ёфикация требует вычитки полученного текста. Буква ё так трудно внедряется в частности потому, что реально существует много разных стилей и вариантов её употребления. В стиле церковно-славянском часто употребляется Е там, где русский язык требует ё («Братья и сéстры!»). Такие славянизмы появляются даже у совершенно русского Крылова:
Когда в товарищах согласья нет На лад их дело не пойдет
Для ёфикатора пойдет
безусловно (без вопросов) подлежит ёфикации.
И наоборот, в народной песне
Славный корабль, омулёвая бочка … Молодцу плыть недалёчко
рифма требует нелитературного ё (хотя т.н. «народные» хоры поют хоть и не в рифму, но «грамотно»: недалéчко).
Если рассчитывать на последующую вычитку, то ёфикатор может значительно сократить число диалоговых запросов. Последовательное чтение меньше напрягает, чем диалог с машиной, и даёт более достоверный результат. С другой стороны, компьютерная ёфикация освобождает человека от огромной массы тривиальных редакций, оставляя на вычитку действительно сложные случаи.
См. статью А. Суперанской в «Науке и жизни» (2008 №1).
Оперативные изменения словаря ёфикации, заданные командой -'
или
вызовами функций yo-rm-entry
, yo-rm-many
, сохраняются от одного
вызова yo-spell
до другого. Это удобно, пока вы редактируете одну и
ту же книгу (или однотипные книги); но при смене жанра установленные
изменения могут оказаться неуместными, и возникнет необходимость
вернуться к основному словарю.
Этого можно добиться перевызвав Эмакс: новый сеанс перезагрузит словарь из файла. Но можно и не выходить из Эмакса, а просто вызвать
M-x yo-hash-revert
Для экономии памяти я использовал однобайтную виндовую кодировку
windows-1251-unix
. В целом Эмакс обеспечивает незаметную
перекодировку между разными приложениями и компонентами, и работая в
среде utf-8
(ёфицируя текст в utf-8
с клавиатурой в режиме
utf-8
) я не столкнулся с какими-либо шероховатостями.
yo-spell
не дружит с nxml-mode
(и, возможно, другими подобными
режимами?). Поэтому yo-spell
по умолчанию переходит в
fundamental-mode
, который таких проблем не вызывает. Если вам это не
нужно, вызывайте yo-spell
с префиксом:
M-x C-u yo-spell
Продукт yomacs
предоставляется с лицензией
GPL-3.0.
Согласно лицензии GPL авторы не несут никакой ответственности за
функционирование своей продукции.