Переход с pymorphy¶
У pymorphy2 и pymorphy3 один API: pymorphy3 - продолжение pymorphy2, который не работает на Python 3.11 и новее. ruMorph работает с тем же словарем OpenCorpora, но API у него свое: части речи и признаки Universal Dependencies вместо граммем OpenCorpora, вероятность вместо score, словоформы строкой, исключения вместо None.
pip install rumorph
Словарь входит в пакет, отдельный пакет словаря не нужен.
>>> import pymorphy3
>>> morph = pymorphy3.MorphAnalyzer()
>>> p = morph.parse("стали")[0]
>>> p.normal_form, p.tag.POS, p.tag.number, round(p.score, 3)
('стать', 'VERB', 'plur', 0.975)
>>> cat = morph.parse("кошка")[0]
>>> cat.inflect({"gent", "plur"}).word
'кошек'
>>> morph.parse("рубль")[0].make_agree_with_number(5).word
'рублей'
>>> import rumorph
>>> morph = rumorph.Analyzer()
>>> a = morph.analyze("стали")[0]
>>> a.lemma, a.pos, a.feats["Number"], round(a.prob, 3)
('стать', 'VERB', 'Plur', 0.975)
>>> cat = morph.analyze("кошка")[0]
>>> cat.inflect(Case="Gen", Number="Plur")
'кошек'
>>> morph.analyze("рубль")[0].agree(5)
'рублей'
Соответствие вызовов¶
Здесь morph - анализатор, p - разбор pymorphy, a - разбор ruMorph.
| pymorphy2, pymorphy3 | ruMorph | Отличия |
|---|---|---|
MorphAnalyzer() |
Analyzer() |
|
MorphAnalyzer(path) |
Analyzer(path) |
путь к файлу словаря ruMorph; словари pymorphy не подходят |
morph.parse(word) |
morph.analyze(word) |
разборы, которые в UD совпадают, объединены |
[morph.parse(w) for w in words] |
morph.analyze_many(words) |
разбор без GIL |
[morph.parse(w)[0].normal_form for w in words] |
morph.lemmatize(words) |
разбор без GIL |
morph.normal_forms(word) |
list(dict.fromkeys(a.lemma for a in morph.analyze(word))) |
|
morph.tag(word) |
[(a.pos, a.feats) for a in morph.analyze(word)] |
|
morph.word_is_known(word) |
morph.is_known(word) |
|
p.word |
a.word |
у разборов по правилам и угаданных - в регистре текста |
p.normal_form |
a.lemma |
леммы по соглашениям UD |
p.tag.POS |
a.pos |
части речи UD, см. ниже |
p.tag.case, p.tag.number и др. |
a.feats.get("Case"), a.feats.get("Number") и др. |
признаки UD, см. ниже |
"Infr" in p.tag |
"Infr" in a.labels |
в labels - граммемы, у которых нет признака UD |
p.score |
a.prob |
|
p.methods_stack |
a.source |
"dictionary", "rule" или "guess" |
p.lexeme |
a.forms() |
|
p.inflect({"gent", "plur"}).word |
a.inflect(Case="Gen", Number="Plur") |
строка; нет формы - FormNotFoundError вместо None |
p.make_agree_with_number(n).word |
a.agree(n) |
строка; нет формы - FormNotFoundError вместо None |
Аналогов нет у русских названий граммем (cyr_repr, lat2cyr), разбора начальной формы (p.normalized), перебора словаря и настройки предсказателя незнакомых слов.
Части речи¶
| OpenCorpora | UD |
|---|---|
NOUN |
NOUN; имена, фамилии, отчества, топонимы, организации и торговые марки - PROPN |
ADJF |
ADJ; местоименные прилагательные - DET |
ADJS |
ADJ с Variant=Short |
COMP |
ADJ с Degree=Cmp |
VERB |
VERB с VerbForm=Fin; «быть» - AUX |
INFN |
VERB с VerbForm=Inf |
PRTF |
VERB с VerbForm=Part |
PRTS |
VERB с VerbForm=Part и Variant=Short |
GRND |
VERB с VerbForm=Conv |
NUMR |
NUM с NumType=Card |
ADVB |
ADV |
NPRO |
PRON |
PRED |
VERB без признаков |
PREP |
ADP |
CONJ |
CCONJ; подчинительные союзы - SCONJ |
PRCL |
PART |
INTJ |
INTJ |
Отдельные слова получают часть речи по соглашениям SynTagRus: вводные «однако», «например» - ADV, «бы» - AUX и т. д. (см. Части речи и признаки). Токены вне словаря: NUMB - NUM с NumForm=Digit, ROMN - ADJ с NumForm=Roman, LATN - X с Foreign=Yes, PNCT - PUNCT или SYM, UNKN - X без признаков (см. Токены вне словаря).
Граммемы¶
| OpenCorpora | UD |
|---|---|
nomn, gent, datv, accs, ablt, loct, voct |
Case: Nom, Gen, Dat, Acc, Ins, Loc, Voc |
gen1, acc2, loc1 |
Case: Gen, Acc, Loc |
gen2 («стакан чаю») |
Case=Par |
loc2 («в лесу») |
Case=Loc с пометой loc2 |
sing, plur |
Number: Sing, Plur |
masc, femn, neut |
Gender: Masc, Fem, Neut |
ms-f («сирота») |
Gender=Masc |
anim, inan |
Animacy: Anim, Inan |
1per, 2per, 3per |
Person: 1, 2, 3 |
pres, past, futr |
Tense: Pres, Past, Fut; будущее «быть» - Tense=Pres с пометой futr |
perf, impf |
Aspect: Perf, Imp |
indc, impr |
Mood: Ind, Imp |
actv, pssv |
Voice: Act, Pass; у возвратных глаголов - Mid |
Name, Surn, Patr, Geox, Orgn, Trad |
NameType: Giv, Sur, Pat, Geo, Com, Pro; у прилагательных - пометы labels |
Supr |
Degree=Sup |
Abbr |
Abbr=Yes; у склоняемых аббревиатур («вуз») - помета labels |
Abbr и Anum вместе («1-го», «90-х») |
NumType=Ord, NumForm=Combi, без Abbr |
Poss |
Poss=Yes; у прилагательных - помета labels |
Fixd |
у существительных, кроме аббревиатур, - InflClass=Ind, у остальных слов - помета labels |
Apro |
часть речи DET |
Dmns, Ques («там», «где») |
PronType: Dem, Rel, Int |
Anum у слов («первый»), GNdr |
нет |
остальные: Infr, Slng, Arch, Qual, tran, intr, V-oy и др. |
пометы labels |
Признак Voice есть у всех форм глагола, а Degree - у всех наречий и у прилагательных, кроме порядковых, записанных арабскими или римскими цифрами («1-го», «2026», «XX»), хотя в OpenCorpora граммемы залога есть только у причастий, а степени - только у превосходной и сравнительной.
Отличия в поведении¶
- Леммы следуют SynTagRus: «Ивановой» - «иванова», а не «иванов», «важнейшей» - «важнейший», а не «важный», «денег» - «деньги», а не «деньга».
- Разборы, которые в UD совпадают (союз и наречие «так»), объединены в один, их вероятности сложены, поэтому разборов бывает меньше, чем у pymorphy.
- Формы
inflectиagreeвозвращают строку, а не разбор; если формы нет, бросаютFormNotFoundError, подклассLookupError. - Токены вне словаря разбираются по правилам с частями речи и признаками UD: «2005-го» - порядковое прилагательное в родительном падеже с формами («2005-му»), а не несклоняемое существительное, как у pymorphy3.
- Скорость. Разбор и лемматизация в 6-8 раз быстрее, чем у
pymorphy3[fast], и в 30-60 раз - чем у pymorphy3 без него, а списки слов разбираются без GIL, см. Скорость и память.