pymorphy2 icon indicating copy to clipboard operation
pymorphy2 copied to clipboard

Склонятор для имен и фамилий

Open saippuakauppias opened this issue 12 years ago • 8 comments

Добрый вечер, Михаил. Планируется ли в pymorphy2 сделать поддержку склонятора имен и фамилий?

То, что творится в склонении фамилий сейчас:

In [12]: for w in [u'Путин', u'Медведев', u'Собянин', u'Веселов', u'Прохоров', u'Миронов', u'Зюганов']:
    word = morph.parse(w)[0]
    print word.inflect({'gent'}).word
   ....:     
Путиного
Медведев
Собянин
Веселового
Прохоров
Миронов
Зюганового

saippuakauppias avatar Feb 14 '13 15:02 saippuakauppias

2013/2/14 Denis Veselov [email protected]

print word.inflect({'gent'}).word

In [48]: for w in [u'Путин', u'Медведев', u'Собянин', u'Веселов', u'Прохоров', u'Миронов', u'Зюганов']:

bases = [b for b in morph.parse(w) if b.normal_form.lower() ==

w.lower() and b.tag.case == u'nomn'] print w #print str(bases).decode('unicode_escape') if not bases: continue word = bases[0] print '->', word.inflect({'gent'}).word ....: Путин -> Путина Медведев -> Медведева Собянин -> Собянина Веселов -> Веселова Прохоров -> Прохорва Миронов -> Миронова Зюганов (нет варианта)

Так лучше? :)

Конечно, не идеально, да. Но, если вы хотите сделать это хорошо, то это уже будет отдельная задача. Вообще, окончаний у фамилий не так много, так что советую лучше попробовать самому это сделать без pymorphy. Кстати, иногда есть два равноценных варианта, например, из родительного "Толстого" может получиться два разных именительных: Толстой или Толстый.

Best regards, Yuri V. Baburov, Skype: yuri.baburov, MSN: [email protected]

buriy avatar Feb 14 '13 18:02 buriy

Да, планируется. Я хочу наработки из pymorphy.contrib.lastnames_ru (см. https://bitbucket.org/kmike/pymorphy/src/b5a4e3d5f362c2b93e378d81474b158c891ff078/pymorphy/contrib/lastnames_ru.py?at=default ) портировать на pymorphy2 и как-то по-нормальному интегрировать с анализатором. Там большая работа проделана (не мной), но в основной склонятор pymorphy1 она так интегрирована и не была. По времени, првда, ничего не скажу, пока другие приоритеты.

Конкретно в примере с Путиным, Медведевым и т.д. - слова нужно в нижнем регистре передавать, в верхнем работает неправильно, многие примеры это починит:

>>> m.parse('зюганов')[0].inflect({'gent'}).word
зюганова

kmike avatar Feb 14 '13 18:02 kmike

С именами, кстати, должно работать все, т.к. все имена должны быть в словаре. Там с фамилиями проблемы - их все в словарь не засунешь.

kmike avatar Feb 14 '13 18:02 kmike

Большое спасибо за такой скоростной ответ! :) Пойду исправлять, проглядел я, что надо в нижнем регистре все слова.

saippuakauppias avatar Feb 15 '13 07:02 saippuakauppias

Теперь в нижнем регистре слова передавать необязательно, см. #11.

kmike avatar Mar 08 '13 21:03 kmike

простите что продолжаю тред, но как я могу "помочь" при парсинге, если я знаю, что слово в дательном падеже?

Casyfill avatar May 04 '14 15:05 Casyfill

Если под "парсингом" имеется в виду "нахождение всех форм слова", то особо помочь сейчас нельзя. Для известных слов все варианты зашиты в словаре; для неизвестных - генерируются по данным, которые тоже "зашиты" в словаре.

Если под "парсингом" имеется в виду склонение, то можно выбрать правильный исходный вариант разбора. Например, разберем слово "Медведеву":

In [1]: from pymorphy2 import MorphAnalyzer
In [2]: m = MorphAnalyzer()
In [3]: m.parse('Медведеву')
Out[3]: 
[Parse(word='медведеву', tag=OpencorporaTag('NOUN,anim,masc,Sgtm,Surn sing,datv'), normal_form='медведев', score=0.5, methods_stack=((<DictionaryAnalyzer>, 'медведеву', 35, 2),)),
 Parse(word='медведеву', tag=OpencorporaTag('NOUN,anim,femn,Sgtm,Surn sing,accs'), normal_form='медведев', score=0.5, methods_stack=((<DictionaryAnalyzer>, 'медведеву', 35, 9),))]

Чтоб слово просклонять, нужно понять, какой из вариантов разбора исходного слова правильный. Можно брать первый, но если мы знаем, что исходное слово - в дательном падеже, то можем разборы отсортировать так, чтоб разборы с дательным падежом были выше, и уже среди них выбрать первый:

sorted_parses = sorted(parses, key=lambda p: not 'datv' in p.tag)
datv_parse = sorted_parses[0]

Пример не очень удачный, т.к. первый разбор и так в дательном был :) Но смысл такой.

kmike avatar May 04 '14 16:05 kmike

Отсеять те варианты, которые не в дательном падеже? :)

2014-05-04 22:38 GMT+07:00 Casyfill [email protected]:

простите что продолжаю тред, но как я могу "помочь" при парсинге, если я знаю, что слово в дательном падеже?

— Reply to this email directly or view it on GitHubhttps://github.com/kmike/pymorphy2/issues/10#issuecomment-42135836 .

Best regards, Yuri V. Baburov, Skype: yuri.baburov

buriy avatar May 04 '14 18:05 buriy