Интеграция с django

Настройка

  1. Добавляем 'pymorphy' в INSTALLED_APPS.

  2. Описываем в settings.py установленные словари:

    PYMORPHY_DICTS = {
        'ru': { 'dir': '/usr/share/pymorphy/ru' },
    }
    

    более сложный пример:

    PYMORPHY_DICTS = {
        'ru': {
            'dir': os.path.join([PROJECT_DIR, 'files', 'dicts']),
            'backend': 'cdb',
            'use_cache': False,
        },
    }
    

    Параметры:

    • dir - обязательный параметр, путь до папки с файлами;
    • backend - используемое key-value хранилище (‘sqlite’ по умолчанию);
    • use_cache - использовать ли кэш (True по умолчанию).

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

В случае, когда настроена интеграция pymorphy с django, экземпляр анализатора следует получать следующим образом:

from pymorphy.django_conf import default_morph as morph

Не стоит получать экземпляр анализатора через pymorphy.get_morph во вьюхах (или еще где-то на каждый запрос) - это приведет к утечке ресурсов.

Шаблонные фильтры

Фильтры подключаются следующей командой:

{% load pymorphy_tags %}

inflect

Меняет грамматическую форму каждого слова на указанную в параметрах. Про доступные параметры можно почитать тут (см. “Полный формат”).

Пример:

{# в переменной city "Нижний Новгород" #}

{% load pymorphy_tags %}
Мы начали работу в {{ city|inflect:"пр" }}!

{# выведет "Мы начали работу в Нижнем Новгороде!" #}

Пример с несклоняемой частью

{% load pymorphy_tags %}

Не осталось у нас {{ "лошадь [[Пржевальского]]"|inflect:"рд,мн" }}.

{# выведет "Не осталось у нас лошадей Пржевальского" #}

inflect_marked

Идентичен фильтру inflect за исключением того, что противоположным образом трактует [[ ]]

{% load pymorphy_tags %}
Не осталось у нас {{ "[[лошадь]] Пржевальского"|inflect_marked:"рд,мн" }}.

{# выведет "Не осталось у нас лошадей Пржевальского" #}

plural

Ставит слово в форму, которая согласуется с заданным числом (1 попугай, 2 попугая, 5 попугаев).

{% load pymorphy_tags %}

{# в переменной num число попугаев (пусть = 38) #}
На дереве {{ num }} {{ "попугай"|plural:num }}.
{# выведет "На дереве 38 попугаев." #}

{# в переменной animal - "лошадь" #}
А еще есть {{ num }} {{ animal|plural:num }}.
{# выведет "А еще есть 38 лошадей." #}

Фильтры inflect и plural не склоняют все, что заключено в двойные квадратные скобки. Фильтр inflect_marked - наоборот, работает только с тем, что в двойных квадратных скобках.

Можно указать другие разделители (обязательно 2х-символьные), определив в settings.py переменные PYMORPHY_MARKER_OPEN и PYMORPHY_MARKER_CLOSE.

Note

Фильтры из pymorphy_tags стараются сохранить написание больших-маленьких букв (обрабатываются варианты “ВСЕ СЛОВО БОЛЬШИМИ”, “С заглавной”, “все маленькими”).

Если по какой-то причине смена формы не удалась, возвращают исходную строку.

Warning

Фильтры в настоящий момент могут плохо работать с именами и фамилиями.