Форум сайта python.su
Мне нужно реализовать функциональность, которая в соответствие слову в любой форме(падеж, число и т.д.) ставит слово в начальной форме(для глаголов - инфинитив, для существительных - единственное число, именительный падеж, etc). Это не стемминг, так как ищется не основа, а именно слово.
Примеры:
Дисковые -> Дисковый;
Тормозит -> Тормозить;
Друзья -> Друг;
Кто-нибудь может подсказать, реализован ли где-нибудь уже подобный велосипед? Язык реализации значения не имеет, но лучше всего - Python, С++ или Java. Подобный алгоритм вроде как реализован в Яндекс.Словарях, так что реализация возможна.
Офлайн
pytils не помог?
Офлайн
Разве pytils это умеет? Кажется, нет
Офлайн
Неа, не умеет. Здесь, вероятно, нужно брать http://nltk.org/ , только не знаю умеет ли он стемминг (выделение корня) для русского. Если что, есть алгоритм стемминга и словарь для русского языка – http://snowball.tartarus.org/algorithms/russian/stemmer.html В любом случае, задача не такая простая.
P.S. Ну и стоит отличать “простой алгоритм, работающий в 95%” и “теоретически обоснованный алгоритм работающий для 99% и плюс куча исключений”.
Отредактировано (Янв. 29, 2009 07:22:58)
Офлайн
Да, lorien хорошую статью указал. Но тут нужен генератор, а не только анализатор.
Готовых генераторов вообще не встречал в открытом доступе. Но можно сделать самому :). Вот два решения.
В простом варианте:
1) тащим морфологическую базу отсюда http://aot.ru/download.php
2) парсим словарь и формируем словоформы
т.е. из этого
{ <основа> : }
формируем слова с указанием анкодов и леммы (полной морф. информации по версии aot.ru)
3) пихаем это все в шуструю бд (если python - shelve); лемматизатор готов
4) далее, герерация
- берем слово, которое нам нужно просклонять/изменить;
- получаем лемму и анкод;
- расшифровываем анкод, и на его основе формируем новый;
- используем этот анкод для нахождения искомой словоформы.
Вариант сложнее, но значительно красивее: вместо написания пишем трансдьюсер, куда скармливаем лемму и словоформу с морфологической информацией. Более подробно - слишком долго, сорри :). На aot.ru мого инфы по этому поводу.
Офлайн
Стоп, как всегда усложнил задачу.
Если нужно просто нормализовать слова, достаточно лемматизатора. Советую два:
- aot.ru
- mystem (http://company.yandex.ru/technology/mystem/ )
Офлайн
lorien, lightcaster, спасибо! Pymorphy из хабровской статьи отлично справляется со своей задачей. И за алгоритмы стемминга тоже спасибо. Воспользуюсь еще вашими знаниями:
1) Существует ли алгоритмы стемминга/нормализации и словари для украинского языка?
2) Существует немалая вероятность, что часть или весь функционал прийдётся писать на Java. :( Какие-нибудь подобные решения, но для Java не подскажете?
Офлайн
lorienСогласен. Но зачем делать велосипед, если он уже есть? %) В принципе, меня сейчас больше удерживает не ситуация с Java, а с ситуацией с украинским языком. Любопытно, как работают всякие поисковики/переводчики/словари для украинского языка? Ведь в них частенько используется сходная функциональность…
2) Так этот pymorphy по сути не такой уж большой - пару дней потрахаться - и будет порт на Java :-) Это если в мире Java родного ничего нету.
Офлайн
Нет ли чего готового для анализа частоты вхождения слов?
т.е. сначала делаем лемматизацию(перевод в нормальную форму), а потом считаем вхождения слов(возможно учитывая синонимы и близкие слова(однокоренные?или производные одно от другого) например творог - твороженный) + еще стоп лист нужен.
Офлайн
Попробуйте pymystem3 – оболочку вокруг Yandex Mystem 3.
* https://pypi.python.org/pypi/pymystem3/0.1.1
* https://github.com/Digsolab/pymystem3
Офлайн