Найти - Пользователи
Полная версия: Нахождение инфинитива, "начальной" формы слова
Начало » Python для экспертов » Нахождение инфинитива, "начальной" формы слова
1
tilarids
Мне нужно реализовать функциональность, которая в соответствие слову в любой форме(падеж, число и т.д.) ставит слово в начальной форме(для глаголов - инфинитив, для существительных - единственное число, именительный падеж, etc). Это не стемминг, так как ищется не основа, а именно слово.

Примеры:
Дисковые -> Дисковый;
Тормозит -> Тормозить;
Друзья -> Друг;

Кто-нибудь может подсказать, реализован ли где-нибудь уже подобный велосипед? Язык реализации значения не имеет, но лучше всего - Python, С++ или Java. Подобный алгоритм вроде как реализован в Яндекс.Словарях, так что реализация возможна.
slav0nic
pytils не помог?
tilarids
Разве pytils это умеет? Кажется, нет
j2a
Неа, не умеет. Здесь, вероятно, нужно брать http://nltk.org/ , только не знаю умеет ли он стемминг (выделение корня) для русского. Если что, есть алгоритм стемминга и словарь для русского языка – http://snowball.tartarus.org/algorithms/russian/stemmer.html В любом случае, задача не такая простая.

P.S. Ну и стоит отличать “простой алгоритм, работающий в 95%” и “теоретически обоснованный алгоритм работающий для 99% и плюс куча исключений”.
lightcaster
Да, lorien хорошую статью указал. Но тут нужен генератор, а не только анализатор.
Готовых генераторов вообще не встречал в открытом доступе. Но можно сделать самому :). Вот два решения.

В простом варианте:
1) тащим морфологическую базу отсюда http://aot.ru/download.php
2) парсим словарь и формируем словоформы
т.е. из этого
{ <основа> : }
формируем слова с указанием анкодов и леммы (полной морф. информации по версии aot.ru)
3) пихаем это все в шуструю бд (если python - shelve); лемматизатор готов
4) далее, герерация
- берем слово, которое нам нужно просклонять/изменить;
- получаем лемму и анкод;
- расшифровываем анкод, и на его основе формируем новый;
- используем этот анкод для нахождения искомой словоформы.

Вариант сложнее, но значительно красивее: вместо написания пишем трансдьюсер, куда скармливаем лемму и словоформу с морфологической информацией. Более подробно - слишком долго, сорри :). На aot.ru мого инфы по этому поводу.
lightcaster
Стоп, как всегда усложнил задачу.
Если нужно просто нормализовать слова, достаточно лемматизатора. Советую два:
- aot.ru
- mystem (http://company.yandex.ru/technology/mystem/ )
tilarids
lorien, lightcaster, спасибо! Pymorphy из хабровской статьи отлично справляется со своей задачей. И за алгоритмы стемминга тоже спасибо. Воспользуюсь еще вашими знаниями:
1) Существует ли алгоритмы стемминга/нормализации и словари для украинского языка?
2) Существует немалая вероятность, что часть или весь функционал прийдётся писать на Java. :( Какие-нибудь подобные решения, но для Java не подскажете?
tilarids
lorien
2) Так этот pymorphy по сути не такой уж большой - пару дней потрахаться - и будет порт на Java :-) Это если в мире Java родного ничего нету.
Согласен. Но зачем делать велосипед, если он уже есть? %) В принципе, меня сейчас больше удерживает не ситуация с Java, а с ситуацией с украинским языком. Любопытно, как работают всякие поисковики/переводчики/словари для украинского языка? Ведь в них частенько используется сходная функциональность…
mrgloom
Нет ли чего готового для анализа частоты вхождения слов?
т.е. сначала делаем лемматизацию(перевод в нормальную форму), а потом считаем вхождения слов(возможно учитывая синонимы и близкие слова(однокоренные?или производные одно от другого) например творог - твороженный) + еще стоп лист нужен.
Alexander_Panchenko
Попробуйте pymystem3 – оболочку вокруг Yandex Mystem 3.

* https://pypi.python.org/pypi/pymystem3/0.1.1

* https://github.com/Digsolab/pymystem3
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB