Предупреждение

Информация в этом разделе немного устарела.

Предсказатель

В тех случаях, когда слово не получается найти простым поиском по словарю (с учетом буквы “ё”), в дело вступает предсказатель.

Предсказатель основан на идее о том, что если слова в русском языке оканчиваются одинаково, то и форму они имеют, скорее всего, одинаковую.

Примечание

Алгоритм предсказания в основе своей похож на тот, что описан на aot.ru, и на тот, что применяется в pymorphy1, но отличается в деталях и содержит дополнительные эвристики.

Для предсказателя реализованы 2 алгоритма предсказания, которые работают совместно.

Первый подход: отсечение префиксов

Если 2 слова отличаются только тем, что к одному из них что-то приписано спереди, то, скорее всего, и склоняться они будут одинаково.

Это особенно справедливо в тех случаях, когда это “что-то” - один из известных словообразовательных префиксов (например, “кошка” - “псевдокошка”).

В pymorphy2 хранится небольшой список таких префиксов (например, “не”, “анти”, “псевдо”, “супер”, “дву” и т.д.); если слово начинается с одного из таких префиксов, то префикс отсекается, а остаток передается на разбор.

Если слово не начинается с такого префикса, то анализатор все равно пробует разобрать слово путем отсечения префикса: сначала он пробует считать одну первую букву слова префиксом, потом 2 первых буквы и т.д., и пытается при этом анализировать то, что осталось (это делается только для не очень длинных префиксов и не очень коротких остатков).

Второй подход: предсказание по концу слова

В подходе с отсечением префиксов есть два принципиальных ограничения:

  • разбор не должен зависеть от префикса (что неверно для словоизменительных префиксов “по” и “наи”, которые образуют формы прилагательных);
  • морфологический анализатор должен уметь разбирать правую часть слова (путем поиска по словарю или еще как-то) - правая часть слова должна иметь какой-то смысл сама по себе.

Разбор многих слов нельзя предсказать, отсекая префикс и разбирая остаток. Например, хотелось бы, чтоб если в словаре было слово “кошка”, но не было “мошка” и “ошка”, на основе словарного слова “кошка” анализатор смог бы предположить, как склоняется “мошка” (т.к. они заканчиваются одинаково).

Для того, чтоб предсказывать формы слов по тому, как слова заканчиваются, при конвертации словарей строится DAWG со всеми возможными окончаниями слов (в данный момент - от однобуквенных до пятибуквенных); каждому окончанию сопоставляется массив с возможными вариантами разбора слов с такими окончаниями.

Схема хранения похожа на ту, что в основном словаре (см. раздел Упаковка слов), только

  • вместо самих слов хранятся все их возможные окончания;
  • к номеру парадигмы и индексу формы в парадигме добавляется еще “продуктивность” данного правила - количество слов в словаре, которые имеют данное окончание и разбираются данным образом.
<конец слова> <разделитель> <продуктивность> <номер парадигмы> <номер формы в парадигме>

Если для каждого “окончания” хранить все возможные варианты разбора, то получится заведомо много лишних (очень маловероятных) правил. Поэтому скрипт компиляции словаря умеет отсекать правила по нескольким критериям:

  • парадигма должна быть “продуктивной”: в словаре должно иметься хотя бы min_paradigm_popularity лемм, разбираемых по этой парадигме;
  • “окончания” должны быть распространенными: в словаре должно иметься хотя бы min_ending_freq слов, которые заканчиваются так;
  • вариант разбора должен быть популярным: для данного окончания для каждой части речи оставляем только самые популярные варианты разбора;

По умолчанию min_paradigm_popularity == 3, min_ending_freq == 2.

Разбор сводится к поиску наиболее длинной правой части разбираемого слова, которая есть в DAWG с окончаниями.

Кроме того, для каждого словоизменительного префикса (ПО, НАИ) точно так же строится еще по одному DAWG; если слово начинается с одного из этих префиксов, то анализатор добавляет к результату варианты предсказания, полученные поиском по соответствующему DAWG.

Примечание

Термин “окончание” тут употребляется в смысле “правая часть слова определенной длины”; он не имеет отношения к “школьному” определению; кроме того, тут он не имеет отношения к “окончаниям” в парадигмах.

Ограничение на части речи

В русском языке не все части речи продуктивные: например, нельзя приписать что-то к предлогу, чтоб получить другой предлог; все предлоги есть в словаре, и предсказывать незнакомые слова как предлоги неправильно. Такие варианты предсказания отбрасываются предсказателем.

Слова, записанные через дефис

Предупреждение

Разбор слов, записанных через дефис, еще не реализован.

Сортировка результатов разбора

При предсказании по концу слова результаты сортируются по “продуктивности” вариантов разбора: наиболее продуктивные варианты будут первыми.

Другими словами, варианты разбора (= номера парадигм) упорядочены по частоте, с которой эти номера парадигм соответствуют данному окончанию для данной части речи - без учета частотности по корпусу.

Экспериментального подтверждения правильности этого подхода нет, но “интуиция” тут такая:

  1. нам не важно, какие слова в корпусе встречаются часто, т.к. предсказатель работает для редких слов, и редкие слова он должен предсказывать как редкие, а не как распространенные;
  2. для “длинного хвоста” частотности в корпусе конкретные цифры имеют не очень много значения, т.к. флуктуации очень большие, “эффект хоббита” и т.д.
  3. С другой стороны, важно, какие парадигмы в русском языке более продуктивные, какие порождают больше слов.

Поэтому используется частотность по парадигмам, полученная исключительно из словаря.

Примечание

В настоящий момент результаты сортируются только при предсказании по концу слова. Разборы для словарных слов и разборы, предсказанные путем отсечения префикса, специальным образом сейчас не сортируются.

Оценки для вариантов разбора

pymorphy2 приписывает каждому варианту разбора число (0.0 < x <= 1.0); это число может служить оценкой того, насколько анализатор уверен в данном варианте разбора.

Например, оценка 1.0 означает, что слово найдено в словаре, а оценка 0.001 будет свидетельствовать о том, что это редкий вариант разбора, предложенный предсказателем.

Предупреждение

Это очень экспериментальная возможность.

Оценки не стоит рассматривать как значения вероятностей правильности разбора. Более того, никаких подтверждений связи вероятности правильности разбора с оценкой предсказателя у меня тоже нет; “коэффициенты”, на основе которых вычисляются оценки, выбраны вручную достаточно произвольно.