Задать вопрос

Как решить проблему со склонением городов и pymorphy2?

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

Есть проблема со склонением городов.
Вот тестовый код:

#coding=utf-8

import pymorphy2

morph = pymorphy2.MorphAnalyzer()

city_atoms = [u'Москва',u'Волгоград',u'Нижний Новгород',u'Домодедово',u'Люберцы',u'деревня Квакино']
for city_atom in city_atoms:
    print  morph.parse(city_atom)[0].inflect({'loct'}).word


Вот что на выходе:

москве
волгограде
нижний новгороде
домодедове
люберцах
деревня квакином


Москву и Волгоград - просклонял нормально. Нижний Новгород просклонялся только вторым словом. Домодедово - вообще не должно вроде как склоняться, Люберцы - точно не знаю, если честно, как правильно будет, а деревня Квакино вообще, кажется, просклонялась как фамилия.

Посему есть вопросы:
- Как сие безобразие побороть, может, какие словари по городам есть?
- Как (если это возможно) заставить систему не менять регистр? А то одно дело Нижний Новгород а другое дело Ростов-На-Дону или "поселок Запупеево".
  • Вопрос задан
  • 5035 просмотров
Подписаться 5 Оценить 3 комментария
Решения вопроса 3
Hateman31
@Hateman31
Делиться мыслями - это круто!
Первое что пришло на ум:
прописать правила склонения через regex и if-ветвление
Ответ написан
zxmd
@zxmd Автор вопроса
@kmike
Конкретно для примеров из вопроса все решается в рамках pymorphy2 как-то так:

from pymorphy2.shapes import restore_capitalization

def inflect_all(morph, text, required_grammemes):
    tokens = text.split()
    inflected = [
        restore_capitalization(
            morph.parse(tok)[0].inflect(required_grammemes).word,
            tok
        )
        for tok in tokens
    ]
    return " ".join(inflected)


Больше информации - см. в гуглогруппе: https://groups.google.com/forum/?fromgroups#!topic...

Подозреваю, что решение от Яндекса тоже будет ошибаться время от времени, и для него тоже хорошо бы прикрутить ручную исправлялку. Но работать должно все-таки получше, чем pymorphy2, т.к. библиотека pymorphy2 специально для склонения не затачивалась пока.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы