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% корректно проводить разбиения всех слов,
включенных в первоначальную шаблонную базу слов. Слова-исключения, при необ-
ходимости, будут внесены в окончательную базу фрагментов, т. к., если выки-
нуть их из базы фрагментов, количество правильных распознаваний разбиений
уменьшится, что противоречит описанному алгоритму.

Просмотры
Личные инструменты