.. _char-substitutes:

Буква Ё
=======

Если не ударяться в крайности, то можно считать, что в русском языке
употребление буквы "ё" допустимо, но не обязательно. Это означает, что как
в исходном тексте, так и в словарях она иногда может быть, а иногда ее
может не быть.

В pymorphy2 считается, что:

* в словарях употребление буквы "ё" обязательно; "е" вместо "ё" (как и "ё"
  вместо "е") - это ошибка в словаре. Иными словами, "е" и "ё" в
  словарях - две совсем разные буквы.

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

  .. note::

    При этом входное слово "озёра" будет однозначно разобрано как
    "(глубокие) озёра".

Детали реализации
-----------------

"Наивный" подход - это генерация все вариантов возможных замен "е" на "ё"
во входном слове и проверка всех вариантов по словарю. В русском языке
"е" - очень распространенная буква, и много слов, где "е" встречается
несколько раз. Например, для слова с 3 буквами "е" нужно сгенерировать
еще 7 вариантов слова - вместо 1 проверки по словарю нужно было
бы выполнить 8 (+ время на генерацию вариантов слов).

При разборе pymorphy2 использует другой подход - все слова хранятся в графе,
и при обходе графа кроме направлений "е" каждый раз еще пробуется
направление "ё". При этом в исходном коде pymorphy2 этого обхода графа
в явном виде нет, т.к. библиотеки DAWG_ и DAWG-Python_ сами умеет производить
"поиск с возможными заменами".

.. _DAWG: https://github.com/kmike/DAWG
.. _DAWG-Python: https://github.com/kmike/DAWG-Python


.. note::

    По оценкам, полученным в начале разработки (которые, соответственно,
    могут быть неверными для текущей версии), поддержка буквы "ё"
    в pymorphy2 замедляла разбор на 10-40% (в зависимости от интерпретатора).
