Strict Standards: call_user_func_array() expects parameter 1 to be a valid callback, non-static method CoreParserFunctions::grammar() should not be called statically in /home/cfeet77/sites/rodovichok.ru/www/media/includes/Parser.php on line 2927
Материал из Rodovichok.
Постоянный адрес статьи
Расстановка ударений и переносов в русском языке
Раcпознавание разбиений слов.
-----------------------------
(С) А. С. Медноногов, 1997. Воспроизведение этого текста по частям или без
ссылки на автора, внесение в него изменений и дополнений запрещены.
Решаемые задачи: расстановка переносов (П), расстановка ударений (У).
Шаг 1 (подготовительный, выполняется вручную). Составляем шаблонную базу
из неповторяющихся слов; каждое слово имеет разбиение в соответствии с прави-
лами расстановки переносов (П) либо с правилами расстановки ударений (У).
Пример: (П): раз/ряд/ность; (У): муж/ик, г/омос/апиенс.
Шаг 2 (создание базы фрагментов). Разбиваем все слова в шаблонной базе на
всевозможные фрагменты, для каждого из которых указывается положение указате-
ля разбиения. Пример (У): из слова "ух/а" следует составить такие фрагменты:
/у, у/, /х, х/, /а, а/, /ух, у/х, ух/, /ха, х/а, ха/, /уха, у/ха, ух/а, уха/.
Структура фрагмента:
n (char *) - имя фрагмента;
f (int) - длина фрагмента;
wf (char) - флаг фрагмента (1 - фрагмент есть всё слово, 0 - часть слова);
d (int) - указатель разбиения;
p1 (long int) - количество случаев, когда указатель разбиения фрагмента
совпадал с указателем разбиения слова;
p0 (long int) - количество случаев, когда указатель разбиения фрагмента
не совпадал с указателем разбиения слова;
s - вещественный весовой коэффициент;
p - вещественный вероятностный коэффициент.
Замечание. В базе фрагментов фрагменты различаются по полям n, f, wf, d.
I-ый этап разбиения: формирование базы фрагментов и расчет p1, p0 для
каждого фрагмента.
Пример (У): Есть база слов: шам/ан, тум/ан, игром/ан. Это означает, что,
после выполнения всевозможных разбиений всех слов на фрагменты в базе фраг-
ментов, в частности, окажутся фрагменты вида:
м/ан: (n="ман", f=3, wf=0, d=1, p1=3, p0=0, s=?, p=?);
ма/н: (n="ман", f=3, wf=0, d=2, p1=0, p0=3, s=?, p=?);
II-oй этап: расчет глобальных коэффициентов pa1, pa0, pa.
pa1 - общее количество случаев, когда разбиение в фрагментах совпадало с
разбиением в словах (сумма полей p1 по всем фрагментам);
pa0 - общее количество случаев, когда разбиение в фрагментах не совпадало
с разбиением в словах (сумма полей p0 по всем фрагментам);
pa=pa1/(pa0+pa1).
III-ий этап: расчет s, p для каждого фрагмента.
p=(1-pa)*p1/(pa*p0+(1-pa)*p1);
s=min { 1/sqrt(1/4-sqr(p-1/2))-2, 1E20 } - может возникнуть деление на
ноль, тогда бесконечность заменяем на очень большое число.
Шаг 3 (исключение лишних фрагментов). Сортируем фрагменты по возрастанию
ключа (p0+p1). Исключение фрагментов начинаем с начала отсортированной пос-
ледовательности. ПОСЛЕДОВАТЕЛЬНО исключаем из базы фрагментов все такие фраг-
менты, которые не уменьшают количество разбиений, правильно распознанных
программой (о распознавании разбиений см. чуть ниже). Оставшуюся базу фраг-
ментов записываем в файл - он пригодится нам при распознавании разбиений
любых слов, даже не включенных в первоначальную шаблонную базу.
Замечание 1. Распознавание разбиений слова осуществляется так (оно при-
гождается, кстати, в процессе выполнения шага 3, да и вообще мы ради этого
распознавания и старались):
а) в распознаваемом слове проведем последовательность тестов для всех
позиций указателя разбиения. Пример (У): Для слова "м/ама" система тестов
такова: /мама, м/ама, ма/ма, мам/а, мама/.
б) для конкретного тестового разбиения разбиваем слово на все возможные
фрагменты, но такие, чтобы указатель текущего тестового разбиения соприка-
сался бы с фрагментом или оказывался бы у него внутри. К примеру, для теку-
щего теста "мам/а" получим фрагменты: мам/а, ам/а, м/а, /а, мам/, ам/, м/.
Для каждого i-того полученного фрагмента, если он есть в базе оставшихся
фрагментов, определены s, p. Назовем их si, pi.
в) вычисляем: m=Sum(si*pi)/Sum(si) - частное от двух сумм по i.
г) разбиение в тестовой точке имеет место, если m>=1/2, иначе его там нет.
Замечание 2. Благодаря введению флага wf в структуру фрагмента гаранти-
руется, что система будет на 100% корректно проводить разбиения всех слов,
включенных в первоначальную шаблонную базу слов. Слова-исключения, при необ-
ходимости, будут внесены в окончательную базу фрагментов, т. к., если выки-
нуть их из базы фрагментов, количество правильных распознаваний разбиений
уменьшится, что противоречит описанному алгоритму.