Предупреждение
Информация в этом разделе немного устарела.
В тех случаях, когда слово не получается найти простым поиском по словарю (с учетом буквы “ё”), в дело вступает предсказатель.
Предсказатель основан на идее о том, что если слова в русском языке оканчиваются одинаково, то и форму они имеют, скорее всего, одинаковую.
Примечание
Алгоритм предсказания в основе своей похож на тот, что описан на aot.ru, и на тот, что применяется в pymorphy1, но отличается в деталях и содержит дополнительные эвристики.
Для предсказателя реализованы 2 алгоритма предсказания, которые работают совместно.
Если 2 слова отличаются только тем, что к одному из них что-то приписано спереди, то, скорее всего, и склоняться они будут одинаково.
Это особенно справедливо в тех случаях, когда это “что-то” - один из известных словообразовательных префиксов (например, “кошка” - “псевдокошка”).
В pymorphy2 хранится небольшой список таких префиксов (например, “не”, “анти”, “псевдо”, “супер”, “дву” и т.д.); если слово начинается с одного из таких префиксов, то префикс отсекается, а остаток передается на разбор.
Если слово не начинается с такого префикса, то анализатор все равно пробует разобрать слово путем отсечения префикса: сначала он пробует считать одну первую букву слова префиксом, потом 2 первых буквы и т.д., и пытается при этом анализировать то, что осталось (это делается только для не очень длинных префиксов и не очень коротких остатков).
В подходе с отсечением префиксов есть два принципиальных ограничения:
Разбор многих слов нельзя предсказать, отсекая префикс и разбирая остаток. Например, хотелось бы, чтоб если в словаре было слово “кошка”, но не было “мошка” и “ошка”, на основе словарного слова “кошка” анализатор смог бы предположить, как склоняется “мошка” (т.к. они заканчиваются одинаково).
Для того, чтоб предсказывать формы слов по тому, как слова заканчиваются, при конвертации словарей строится DAWG со всеми возможными окончаниями слов (в данный момент - от однобуквенных до пятибуквенных); каждому окончанию сопоставляется массив с возможными вариантами разбора слов с такими окончаниями.
Схема хранения похожа на ту, что в основном словаре (см. раздел Упаковка слов), только
<конец слова> <разделитель> <продуктивность> <номер парадигмы> <номер формы в парадигме>
Если для каждого “окончания” хранить все возможные варианты разбора, то получится заведомо много лишних (очень маловероятных) правил. Поэтому скрипт компиляции словаря умеет отсекать правила по нескольким критериям:
По умолчанию min_paradigm_popularity == 3, min_ending_freq == 2.
Разбор сводится к поиску наиболее длинной правой части разбираемого слова, которая есть в DAWG с окончаниями.
Кроме того, для каждого словоизменительного префикса (ПО, НАИ) точно так же строится еще по одному DAWG; если слово начинается с одного из этих префиксов, то анализатор добавляет к результату варианты предсказания, полученные поиском по соответствующему DAWG.
Примечание
Термин “окончание” тут употребляется в смысле “правая часть слова определенной длины”; он не имеет отношения к “школьному” определению; кроме того, тут он не имеет отношения к “окончаниям” в парадигмах.
В русском языке не все части речи продуктивные: например, нельзя приписать что-то к предлогу, чтоб получить другой предлог; все предлоги есть в словаре, и предсказывать незнакомые слова как предлоги неправильно. Такие варианты предсказания отбрасываются предсказателем.
Предупреждение
Разбор слов, записанных через дефис, еще не реализован.
При предсказании по концу слова результаты сортируются по “продуктивности” вариантов разбора: наиболее продуктивные варианты будут первыми.
Другими словами, варианты разбора (= номера парадигм) упорядочены по частоте, с которой эти номера парадигм соответствуют данному окончанию для данной части речи - без учета частотности по корпусу.
Экспериментального подтверждения правильности этого подхода нет, но “интуиция” тут такая:
Поэтому используется частотность по парадигмам, полученная исключительно из словаря.
Примечание
В настоящий момент результаты сортируются только при предсказании по концу слова. Разборы для словарных слов и разборы, предсказанные путем отсечения префикса, специальным образом сейчас не сортируются.
pymorphy2 приписывает каждому варианту разбора число (0.0 < x <= 1.0); это число может служить оценкой того, насколько анализатор уверен в данном варианте разбора.
Например, оценка 1.0 означает, что слово найдено в словаре, а оценка 0.001 будет свидетельствовать о том, что это редкий вариант разбора, предложенный предсказателем.
Предупреждение
Это очень экспериментальная возможность.
Оценки не стоит рассматривать как значения вероятностей правильности разбора. Более того, никаких подтверждений связи вероятности правильности разбора с оценкой предсказателя у меня тоже нет; “коэффициенты”, на основе которых вычисляются оценки, выбраны вручную достаточно произвольно.