
.. _prediction:

Разбор несловарных слов
=======================

В тех случаях, когда слово не получается найти простым поиском
по словарю (с :ref:`учетом <char-substitutes>` буквы "ё"),
в дело вступают "предсказатели" - правила разбора несловарных слов.

.. note::

    Алгоритмы предсказания в похожи на те, что описаны на
    `aot.ru <http://aot.ru>`_, и на те, что применяются в pymorphy1_,
    но отличаются в деталях и содержат дополнительные эвристики.

.. _pymorphy1: https://pymorphy.readthedocs.io/en/latest/algo.html#prediction-algo


Отсечение известных префиксов
-----------------------------

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

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

Отсечение неизвестных префиксов
-------------------------------

Если 2 слова отличаются только тем, что к одному из них что-то приписано
спереди, то, скорее всего, и склоняться они будут одинаково. Поэтому
если разбираемое слово можно представить как ПРЕФИКС + какое-то другое слово
из словаря, то pymorphy2 считает, что слово разбирается так же,
как и это другое слово.

При этом должны выполняться несколько дополнительных условий:

* длина словарного слова должна быть не меньше 3;
* длина префикса не должна быть больше 5;
* словарное слово - это существительное, прилагательное, глагол, причастие или
  деепричастие.

Алгоритм такой: сначала pymorphy2 пробует считать первую букву префиксом,
потом первые две буквы, потом первые 3 буквы и т.д. до 5, и смотрит, нет ли
остатка в словаре.

Предсказание по концу слова
---------------------------

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

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

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

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

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

* pymorphy2 сохраняет только самый частотный разбор для каждой части речи;
* разборы, принадлежащие "непродуктивным" парадигмам, удаляются
  (непродуктивными сейчас считаются парадигмы, которым соответствует
  менее ``min_paradigm_popularity=3`` лексем в словаре);
* редкие окончания удаляются (те, которые встретились только
  ``min_ending_freq=1`` раз);
* не все части речи продуктивные: например, нельзя приписать
  что-то к предлогу, чтоб получить другой предлог; все предлоги есть в словаре,
  и предсказывать незнакомые слова как предлоги неправильно - такие
  варианты предсказания отбрасываются предсказателем.

Результат кодируется в DAFSA. Схема хранения похожа на ту, что в основном
словаре (см. раздел :ref:`Упаковка слов <word-packing>`), только

* вместо самих слов хранятся все их возможные окончания;
* к номеру парадигмы и индексу формы в парадигме добавляется
  еще "продуктивность" данного правила - количество слов
  в словаре, которые имеют данное окончание и разбираются данным образом.

::

    <конец слова> <разделитель> <продуктивность> <номер парадигмы> <номер формы в парадигме>

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

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

.. note::

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

Наречия на по-
--------------

Несловарное слова предсказываются как наречия, если верно следующее:

* слово начинается на "по-";
* оно длиннее 5 символов;
* часть слова без "по-" может быть разобрана как прилагательное единственного
  числа дательного падежа.

Примеры: по-северному, по-хорошему.


Частица, отделенная дефисом
---------------------------

Иногда удобно слова, к которым через дефис приписана частица, разбирать как
единый токен. Поэтому pymorphy2 умеет разбирать токены вроде
"смотри-ка" или "посмотрел-таки".


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

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

В настоящий момент поддерживается 2 способа образования таких слов:

1. Левая часть - неизменяемая приставка/основа (например, “интернет-магазин”,
   “воздушно-капельный”). В этом случае форма слова определяется второй частью.
   Этот случай добавляется в возможные варианты разбора всегда.
2. Равноправные части, склоняемые вместе (например, “человек-паук”). Этот
   случай добавляется в возможные варианты разбора только тогда, когда обе
   части имеют совместимую форму (есть вариант разбора первой части,
   который не противоречит какому-то варианту разбора второй).

.. note::

    Если слово содержит более одного дефиса (образовано более чем из двух
    частей), это правило не применяется.

Инициалы
--------

Однобуквенные токены в верхнем регистре pymorphy2 предсказывает как
инициалы: для них возвращаются варианты разбора "имя" и "отчество",
по всем родам, падежам и числам.

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

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

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

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

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

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

.. note::

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

.. _OpenCorpora: http://opencorpora.org
