пятница, 11 декабря 2009 г.

Стеммер от Hunspell

Да, совсем забыл. Я давно уже хотел попробовать стеммер Hunspell (то есть такую штуку, которая приводит слова к канонической форме) на основе орфографических словарей, но руки не доходили, в том числе и потому, что существующие интерфейсы к питону не слишком хорошо обращались с юникодными строками.

В конечном счёте я отказался от второго питона совсем, и решил написать модуль на ctypes под третьим во избежание проблем с преобразованием юникода. Получившийся модуль можно скачать здесь, а искать им леммы можно следущим образом:

>>> from hunspell import Hunspell
>>> h = Hunspell("ru_RU.aff", "ru_RU.dic")
>>> h.stem("ищет")
['искать']
>>> h.stem("суши")
['сушить', 'суша', 'сушь']

Словарь я скопировал из пакета myspell-ru, но следует иметь в виду, что при всей своей полноте и выверенности он не лишён недостатков:

>>> h.stem("лжёт")
['лжёт']

Тем не менее, стеммер Hunspell показал куда лучшие результаты, чем, например, алгоритм Портера (Snowball). Он очень быстрый и вполне пригоден для индексирования незамороченных документов, логов и тому подобных задач, но его возможности, понятное дело, ограничиваются объёмом и структурой словаря.

А поэтому, для более продвинутого анализа лучше использовать комбинированный (словарно-алгоритмический) метод, который реализован, например, в библиотеке pymorphy, плюсом которой также является отсутствие привязки к системным библиотекам.

Комментариев нет:

Отправить комментарий