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) == 'Крутько Катерино Володимировно'
            
        

Разделение на фамилию, имя и отчество

            
                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.spell(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) \
                    == "второе апреля одна тысяча девятьсот семьдесят шестого года"
            
        

Пользовательский словарь

Пользовательский словарь – это XML-файл, который позволяет изменить склонение отдельных словосочетаний нужным вам образом. Инструкция по составлению пользовательского словаря

Подключить пользовательский словарь можно следующим образом:

            
                declension = mr.Declension(mr.loadUserDictionary("dict.xml"))
            
        

Технические характеристики модуля

  • Модуль написан на языке C++ и имеет байндинги для Питона.
  • Модуль полностью автономен и не требует доступа к сети.
  • Все методы модуля потокобезопасны (thread-safe).
  • Поддерживается Python 3.6, 3.7, 3.8, 3.9. По запросу возможна сборка под другие версии.
  • ОС: Linux, Windows.

Комплект поставки

Модуль поставляется в виде pip-пакета. На каждую минорную версию Питона (3.6, 3.7, 3.8...) и ОС (Linux, Windows) имеется соответствующая версия пакета.

Наличие инструментов сборки (gcc) не требуется.

Установка

Распакуйте архив с нужной версией модуля и выполните следующую команду в директории с файлом 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

История изменений

Версия Дата Описание
0.0.1 06.04.2021 Первая опубликованная версия


 

Библиотеки

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