Числа и проблемы с склонением в разборах всех украинских слов
Здравствуйте!
Пользуюсь pymorphy2 недавно и возможно не понимаю сути, но мне кажется что я нашел баг.
Все украинские слова в единственном числе при парсинге не получают граммему sing (plur работает):
m = MorphAnalyzer(lang="uk")
m.parse("дерево")
[
Parse(
word='дерево',
tag=OpencorporaTag('NOUN,inan neut,nomn'),
normal_form='дерево',
score=1.0,
methods_stack=((DictionaryAnalyzer(), 'дерево', 22, 0),)
),
Parse(
word='дерево',
tag=OpencorporaTag('NOUN,inan neut,accs'),
normal_form='дерево',
score=1.0,
methods_stack=((DictionaryAnalyzer(), 'дерево', 22, 3),)
),
Parse(
word='дерево',
tag=OpencorporaTag('NOUN,inan neut,voct'),
normal_form='дерево',
score=1.0,
methods_stack=((DictionaryAnalyzer(), 'дерево', 22, 7),)
)
]
Почти уверен, что именно это создает ряд проблем при inflections где как-то замешано число. Внизу пустые строки означает, что результат None.
p == Parse(word='кіт', tag=OpencorporaTag('NOUN,anim masc,nomn'), normal_form='кіт', score=1.0, methods_stack=((DictionaryAnalyzer(), 'кіт', 2019, 0),))
(Pdb++) p.make_agree_with_number(2)
(Pdb++) p.tag.numeral_agreement_grammemes(2)
{'sing', 'gent'}
(Pdb++) p.inflect({'sing'})
(Pdb++) p.inflect({'gent'})
Parse(word='кота', tag=OpencorporaTag('NOUN,anim masc,gent'), normal_form='кіт', score=1.0, methods_stack=((DictionaryAnalyzer(), 'кота', 2019, 1),))
(с plur работает!)
p.inflect({'plur'})
Parse(word='коти', tag=OpencorporaTag('NOUN,anim plur,nomn'), normal_form='кіт', score=1.0, methods_stack=((DictionaryAnalyzer(), 'коти', 2019, 10),))
Для обхода последнего написал вот такой костыль, который делает цепочку из граммем и пытается использовать по очереди, но это костыль:
@staticmethod
def _inflect(parse: Parse, new_grammemes: set | frozenset)->Parse:
""" Sometimes inflecting with the entire batch fails, but one by one
works. This chains the grammemes for one inflection at a time. """
new_parse = parse
for g in new_grammemes:
if new_parse.inflect({g}):
new_parse = new_parse.inflect({g})
else:
continue
return new_parse
@staticmethod
def _make_agree_with_number(parse: Parse, n: int)->Parse:
grams = parse.tag.numeral_agreement_grammemes(n)
new_parse = Numbers._inflect(parse=parse, new_grammemes=grams)
return new_parse
Я правильно понял что дело в sing, или что оно как минимум полезный симптом? (Или есть что-то неочевидное, что я пропустил или недопонял?)
Сергей
Да, странно. С русским языком работает, и там в разборе есть sing. Я думаю проблема со словарем, либо с кодом согласования с числом. Попробую посмотреть, но быстрый фикс не обещаю.
Теоретически может заработать, если убрать 'sing' из _NUMERAL_AGREEMENT_GRAMMEMES: https://github.com/pymorphy2/pymorphy2/blob/master/pymorphy2/tagset.py#L244
Позже потестирую