morpher.ru +7 (925) 336 9960
nowhere@morpher.ru
 
 
Мой Морфер
Купить

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 Первая опубликованная версия


 

Библиотеки

© Сергей Слепов, 2003 - 2024.