Перейти к содержанию

Словоизменение

Каждый разбор знает свою лексему - все формы слова с той же леммой. По разбору можно получить список форм, нужную форму по признакам UD или форму, согласованную с количеством. Лексема определяется леммой, поэтому следует соглашениям UD о леммах: у «Ивановой» лексема - женские формы фамилии «Иванова», у «важнейшего» - формы превосходной степени.

Словоформы - в написании словаря: в нижнем регистре и с буквой «ё», если она есть в словаре; о формах угаданных слов - в разделе Незнакомые слова.

Методы

Формы лексемы

forms · list[Analysis]

forms()

Формы лексемы в порядке словаря - такие же разборы, как у analyze, с вероятностью 1. Варианты форм отличаются пометами: «кошкою» - V-oy, второй предложный падеж «в лесу» - loc2 (признак Case=Loc у него тот же, что у «о лесе»): «лес» с inflect(Case="Loc") дает «лесе», а «лесу» выбирается из forms() по помете loc2.

from rumorph import Analyzer

morph = Analyzer()
cat = morph.analyze("кошка")[0]
[form.word for form in cat.forms()]
form = cat.forms()[8]
form.word, form.feats
['кошка',
 'кошки',
 'кошке',
 'кошку',
 'кошкой',
 'кошкою',
 'кошке',
 'кошки',
 'кошек',
 'кошкам',
 'кошек',
 'кошками',
 'кошках']
('кошек', {'Animacy': 'Anim', 'Case': 'Gen', 'Gender': 'Fem', 'Number': 'Plur'})

Форма по признакам

inflect · str

inflect(**feats)

Форма лексемы с заданными признаками UD. Признаки, которые не названы, по возможности сохраняются: «кошка» в родительном падеже - «кошки», а не «кошек». Краткая форма, одушевленный винительный («нового») и инклюзив повелительного наклонения («сделаем») берутся, только если их просят: Variant="Short", Animacy="Anim", Person="1". Будущее время «быть» в SynTagRus - Tense=Pres с пометой futr: «будет» во множественном числе - «будут», а inflect(Tense="Fut") у «быть» бросает FormNotFoundError - будущее берется из forms() по помете futr.

Параметр Тип По умолчанию Описание
**feats str - Признаки UD и их значения: Case="Gen", Number="Plur"

Исключения:

  • FormNotFoundError - у лексемы нет формы с такими признаками;
  • ValueError - признака или значения нет в словаре (опечатка вроде Case="Genitive"), сообщение перечисляет допустимые;
  • TypeError - значение признака, которое не строка.
cat.inflect(Case="Gen"), cat.inflect(Case="Gen", Number="Plur")
verb = morph.analyze("читал")[0]
verb.inflect(Gender="Fem"), verb.inflect(VerbForm="Inf")
verb.inflect(Tense="Pres", Person="3", Number="Plur")
morph.analyze("новый")[0].inflect(Degree="Cmp")
('кошки', 'кошек')
('читала', 'читать')
'читают'
'новее'

Согласование с количеством

agree · str

agree(number)

Форма существительного, прилагательного, местоименного прилагательного или причастия, согласованная с количеством. Падеж разбора сохраняется: «рублях» с числом 2 - «рублях» («о 2 рублях»), винительный падеж одушевленных - «вижу двух котов». Прилагательные и существительные, которые склоняются как прилагательные, согласуются по роду: «две новые», «два новых», «два учёных», «две столовые». После числа берется счетная форма: «5 вольт», «5 лет», «5 человек». У слов без единственного числа берется множественное: «1 сутки», «2 суток». Женские фамилии на -ова, -ина согласуются как прилагательные: «две Ивановы», «пять Ивановых». Отрицательное количество согласуется как его модуль, дробное («1,5», Decimal("2.5"), Fraction(3, 2)) - родительный падеж единственного числа в любом падеже: «1,5 рубля», «о 2,5 рубля».

Параметр Тип По умолчанию Описание
number int / float / Decimal / Fraction - Количество; целое - любое число с __index__, а также Decimal и Fraction без дробной части

Исключения:

  • FormNotFoundError - слово не согласуется с количеством (глагол, наречие) или у лексемы нет нужной формы («5 молока»);
  • TypeError - количество, которое не число;
  • ValueError - бесконечность или NaN.
ruble = morph.analyze("рубль")[0]
[f"{n} {ruble.agree(n)}" for n in (1, 2, 5, 21)]
morph.analyze("сутки")[0].agree(2)
['1 рубль', '2 рубля', '5 рублей', '21 рубль']
'суток'