Купить
PyMorpher
PyMorpher – это программный модуль для склонения по падежам ФИО,
должностей, профессий, товаров и географических названий.
Склонение по падежам и числам
Склонение и определение рода выполняет класс Declension:
from morpher import russian as mr
def test_parse():
declension = mr.Declension()
parse = declension.parse("Сергиев Посад")
assert parse.nominative == "Сергиев Посад"
assert parse.genitive == "Сергиева Посада"
assert parse.dative == "Сергиеву Посаду"
assert parse.accusative == "Сергиев Посад"
assert parse.instrumental == "Сергиевым Посадом"
assert parse.prepositional == "Сергиевом Посаде"
assert parse.prepositionalO == "о Сергиевом Посаде"
assert parse.locative == "Сергиевом Посаде"
assert parse.locativeVNa == "в Сергиевом Посаде"
assert parse.plural.nominative == "Сергиевы Посады"
assert parse.plural.genitive == "Сергиевых Посадов"
assert parse.plural.dative == "Сергиевым Посадам"
assert parse.plural.accusative == "Сергиевы Посады"
assert parse.plural.instrumental == "Сергиевыми Посадами"
assert parse.plural.prepositional == "Сергиевых Посадах"
assert parse.plural.prepositionalO == "о Сергиевых Посадах"
assert parse.plural.locative == "Сергиевых Посадах"
assert parse.plural.locativeVNa == "в Сергиевых Посадах"
Создание объекта класса Declension занимает некоторое время,
поэтому в целях оптимизации лучше создавать его один раз
и затем использовать несколько раз.
Склонение ФИО на украинском:
from morpher import ukrainian as mu
declension = mu.Declension()
p = declension.parse("Крутько Катерина Володимировна")
assert p.getForm(mu.Case.Nom) == 'Крутько Катерина Володимировна'
assert p.getForm(mu.Case.Gen) == 'Крутько Катерини Володимировни'
assert p.getForm(mu.Case.Dat) == 'Крутько Катерині Володимировні'
assert p.getForm(mu.Case.Acc) == 'Крутько Катерину Володимировну'
assert p.getForm(mu.Case.Ins) == 'Крутько Катериною Володимировною'
assert p.getForm(mu.Case.Loc) == 'Крутько Катерині Володимировні'
assert p.getForm(mu.Case.Voc) == 'Крутько Катерино Володимировно'
Управление склонением при помощи атрибутов
Некоторые слова могут склоняться по-разному в зависимости от рода:
| |
Мужской |
Женский |
| Карен |
о Карене |
о Карен |
| Акопян |
об Акопяне |
об Акопян |
| Цой |
о Цое (о Викторе Цое) |
о Цой (об Аните Цой) |
от того, является ли слово именем собственным или нарицательным:
| |
Собственное |
Нарицательное |
| Филин |
Филиным |
Филином |
| Камин |
Каминым |
Камином |
| Родина |
о Родиной |
о Родине |
или от одушевленности:
| |
Одушевленное |
Неодушевленное |
| Владимир |
во Владимира (имя) |
во Владимир (город) |
| Ростов |
в Ростова (фамилия) |
в Ростов (город) |
| Красный боец |
в Красного бойца (боец Красной армии) |
в Красный боец (поселок) |
| бактерии |
изучать бактерий |
изучать бактерии |
Вот пример, как можно управлять склонением таких слов при помощи атрибутов:
from morpher import russian as mr
name = "Женя Беркович"
declension = mr.Declension()
m = declension.parse(name, mr.Attributes.Masculine).dative
f = declension.parse(name, mr.Attributes.Feminine).dative
assert m == "Жене Берковичу" // мужской род
assert f == "Жене Беркович" // женский род
Разделение на фамилию, имя и отчество
parse = declension.parse("Александр Сергеевич Пушкин")
assert parse.fio is not None
assert parse.fio.name == "Александр"
assert parse.fio.surname == "Пушкин"
assert parse.fio.patronymic == "Сергеевич"
Если входная строка не была распознана как ФИО,
то parse.fio будет иметь значение None.
Определение рода (пола)
У объекта parse есть атрибут gender, который показывает род
входного слова:
assert declension.parse("папа").gender == mr.Gender.Masculine
assert declension.parse("мама").gender == mr.Gender.Feminine
assert declension.parse("дитя").gender == mr.Gender.Neuter
assert declension.parse("дети").gender == mr.Gender.Plural
Пример для прилагательных:
assert declension.parse("красивый").gender == mr.Gender.Masculine
assert declension.parse("красивая").gender == mr.Gender.Feminine
assert declension.parse("красивое").gender == mr.Gender.Neuter
assert declension.parse("красивые").gender == mr.Gender.Plural
Во множественном числе возвращается значение mr.Gender.Plural,
потому что в современном русском языке во множественном числе
рода не различаются (хотя еще лет 100 назад на письме было различие:
красивые – мужской и средний род, но
красивыя – женский род).
Украинская версия умеет склонять только ФИО и поэтому различает
только два рода:
from morpher import ukrainian as mu
declension = mu.Declension()
assert declension.parse("Микола").gender == mu.Gender.Masculine
assert declension.parse("Оксана").gender == mu.Gender.Feminine
Склонение по родам
За склонение по родам отвечает метод transformGender:
assert declension.transformGender("красный", mr.Gender.Masculine) == "красный"
assert declension.transformGender("красный", mr.Gender.Feminine) == "красная"
assert declension.transformGender("красный", mr.Gender.Neuter) == "красное"
assert declension.transformGender("красный", mr.Gender.Plural) == "красные"
Склонять по родам можно прилагательные (красный, лисий), причастия (имеющийся)
и порядковые числительные (первый, второй, третий...)
Пример согласования прилагательного с именем по роду:
def dear(name: str):
gender = declension.parse(name).gender
adj = declension.transformGender("Уважаемый", gender)
return adj + " " + name
assert dear("Степан") == "Уважаемый Степан"
assert dear("Чулпан") == "Уважаемая Чулпан"
Пропись чисел
speller = mr.NumberSpeller(declension)
result = speller.spell(5, "рабочий день")
assert result.number == "пять"
assert result.unit == "рабочих дней"
result = speller.spell(21, "рабочий день", mr.Padeg.Genitive)
assert result.number == "двадцати одного"
assert result.unit == "рабочего дня"
Пропись в виде порядкового числительного:
speller = mr.OrdinalSpeller(declension)
result = speller.spellOrdinal(5, "колесо")
assert result.number + " " + result.unit == "пятое колесо"
Пропись дат
Для прописи дат служит функция spellDate:
declension = mr.Declension()
speller = mr.OrdinalSpeller(declension)
d = mr.DateSpeller(speller)
assert d.spellDate(2001, 05, 01) == "первое мая две тысячи первого года"
Функция умеет заодно склонять пропись даты по падежам:
assert d.spellDate(2015, 11, 01, mr.Case.Nominative) \
== "первое ноября две тысячи пятнадцатого года"
assert d.spellDate(2015, 11, 01, mr.Case.Genitive) \
== "первого ноября две тысячи пятнадцатого года"
assert d.spellDate(2015, 11, 01, mr.Case.Dative) \
== "первому ноября две тысячи пятнадцатого года"
assert d.spellDate(2015, 11, 01, mr.Case.Accusative) \
== "первое ноября две тысячи пятнадцатого года"
assert d.spellDate(2015, 11, 01, mr.Case.Instrumental) \
== "первым ноября две тысячи пятнадцатого года"
assert d.spellDate(2015, 11, 01, mr.Case.Prepositional) \
== "первом ноября две тысячи пятнадцатого года"
Последний параметр говорит, нужно ли ставить слово «одна»
перед «тысяча»:
assert d.spellDate(1976, 04, 02, mr.Case.Nominative, False) \
== "второе апреля тысяча девятьсот семьдесят шестого года"
assert d.spellDate(1976, 04, 02, mr.Case.Nominative, True) \
== "второе апреля одна тысяча девятьсот семьдесят шестого года"
Этот параметр необязательный и по умолчанию равен False.
Пользовательский словарь
Пользовательский словарь – это XML-файл, который
позволяет изменить склонение отдельных словосочетаний
нужным вам образом.
Инструкция по составлению пользовательского словаря
Подключить пользовательский словарь можно следующим образом:
declension = mr.Declension("dict.xml")
Технические характеристики модуля
- Модуль написан на языке C++ и имеет байндинги для Питона.
- Модуль полностью автономен и не требует доступа к сети.
- Все методы модуля потокобезопасны (thread-safe).
- Поддерживается Python 3.6 - 3.12. По запросу возможна сборка под другие версии.
- ОС: Linux (x86_64), Windows (x86, x86_64), MacOS (x86_64, arm64, universal).
Комплект поставки
Модуль поставляется в виде pip-пакета.
На каждую минорную версию Питона (3.6, 3.7, 3.8...),
процессор (i386, x86_64, arm64)
и ОС (Linux, Windows, MacOS)
имеется соответствующая версия пакета.
Для Питона 3.10 и новее в пакет включены подсказки типов:
файлы .pyi для классов Declension,
Parse, License и других и маркер py.typed.
Благодаря им редакторы кода (автодополнение) и проверки типов, например mypy, видят типы модуля.
В пакетах для Питона 3.6 – 3.9 подсказок типов нет.
Установка
Распакуйте архив с нужной версией модуля и
выполните следующую команду в директории с файлом
setup.py:
pip install --user .
Проверить, что модуль установлен, можно командой:
pip list
Лицензионный ключ
Для работы модуля необходим
лицензионный ключ — строка вида MRK1.…,
в которой записаны лицензиат, дата начала и дата окончания лицензии.
Ключ передается функции morpher.set_license_key один раз,
до создания первого объекта Declension:
import morpher
from morpher import russian as mr
morpher.set_license_key("MRK1.…")
declension = mr.Declension()
print(declension.parse("Сергиев Посад").genitive)
Функция проверяет ключ сразу: если ключ неправильный, срок лицензии истёк
или ключ выдан для другого продукта, она вызывает исключение ValueError.
Объекты Declension, созданные до вызова set_license_key,
используют прежний ключ, поэтому вызывайте ее в начале программы.
Во всех остальных примерах на этой странице предполагается, что ключ уже установлен.
Каждый покупатель получает свой собственный уникальный ключ.
Ключ действует до даты окончания лицензии и подходит ко всем версиям модуля, выпущенным до этой даты
(версия 1.4.0 и новее; для более старых версий нужны ключи прежнего формата).
При продлении лицензии вы получаете новый ключ: достаточно заменить строку ключа,
обновлять модуль не нужно.
Не храните ключ в репозитории с кодом; удобно, например,
брать его из переменной окружения или файла настроек.
Функция set_license_key возвращает объект
morpher.License со сведениями о лицензии:
import datetime
import morpher
license = morpher.set_license_key("MRK1.…")
print(license.licensee) # ООО «Тюльпан»
print(license.plan) # Стартап (None, если тариф не указан)
print(license.effective_date) # 2026-02-01
print(license.expiry_date) # 2027-02-01
days_left = (license.expiry_date - datetime.date.today()).days
if days_left < 30:
print("Лицензия скоро закончится")
| Свойство | Описание |
product | официальное название продукта, для которого выдана лицензия; |
licensee | лицензиат; |
plan | тарифный план или None, если он не указан; |
effective_date | дата начала лицензии (datetime.date); |
expiry_date |
дата окончания лицензии (datetime.date): начиная с этого дня ключ не принимается,
то есть последний день лицензии — предыдущий. Для неограниченной лицензии
None. |
Функция str(license) возвращает описание лицензии одной строкой;
остаток срока считается от сегодняшней даты:
print(license)
# Программа склонения по падежам «Морфер» для Python.
# Лицензия с 01.02.2026 по 31.01.2027 (осталось 98 дней).
# Лицензиат: ООО «Тюльпан». План: Стартап.
Если срок лицензии истёк, str(license) сообщает, сколько дней назад это произошло.
Известные проблемы
Следующий код приводит к аварийному завершению процесса:
from morpher import russian as mr
mr.Declension().parse("Иван").genitive
Обойти проблему можно, сохранив mr.Declension() в переменной:
from morpher import russian as mr
declension = mr.Declension()
declension.parse("Иван").genitive
GitHub issue
История изменений
| Версия |
Дата |
Описание |
| 1.4.0 |
01.11.2026 |
- Улучшено склонение:
- Перечисления: «Сырьё и материалы» → «Сырья и материалов», «Спорт и развлечения» →
«Спорта и развлечений», «Одежда, обувь, аксессуары» → «Одежды, обуви, аксессуаров»
(раньше последнее слово оставалось в именительном падеже).
- Названия товаров: прилагательные в конце теперь склоняются: «Йогурт Северная Долина
вишнёвый» → «Йогурта Северная Долина вишнёвого», «Мороженое Зимний Вальс сливочное»
→ «Мороженого Зимний Вальс сливочного».
- Географические названия:
- У названий с дефисом теперь склоняется только последняя часть:
«Ричмонд-парк» → «в Ричмонд-парке», «Блэкпул-Тауэр» → «в Блэкпул-Тауэре»
(раньше
«в Ричмонде-парке», «в Блэкпуле-Тауэре»).
Названия с английскими предлогами и слова «Кросс», «Бридж» не склоняются:
«Стратфорд-апон-Эйвон», «Кингс-Кросс». «Марий Эл» не склоняется (раньше
«Мария Эл»).
- Выбор предлога: «на Южном Урале» (регион), но «в Новом Урале» (город); «на
Исаакиевском озере», но «в Исаакиевском Озере» (одноименный поселок); «на
Бейкер-стрит», «на Юнион-сквер», «на Эбби Роуд», но «в Красной Поляне»
(раньше
«на»). Предлог «на» для островов, атоллов и архипелагов: «на
Мадейре», «на Кэт Айленде», «на атолле Джонстон», «на Южной Суматре».
- Отработан список из 620 географических названий, присланный пользователем
temi4
(
uservoice/issues/27):
613 из 620 названий склоняются правильно, например «в Тоттори», «в
Араукании», «в Касабланка-Сете», «в Мадхья-Прадеше». Составные иностранные
названия: первая часть больше не склоняется там, где не должна («в
Альта-Верапасе», «в Гранд-Ансе», «в Аш-Шати»); название с несклоняемой
последней частью не склоняется целиком («в Пхёнан-Намдо»). Хорватские
жупании склоняются правильно: «в Загребской жупании». Названия мест больше
не склоняются как одушевлённые: винительный «Сен-Джон», «Эш-Шамаль».
- Местный падеж на «-у» в названиях с «Бор» и «Порт»: «в Сосновом Бору», «в
Мясном Бору», «в Железном Порту» (спасибо пользователю
hisbvdis, приславшему
комментарий).
- Составные и иностранные фамилии: «Семёнова-Тян-Шанского» (раньше
«Тяна-Шанского»), «Хосе Ортеги-и-Гассета» (раньше
«Ортега-и-Гассета»), «Сергеем Брином» (раньше «Бриным»), «Леди
Гаги» (раньше «Леди Гага»).
- Фамилии, совпадающие с названиями городов (Пушкин, Горький, Жуковский, Мышкин,
Жуков, Ломоносов, Брежнев, Королёв, Серов, Самойлов, Быков): одиночное слово теперь
склоняется как фамилия — «Пушкина» в винительном падеже, «Пушкиным» в
творительном (раньше
«Пушкин» и «Пушкином»). Киров и Куйбышев
по-прежнему склоняются как города. Если нужен город или нарицательное слово, укажите
атрибут «нарицательное»; если нужна фамилия — атрибут «собственное». В
контексте («город Пушкин», «улица Горького», «Пушкин Александр») склонение
правильное, как и раньше.
- Китайские имена: фамилия не меняется, мужское имя склоняется: «Дэн Сяопин» → «Дэн
Сяопина» (раньше
«Дэна Сяопина»), «Цзян Цзэминь» → «Цзян Цзэминя» (раньше
«Цзяна Цзэминя»), «Чжоу Эньлай» → «Чжоу Эньлая» (раньше «Чжоуа
Эньлая»), «председатель Си Цзиньпин» → «председателя Си Цзиньпина».
«Обрусевшие» фамилии склоняются как обычно: «Виктор Ван» → «Виктора Вана», «Татьяна
Ким» → «Татьяны Ким». Вьетнамские и корейские имена из трёх частей: склоняется
только последняя («Ким Чен Ира», «Фам Ван Донга»).
- Фамилия Романец склоняется как «Романцом» (раньше
«Романцем») (спасибо
пользователю Yuri Byshko, приславшему
комментарий). Мужское имя Алмаз теперь
склоняется («Хасанова Алмаза Ильдаровича»), женское — нет.
- Сокращения и должности: «Гл. инженер» → «Гл. инженера», «Ст. кладовщик» → «Ст.
кладовщика», «Ген. директор» → «Ген. директора» (раньше
«Гена.
директор»); составные должности типа «Митрополита Калужского и Боровского»;
«Совет Министров» → «Совета Министров» (раньше «Министрова»).
- Слово «Модель», употреблённое отдельно, склоняется как обычное существительное
(«Модели»), а не как фамилия.
- Во фразе «Директор ООО "Стратегия Фарма" - Управляющей компании ООО "Фармкопилка"»
программа больше не пытается склонять слово «Управляющей» (раньше получалось
«Управляющея», «Управляющею»).
- Мягкие переносы (U+00AD) во входной строке сохраняются в результате и не мешают
склонению (раньше перенос терялся).
- Найдены и исправлены ошибки:
transformGender терял «о»/«е» в притяжательных прилагательных на -ов,
-ев, -ёв, -ин, -ын: «отцов» → «отцва», «отцво»,
«отцвы»; «мамин» → «мамна». Теперь «отцова», «отцово»,
«отцовы», «мамина».
- Объем работы по разбору одной фразы ограничен: если фраза слишком сложная (порядка 50 слов и
более), метод
parse возвращает None. Это оставляет злоумышленникам
меньше шансов «подвесить» вызывающий процесс.
- Добавлены подсказки типов (файлы
.pyi и
py.typed)
для Питона 3.10 и новее.
- Словарь модуля пополнен более чем на 1000 слов (в основном фамилии и географические
названия).
- Изменен формат лицензионного ключа: теперь это строка вида
MRK1.…, в которой
записаны лицензиат, дата начала и дата окончания лицензии. При переходе на эту версию вам
понадобится новый ключ. Ключ подходит ко всем версиям модуля, выпущенным до окончания его
срока. Чтобы продлить лицензию, теперь достаточно заменить ключ, замена модуля не нужна.
- Добавлена функция
morpher.set_license_key(), которой передается
лицензионный ключ (один вызов для русского и украинского модулей).
Ключ проверяется сразу: неправильный, просроченный или выданный для другого
продукта ключ вызывает ValueError.
- Функция возвращает объект
morpher.License со сведениями о лицензии:
product, licensee, plan,
effective_date, expiry_date;
str(license) возвращает описание одной строкой.
- Украинский язык больше не ограничен датой, записанной в модуль при сборке:
при продлении лицензии достаточно заменить ключ.
|
| 1.3.5 |
12.04.2026 |
-
Учет казахских букв при склонении на русском языке:
в Казахстане типична ситуация, когда ФИО на казахском
вставляется в документ на русском,
и склонение ожидается по правилам русского языка.
Например, Әбіш Кекілбаев должен превратиться в Әбіша Кекілбаева.
Эта версия модуля умеет обрабатывать казахские буквы.
-
Исправлено склонение
фамилии Якушенок,
топонима Айн-Темушент,
фамилии Дыкань.
- Исправлено склонение фамилии Кузьмина
-
Исправлено склонение фамилий Семёнова, Фёдорова
(было сломано в версии 1.3.3).
|
| 1.3.4 |
23.08.2025 |
Исправлено склонение «принт-менеджер».
|
| 1.3.3 |
16.06.2025 |
|
| 1.3.2 |
25.04.2025 |
-
Исправлено склонение:
-
имени Хайсам бен Тарек Аль Саид и подобных;
-
армянского женского имени Аревик;
-
топонима Марьина Роща;
-
словосочетания торговельна марка на украинском языке.
-
Несклонение аббревиатур ГУЗ, ТФОМС, УМВД и др.
-
Добавлено порядка 3000 слов из Викисловаря.
-
Добавлено более 3700 слов из словаря odict.ru.
-
Добавлена поддержка Python 3.12.
|
| 1.3.1 |
13.04.2024 |
-
Исправлено склонение фамилии Андрусейко.
-
Исправлено склонение фраз с несколькими закавыченными словами
на примере:
Исполнительный Вице-Президент –
управляющий по Южному региону –
управляющий Филиалом Банка "Южный" –
управляющий Филиалом Банка «Северо-Кавказский»
-
Пополнение словарей.
|
| 1.3.0 |
30.10.2023 |
-
Добавлена поддержка MacOS.
|
| 1.2.2 |
10.08.2023 |
- Добавлена поддержка Python 3.10 и 3.11 (Linux и Windows).
- В методе spell параметр case (падеж) сделан необязательным
и по умолчанию равен именительному падежу.
|
| 1.1.0 |
18.07.2023 |
- Добавлена поддержка Python 3.11 (Linux).
- Исправлено склонение:
- фамилии Курячий
- фамилии Бова
- слова "актуатор"
- фраз с наречиями ("технически перевооружаемый")
- фраз ПРЕДСЕДАТЕЛЬ СОВЕТА ДЕПУТАТОВ, МИНИСТР ФИНАНСОВ ПЕРМСКОГО КРАЯ, СПЕЦИАЛИСТ ТЕХНИЧЕСКОЙ ПОДДЕРЖКИ
- фраз с сокращением "ул.": ул. Ленина, ул. Пушкина и т.п.
- ФИО "Пашкевич С." с указанием женского рода (Flags="Feminine")
-
фраз «Главный конструктор турбомашин»,
«ИСПОЛНЯЮЩИЙ ОБЯЗАННОСТИ ДИРЕКТОРА» (большими буквами)
-
названий с числительными типа
«1-я Фрунзенская улица»
-
топонима Красный Боец
-
имен вида Аслан-бек, Джалил-бек
- В сочетании «во многом» предлог во, а не в (например, при склонении слова «многое»).
- Несклонение предлогов НА и ДЛЯ (раньше они иногда склонялись - для как тля).
-
Добавлено 439 новых слов из словаря odict.ru и более 60 тысяч из Викисловаря.
-
В украинском модуле:
-
Отменено чередование і-о (і-е) в фамилиях на -ів:
Федорів, Бердичів и т.п.
-
В словарь добавлены фамилии Євтушок, Калина и др.
- Исправлено склонение названия Дніпро.
|
| 1.0.0 |
06.04.2021 |
Первая опубликованная версия |