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

Разбор словоформы

Разбор - объект Analysis, который возвращают методы анализатора analyze и analyze_many: лемма, часть речи и признаки Universal Dependencies, вероятность и источник разбора. Разборы неизменяемы; их можно сравнивать (вероятность в сравнении не участвует: разбор равен своей форме из forms()), класть в множества и сохранять через pickle. Формы слова по разбору дают методы forms, inflect и agree - см. Словоизменение.

from rumorph import Analyzer

morph = Analyzer()
analysis = morph.analyze("стали")[0]
analysis.lemma, analysis.pos, analysis.feats, analysis.labels
('стать',
 'VERB',
 {'Aspect': 'Perf',
  'Mood': 'Ind',
  'Number': 'Plur',
  'Tense': 'Past',
  'VerbForm': 'Fin',
  'Voice': 'Mid'},
 frozenset({'intr'}))

Атрибуты

Атрибут Тип Описание
word str Словоформа в написании словаря: с буквой «ё», если она есть в словаре; у разборов по правилам и угаданных - как в тексте, но у угаданных с «ё» из окончания словарной формы («пингвиненка» - «пингвинёнка»)
lemma str Начальная форма
pos str Часть речи UD: NOUN, VERB, ADJ, DET, ADP и т. д.
feats dict[str, str] Признаки UD: {"Case": "Gen", "Number": "Sing"}; каждый раз новый словарь, его изменение не меняет разбор
labels frozenset[str] Пометы словаря, у которых нет признака UD: Infr (разговорное) и др.
prob float Вероятность разбора; сумма по всем разборам словоформы равна 1
source str Откуда взят разбор: "dictionary" - словоформа есть в словаре, "rule" - разбор по правилу, "guess" - угаданный разбор незнакомого слова

Части речи и признаки

Части речи и признаки следуют Universal Dependencies в соглашениях крупнейшего русского трибанка UD_Russian-SynTagRus, поэтому результат можно сравнивать с разметкой spaCy, Stanza и других инструментов на UD. Отличия от частей речи OpenCorpora:

  • «который», «этот», «свой», «весь», «такой» и другие местоименные прилагательные - DET;
  • «быть» и «бы» - AUX;
  • вводные слова «однако», «например», «конечно» - ADV;
  • «можно», «надо», «нельзя» - VERB без признаков;
  • предлоги - ADP, сочинительные союзы - CCONJ, подчинительные - SCONJ, частицы - PART.

Признаки: падеж, число, род, одушевленность, лицо, время, вид, наклонение, залог, форма глагола, степень, краткая форма (Variant=Short), тип имени собственного (NameType), сокращение (Abbr), притяжательность (Poss), тип числительного (NumType) и его запись (NumForm), тип местоимения и местоименного наречия (PronType: «там» - Dem, «где» - Rel, «никогда» - Neg), возвратность (Reflex), несклоняемость (InflClass=Ind), отрицание (Polarity=Neg).

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

Пометы labels - граммемы OpenCorpora, для которых в UD нет признака: стиль (Infr, Slng, Arch), качественное прилагательное (Qual), вводное слово (Prnt), переходность (tran, intr), включенность говорящего в повелительном наклонении (incl - «пойдемте», excl - «иди»), второй предложный падеж (loc2 - «в лесу»), будущее время «быть» (futr - «будет»: в SynTagRus у него Tense=Pres) и другие.

Токены вне словаря

Числа, знаки, латиницу и сокращения анализатор разбирает по правилам, source у таких разборов - "rule":

Токен Разбор
знаки препинания; символы %, $, №, −, эмодзи PUNCT; SYM
числа цифрами и диапазоны: «15», «3,14», «10 000», «17:04», «1990-2000» NUM с NumForm=Digit, NumType=Card; целое число может быть и порядковым ADJ с NumType=Ord - у чисел 1000-2100 (годы), кроме круглых сотен, это первый разбор, а 1900 и 2000 - тоже годы
числа и диапазоны с окончанием: «2005-го», «10-15-го», «5-ти» порядковое ADJ с падежом и формами, как у «1-го», или количественное NUM
римские числа и диапазоны: «XX», «XIX-го», «II-III» порядковое ADJ с NumForm=Roman
слова латиницей: «iPhone» X с Foreign=Yes
инициалы: «А.», «А» PROPN с Abbr=Yes: имя, отчество или фамилия
сокращения с точкой: «т.», «им.» разборы словарного сокращения без точки
аббревиатуры капсом: «НКО» PROPN или NOUN с Abbr=Yes; длинное слово капсом («ЧАТБОТАМИ») еще и угадывается как обычное
наречия «по-бурятски», «по-молодому» ADV с Degree=Pos
прочие токены: «км/ч», «РосПил» X без признаков, лемма - токен в нижнем регистре

Доли неоднозначных разборов взяты из частот в SynTagRus. Буквы «й» и «ё» в разложенной записи Unicode и неразрывный дефис приводятся к обычным.

[(a.lemma, a.pos, a.feats["NumType"], round(a.prob, 2)) for a in morph.analyze("2026")]
[(a.lemma, a.pos, a.feats["Case"]) for a in morph.analyze("2005-го")][:1]
[('2026', 'ADJ', 'Ord', 0.94), ('2026', 'NUM', 'Card', 0.06)]
[('2005-й', 'ADJ', 'Gen')]

Незнакомые слова

Разборы слова кириллицей, которого нет в словаре, анализатор угадывает по окончанию: берет формы словарных слов с тем же окончанием - их часть речи, признаки и словоизменение. source у таких разборов - "guess". Слово в нижнем регистре угадывается как нарицательное, слово с заглавной буквы - в основном как имя собственное: фамилия, имя, топоним, а слово на «-ский» - в основном как прилагательное. Аббревиатура с окончанием («МЭРТа») угадывается, как слово с заглавной.

Слово через дефис разбирается по последней части: «крэш-тестов» - «крэш-тест», «IT-компании» - «it-компания»; если последняя часть - частица («сколь-нибудь»), то по первой. Если изменяются обе части, лемма - из лемм частей: «дивана-кровати» - «диван-кровать», форм у такого разбора нет. Слово с известной приставкой - «эко», «анти», «супер», «микро» и другими - разбирается по словарному слову без нее: «экодомов» - «экодом». Такие разборы тоже угаданные.

У угаданного разбора есть формы, с ним работают forms, inflect и agree; формы сохраняют заглавные буквы: «Мак-Киннона» в дательном - «Мак-Киннону», «ПИН-КОДОВ» - «ПИН-КОДАМ». Слово с частицей изменяется по первой части: «смотри-ка» во множественном числе - «смотрите-ка».

[(a.lemma, a.pos, a.feats["Case"], round(a.prob, 2)) for a in morph.analyze("чатботу")][:2]
guess = morph.analyze("Мартова")[0]
guess.lemma, guess.pos, guess.feats["NameType"], guess.inflect(Case="Dat")
morph.analyze("крэш-тестов")[0].lemma, morph.analyze("экодомов")[0].lemma
[('чатбот', 'NOUN', 'Dat', 0.44), ('чатбота', 'NOUN', 'Acc', 0.4)]
('мартов', 'PROPN', 'Sur', 'Мартову')
('крэш-тест', 'экодом')