Купить
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.11. По запросу возможна сборка под другие версии.
- ОС: 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)
имеется соответствующая версия пакета.
Установка
Распакуйте архив с нужной версией модуля и
выполните следующую команду в директории с файлом
setup.py:
pip install --user .
Проверить, что модуль установлен, можно командой:
pip list
Известные проблемы
Следующий код приводит к аварийному завершению процесса:
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.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 |
Первая опубликованная версия |