Слово «зара»
Формы слова «заря» анализируются как производные от существительного «зара», которое есть в словаре и предлагается как первый вариант:
>>> import pymorphy2
>>> ma = pymorphy2.MorphAnalyzer()
>>> ma.parse('заре')
[Parse(word='заре', tag=OpencorporaTag('NOUN,anim,femn,Name sing,datv'),
normal_form='зара', score=0.25, methods_stack=((<DictionaryAnalyzer>, 'заре', 68, 2),)),
Parse(word='заре', tag=OpencorporaTag('NOUN,anim,femn,Name sing,loct'),
normal_form='зара', score=0.25, methods_stack=((<DictionaryAnalyzer>, 'заре', 68, 6),)) . . .]
А в чем ошибка? Правильный вариант же тоже предлагается:
In [6]: m.parse('заре')
Out[6]:
[Parse(word='заре', tag=OpencorporaTag('NOUN,anim,femn,Name sing,datv'), normal_form='зара', score=0.25, methods_stack=((<DictionaryAnalyzer>, 'заре', 68, 2),)),
Parse(word='заре', tag=OpencorporaTag('NOUN,anim,femn,Name sing,loct'), normal_form='зара', score=0.25, methods_stack=((<DictionaryAnalyzer>, 'заре', 68, 6),)),
Parse(word='заре', tag=OpencorporaTag('NOUN,inan,femn sing,datv'), normal_form='заря', score=0.25, methods_stack=((<DictionaryAnalyzer>, 'заре', 1486, 2),)),
Parse(word='заре', tag=OpencorporaTag('NOUN,inan,femn sing,loct'), normal_form='заря', score=0.25, methods_stack=((<DictionaryAnalyzer>, 'заре', 1486, 6),))]
Зара - женское имя. Так вышло, что ни оно, ни слово "заря" в части Opencorpora со снятой неоднозначностью не встречается, поэтому pymorphy2 выдает их в более-менее случайном порядке.
Ну плохо, конечно, что первый вариант - неправильный, но такие ситуации всегда будут; без знания контекста невозможно сказать, какая форма слова правильная, а pymorphy2 работает с отдельными словами.
Можно улучшать оценки вероятности и для отдельных слов - например, понижать их для имен, если слово начинается с маленькой буквы, и т.д. Сейчас там один метод работает (вероятность P(tag|word) оценивается по OpenCorpora, для отдельных слов), можно еще что-то придумать.
Спасибо за ответ! Я использую оберточный метод для извлечения базовой формы — у меня в текстах бывают слова типа «й», в ответ на которые анализатор выдает пустой список, приходится на это проверять и возвращать список с исходной формой, чтобы не получить ошибку, — можно просто добавить туда проверку на граммему имени собственного.