pymorphy2
pymorphy2 copied to clipboard
Склонятор для имен и фамилий
Добрый вечер, Михаил. Планируется ли в pymorphy2 сделать поддержку склонятора имен и фамилий?
То, что творится в склонении фамилий сейчас:
In [12]: for w in [u'Путин', u'Медведев', u'Собянин', u'Веселов', u'Прохоров', u'Миронов', u'Зюганов']:
word = morph.parse(w)[0]
print word.inflect({'gent'}).word
....:
Путиного
Медведев
Собянин
Веселового
Прохоров
Миронов
Зюганового
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]
Да, планируется. Я хочу наработки из 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
зюганова
С именами, кстати, должно работать все, т.к. все имена должны быть в словаре. Там с фамилиями проблемы - их все в словарь не засунешь.
Большое спасибо за такой скоростной ответ! :) Пойду исправлять, проглядел я, что надо в нижнем регистре все слова.
Теперь в нижнем регистре слова передавать необязательно, см. #11.
простите что продолжаю тред, но как я могу "помочь" при парсинге, если я знаю, что слово в дательном падеже?
Если под "парсингом" имеется в виду "нахождение всех форм слова", то особо помочь сейчас нельзя. Для известных слов все варианты зашиты в словаре; для неизвестных - генерируются по данным, которые тоже "зашиты" в словаре.
Если под "парсингом" имеется в виду склонение, то можно выбрать правильный исходный вариант разбора. Например, разберем слово "Медведеву":
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]
Пример не очень удачный, т.к. первый разбор и так в дательном был :) Но смысл такой.
Отсеять те варианты, которые не в дательном падеже? :)
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