rulex
/
README.ru
412 строк · 28.9 Кб
1СЛОВАРЬ РУССКИХ ПРОИЗНОШЕНИЙ
2
3Словарь русских произношений RuLex предназначен в первую очередь для
4совместного использования с синтезатором речи Ru_tts. После его
5установки достаточно добавлять в строку вызова Ru_tts ключ
6"-s /usr/local/share/freespeech/rulex.db" и содержимое словаря будет
7приниматься во внимание при синтезе речи.
8
9
10Базовые понятия
11
12Основу пакета составляет лексическая база данных, содержащая
13информацию о произношении слов русского языка. Она в свою очередь
14состоит из шести наборов данных: двух словарей (прямого и косвенного) и
15четырех наборов правил (общие правила, классификаторы приставок и
16окончаний и корректоры). Для записи русских букв используется
17кодировка koi8-r.
18
19Прямой словарь содержит информацию о произношении непосредственно
20входящих в него слов. Косвенный словарь включает в себя слова в так
21называемой базовой форме. На основе этой информации строится
22произношения для всевозможных производных форм. Понятие базовой формы
23здесь условно и не связано с аналогичными понятиями, принятыми в
24языкознании.
25
26Общие правила позволяют определить позицию ударения в словах, где
27это можно сделать, опираясь исключительно на формальные признаки.
28
29Классификаторами мы здесь называем правила, сопоставляющие производной
30форме слова базовую. Сюда относятся две группы правил: классификаторы
31приставок, выделяющие базовую форму посредством обрезания приставки, и
32классификаторы окончаний, формирующие базовую форму путем унификации
33окончания.
34
35Корректоры - это вспомогательная система правил. Они используются на
36последнем этапе конструирования произношения для внесения необходимых
37поправок в ряде специальных случаев.
38
39Словарь представляет из себя набор строк (записей или словарных
40статей), состоящих из двух полей: Собственно слово и его
41произношение. Ударная гласная отмечается знаком "+" непосредственно
42после нее. Можно использовать также знак "=" для обозначения так
43называемых слабых ударений там, где это может быть целесообразным,
44например, в некоторых составных словах. Поля отделены друг от друга
45одним пробелом. В первом поле допускаются лишь малые буквы русского
46алфавита. Второе может содержать кроме того знаки "+", "=" и "-". Знак
47"-" используется для разделения некоторых сложных слов.
48
49Везде далее в тексте термин "словарь" будет подразумевать именно этот
50формат представления данных.
51
52Правила также представлены текстовыми строками, состоящими из одного
53или двух полей. Первое поле - всегда регулярное выражение,
54определяющее область применения правила. Формат и смысл второго поля
55различен для разных наборов: в общих правилах второе поле отсутствует,
56в классификаторах приставок и окончаний это префикс или суффикс
57базовой формы соответственно (если нужен), а в корректорах это
58строка регулярной замены.
59
60
61Алгоритм генерации произношений
62
63Полный цикл поиска информации в лексической базе данных и генерации
64произношения для заданного слова состоит из четырех стадий.
65
661) Слово ищется в прямом словаре. Если поиск оказывается
67результативным, из словаря извлекается строка произношения и
68осуществляется переход к четвертой стадии.
69
702) Слово трактуется как производная форма. Последовательно
71просматриваются оба набора классификаторов. Регулярное выражение,
72содержащееся в первом поле, сопоставляется с исходным словом и,
73если соответствие имеет место, строится базовая форма, которая и
74отыскивается в косвенном словаре. Этот процесс продолжается либо до
75первого успешного поиска, либо до исчерпания системы
76классификаторов. В случае успешного поиска, строка произношения для
77исходного слова строится подобно тому, как это сделано в словаре
78для базовой формы, после чего осуществляется переход к четвертой
79стадии. Базовая форма строится путем замены в исходном слове
80подстроки, соответствующей регулярному выражению, содержащемуся в
81первом поле, на содержание второго. При этом в случае
82классификаторов приставок имеется в виду все регулярное выражение
83целиком, в случае же классификаторов окончаний - лишь вторая его
84часть, лежащая правее области сопоставления первого подвыражения,
85заключенного в скобки.
86
873) К слову применяются общие правила. Система правил просматривается
88последовательно. Регулярное выражение сопоставляется с исходным
89словом и, если обнаружено соответствие, в слово вставляется символ
90"+", отмечающий позицию ударения, непосредственно вслед за областью
91сопоставления первого подвыражения, заключенного в скобки. Процесс
92продолжается до первого удачного сопоставления или до исчерпания
93набора правил. Если подходящего правила найти не удается, процесс
94считается безрезультатным и бесславно завершается.
95
964) Окончательная коррекция строки произношения. Система корректоров
97просматривается последовательно. Регулярное выражение, содержащееся
98в первом поле, сопоставляется с полученной на предыдущих этапах
99строкой произношения. В случае соответствия выполняется регулярная
100замена в соответствии с содержимым второго поля. Цифрами в строке
101замены обозначаются области сопоставления соответствующих
102подвыражений.
103
104
105Компиляция и установка
106
107Исходные тексты всех описанных наборов данных составляют основное
108содержание подкаталога data. Там же лежит и тестовый словарь,
109включающий в себя более 400 тысяч слов.
110
111Чтобы использовать лексическую базу данных, ее необходимо
112скомпилировать. Так как данный проект использует средства GNU Autotools,
113прежде всего его нужно сконфигурировать командами:
114
115autoreconf -ifs
116./configure
117
118После чего создание лексической базы выполняется командой:
119
120make db
121
122В результате этих действий в подкаталоге data будет создан файл
123lexicon, содержащий скомпилированную базу данных. Ее можно установить
124командой:
125
126make install-db
127
128А команда
129
130make install
131
132устанавливает весь пакет, включающий в себя не только саму базу
133данных, но и сопутствующие средства поддержки.
134
135Разумеется, для выполнения установки необходимы права
136суперпользователя.
137
138Перекомпилировать утилиту поддержки можно командой:
139
140make lexholder
141
142
143Замечание 1. Чтобы файл базы данных, изготовленный утилитой
144Lexholder-ru, воспринимался синтезатором Ru_tts, обе программы должны
145использовать одни и те же библиотеки поддержки баз данных. Версии тоже
146имеют значение. Вообще говоря, логично ожидать, что файл,
147изготовленный при помощи библиотеки более старой версии будет читаться
148процедурами той же библиотеки более новой версии, но это вполне может
149оказаться и не так. Для динамически скомпилированных исполняемых
150файлов точную информацию об используемых библиотеках можно получить
151при помощи команды "ldd".
152
153Замечание 2. В версиях RuLex начиная с 2.0 используется новый формат
154лексической базы данных. Синтезатор Ru_tts версий ниже 2.0 с ним
155работать не будет.
156
157Замечание 3. При удалении записей из лексической базы данных
158дисковое пространство не освобождается. Более того, при добавлении
159новых записей размер базы может неоправданно возрастать. Более
160компактного представления базы после множественных модификаций можно
161добиться путем полного ее пересоздания.
162
163
164Утилита поддержки
165
166Утилита lexholder-ru позволяет модифицировать, удалять и добавлять
167записи в лексической базе данных из командной строки или скрипта.
168Она позволяет также извлекать из базы данные во внешнем
169представлении.
170
171Формат вызова:
172
173lexholder-ru [options] <DB_path>
174
175Параметр <DB_path> - обязательный. Он должен указывать путь к
176лексической базе данных. При пополнении базы новые данные читаются из
177потока стандартного ввода. При извлечении данных результаты выводятся
178в поток стандартного вывода. Однако при помощи ключа "-f" можно
179указать файл, который будет использоваться вместо стандартных потоков
180ввода и вывода.
181
182Для удобства рассмотрения все ключи, воспринимаемые утилитой
183lexholder-ru в командной строке, логично разбить на несколько групп по
184принципу их функционального назначения.
185
186К первой группе относятся ключи, определяющие действие. В командной
187строке может присутствовать не более одного из них: лишь одна операция
188выполняется за один вызов. Если никаких действий в командной строке
189явно не указано, программа читает новые записи из потока стандартного
190ввода или файла, указанного ключом "-f", и вносит их в базу данных.
191
192-h -- Краткая справка об использовании программы.
193
194Все остальное содержимое командной строки полностью игнорируется. Это
195единственный случай, когда указание пути к базе данных не требуется.
196
197-l -- Вывод содержимого базы в исходном формате.
198
199Эта операция требует явного указания набора данных при помощи одного
200из ключей "-X", "-M", "-G", "-L", "-P" или "-C".
201
202-s <word> -- Поиск информации о произношении слова <word>.
203
204В случае успешного поиска строка произношения для заданного слова
205выводится в поток стандартного вывода или в файл, указанный ключом
206"-f", и программа возвращает код успешного завершения. Если для
207данного слова никакой информации в базе данных не нашлось, то в
208качестве строки произношения возвращается само слово, записанное
209малыми буквами, и программа завершается с ненулевым кодом
210возврата. Если в командной строке присутствует ключ "-q", строка
211произношения не генерируется, но о результатах поиска можно судить по
212коду завершения программы.
213
214-b <word> -- Поиск возможных базовых форм для слова <word>.
215
216Заданное слово трактуется как производная форма и, если ключ "-q" не
217упомянут в командной строке, конструируются и выводятся все возможные
218варианты для данного слова, которые могут быть использованы в
219косвенном словаре, вместе с номерами соответствующих
220классификаторов окончаний. Классификаторы приставок при этом не
221используются. Программа завершается успешно, если заданное слово
222удается трактовать как производную форму. Ключ "-q" подавляет вывод
223информации. В этом случае о результатах выполнения операции можно
224судить по коду завершения программы.
225
226-t <file> -- Проверка лексической базы данных по тестовому словарю.
227
228Текстовый файл, указываемый в качестве параметра, должен содержать
229тестовый словарь в формате, описанном выше. Программа сравнивает
230указанные в тестовом словаре произношения с получаемыми из лексической
231базы данных и выводит в поток стандартного вывода или в файл, заданный
232ключом "-f", записи, для которых было обнаружено несоответствие. Если
233в качестве параметра этого ключа указать "-", тестовый словарь будет
234читаться из потока стандартного ввода.
235
236-d <key> -- Удаление из базы данных записи с заданным ключом.
237
238Эта операция требует явного указания набора данных при помощи одного
239из ключей "-X", "-M", "-G", "-L", "-P" или "-C". Для правил в качестве
240ключа используется их порядковый номер в наборе.
241
242-D -- Удаление набора данных.
243
244Набор данных необходимо явно указать при помощи одного из ключей "-X",
245"-M", "-G", "-L", "-P" или "-C". Удаляется полностью все содержимое
246выбранного набора данных.
247
248-c -- Очистка базы данных от лишней информации.
249
250Из базы данных удаляются записи, не оказывающие никакого влияния на
251результаты полного поиска. Этот процесс затрагивает только словари. Из
252прямого словаря удаляются записи, дублирующие информацию, которая
253может быть получена на основании косвенного словаря или системы
254общих правил. Из косвенного словаря удаляются записи, не являющиеся
255на самом деле базовыми формами в соответствии с системой
256классификаторов окончаний. При помощи ключей "-X" и "-M" можно выбрать
257лишь один из этих словарей, который будет задействован в
258процессе. Если посредством ключа "-M" выбран словарь базовых форм, из
259него удаляются также вхождения, которые предположительно могут быть
260получены путем присоединения известных приставок. В общем случае столь
261интенсивная очистка является избыточной и приводит к утрате ряда
262полезных вхождений.
263
264
265Следующая группа ключей посвящена выбору набора данных. Ключи этой
266группы являются взаимоисключающими. Они влияют на выполнение операций
267вставки, удаления и извлечения содержимого базы данных. При удалении и
268извлечении содержимого набор данных должен быть указан
269явно. Добавление словарных статей можно выполнять без явного указания
270словаря. В этом случае новая запись помещается в косвенный словарь,
271если ее удается трактовать как базовую форму, в противном случае - в
272прямой словарь. Для правил же необходимо всегда явно указывать
273набор.
274
275-X -- Прямой словарь.
276
277-M -- Косвенный словарь.
278
279-G -- Общие правила.
280
281-L -- Классификаторы окончаний.
282
283-P -- Классификаторы приставок.
284
285-C -- Корректоры.
286
287
288следующая группа ключей управляет процессом поиска информации в
289лексической базе данных, позволяя включать в него лишь те или иные
290явно заданные стадии. По умолчанию, то есть при отсутствии ключей этой
291группы в командной строке, выполняется полный цикл, как в Ru_tts. Эти
292ключи влияют на действия, выполняемые программой при тестировании
293лексической базы данных и поиске информации в ней.
294
295-x -- Просматривается прямой словарь.
296
297-m -- Слово трактуется как производная форма.
298
299-g -- Используются общие правила.
300
301
302Следующая группа содержит всего один ключ, определяющий действия,
303выполняемые программой при вставке новых данных в базу.
304
305-r -- Режим замены.
306
307При вставке словарных данных новые словарные статьи заменяют уже
308существующие с идентичным ключевым полем. По умолчанию такие словарные
309статьи просто игнорируются. При вставке правил режим замены означает
310полную замену указанной системы правил. По умолчанию новые правила
311дописываются в конец набора.
312
313
314Последняя группа включает в себя ключи, влияющие на поведение
315программы в целом.
316
317-f <file> -- Использовать <file> вместо стандартного ввода или вывода.
318
319-q -- Подавление вывода.
320
321Этот ключ подавляет вывод результатов поиска и замечаний о
322записях-дубликатах при вставке.
323
324-v -- Вывод дополнительной информации.
325
326Печатается отчет о выполняемых действиях и некоторая статистическая
327информация.
328
329
330
331А теперь немного истории.
332
333Этот словарь, собственно, возник изначально как реализация моей мечты
334вставить расстановку ударений в Ru_tts. Поиски подходящего словаря
335ударений в интернете к успеху, увы, не привели. Но тут я вдруг
336вспомнил, что свободно распространяемый в электронном виде
337англо-русский словарь Мюллера в одном из своих вариантов содержал
338расстановку ударений во всех русских словах. Я извлек этот материал и
339получил немногим более 60000 вхождений. Это было уже что-то, хотя, как
340оказалось, не слишком густо. Тем не менее, жизнеспособность идеи уже
341можно было как-то оценить.
342
343А дальше начался длительный процесс доводки. Ряд слов пришлось
344исключить, так как ударение в них зависит от контекста, например,
345"окна", "слова" и тому подобное. Далее оказалось, что ударениями здесь
346дело отнюдь не ограничивается. Например, такая штука, как "счастливый
347мужчина". Вылез и еще целый ряд тонкостей.
348
349Разумеется, я вполне отдаю себе отчет в том, что и сейчас все это
350весьма далеко от желанного совершенства, но все же уже, пожалуй, можно
351вынести на суд широкой общественности. По крайней мере, то, как Ru_tts
352работает с использованием этого словаря, мне нравится заметно больше,
353чем то, что было до того.
354
355
356Теперь же я хочу выразить глубочайшую благодарность тем, кто не
357поленился расставить ударения в словаре Мюллера, а также склонить
358голову в благодарном поклоне Иванову Геннадию Григорьевичу и своей
359сестренке Татьяне, которые на начальном этапе самоотверженно взяли на
360себя львиную долю самой черновой технической работы по корректировке и
361пополнению словаря.
362
363Не могу так же не выразить глубокую признательность Сергею Флейтину за
364новые слова и замечания и, разумеется, Дмитрию Падучих, который не
365только прислал мне немало новых слов, но и разработал некий механизм,
366позволяющий несколько автоматизировать процесс их генерации, который я
367тоже включаю в состав данного дистрибутива. Вот пояснения Дмитрия к
368этому механизму:
369
370Я написал небольшую моду для Emacs, чтобы редактировать словари
371произношений. Главной её особенностью является то, что можно
372"перемножать" кусочки слов. То есть, находясь в этой моде, можно
373вызвать буфер, ввести там выражение, например:
374
375ба+лк | а и е у ой е и ам ами ах
376
377а Emacs затем вставит в буфер словаря:
378
379балка ба+лка
380балкам ба+лкам
381балками ба+лками
382балках ба+лках
383балке ба+лке
384балки ба+лки
385балкой ба+лкой
386балку ба+лку
387
388Ещё один пример:
389
390вы* по | нё+с пё+р | . ся
391
392вынес вы+нес
393вынесся вы+несся
394выпер вы+пер
395выперся вы+перся
396понес понё+с
397понесся понё+сся
398попер попё+р
399поперся попё+рся
400
401Чтобы установить, скопируйте rulex.el в директорию, которая есть в
402load-path, и скомпилируйте его там.
403Затем в ~/.emacs можно ещё добавить:
404
405(autoload 'rlex-mode "rulex" nil 'interactive)
406(add-to-list 'auto-mode-alist '("\\.rle?x\\'" . rlex-mode))
407
408чтобы файлы с расширением .rlex и .rlx открывались в rlex-mode.
409____________________________________________________________
410
411
412Порецкий Игорь, Санкт-Петербург, <poretsky@mlbox.ru>
413