pymorphy2 icon indicating copy to clipboard operation
pymorphy2 copied to clipboard

Числа и проблемы с склонением в разборах всех украинских слов

Open pchr8 opened this issue 1 year ago • 2 comments

Здравствуйте!

Пользуюсь 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, или что оно как минимум полезный симптом? (Или есть что-то неочевидное, что я пропустил или недопонял?)

Сергей

pchr8 avatar Dec 16 '23 23:12 pchr8

Да, странно. С русским языком работает, и там в разборе есть sing. Я думаю проблема со словарем, либо с кодом согласования с числом. Попробую посмотреть, но быстрый фикс не обещаю.

insolor avatar Dec 18 '23 05:12 insolor

Теоретически может заработать, если убрать 'sing' из _NUMERAL_AGREEMENT_GRAMMEMES: https://github.com/pymorphy2/pymorphy2/blob/master/pymorphy2/tagset.py#L244

Позже потестирую

insolor avatar Dec 18 '23 06:12 insolor