Оптимальный поиск или поиск с учётом словоформ
Народ! ХАчу написать свой морфоанализатор, а точнее его подобие :)
Я тута думал-думал и надумал три способа:
- Зачем вообще писать сложную систему, если можно просто сделать БД с корнями слов (по-максимуму) и перед поиском ключевых слов, переделать их в корни ключевых слов и искать.
Таким образом всё сводиться к табличке/справочнику с корнями ключевых слов.
+ - Скорость и на 95% - то что надо. Остальные 5% теряются из-за того, что не возможно будет учесть к примеру пару слов, которые, по-сути, есть одно и тоже, просто в разном склонении имеют разные корни
- - Нужно следить за полнотой словоря, но это дело второе.
- Анализатор совпадения/идентичности в процентном соотношении двух слов.
К примеру, есть пара слов А и Б, если, к примеру, два эти слова похожи по набору букв на 75%, на это то что надо.
+ - Вообще не нужен ни какой словарь.
- - Работает просто безумно долго, т.к. придётся проверять каждое слово в массиве. Что делает это не приемлимым способом.
- Объединяет оба способа выше. Суть его заключается в том, что способ 2 лишён недостатков способа 1. А значит они могут помочь друг другу. Можно просто использовать способ 2 при выборке корней слов из справочника. А значит у нас будут все варианты слов, в разных склонениях, если даже пара слов одинаковые, тока в разных склонениях и имеют разные корни.
Как Вам мои мысли?
Есть ещё один интернет проект http://www.oomnik.ru/products/ занимается похожими вещами
Пообщавшись, я пришёл к мнению, что хорошее соотношение цена/качество только у одного варианта: справочник корней (и слов привязанных к ним)
Так по крайней мере наверняка реализовано у http://www.rco.ru/product.asp?ob_no=12.
Как верно подметил Алексей Рюмин aka Dwarf[досье] их система делает морфологический анализ. Я же замечу, что думаю, что она вообще его не делает, а просто ищет соответствия в своём справочнике. Ибо как сказано у них в доке: в их справочнике очень много слов.
Aslan[досье], зачам изобретать велосипед?
Используйте ispell или стеммер Портера. Вот на выбор три возможных алгоритма:
- Построение на основе ispell полного русского словаря (всех словоформ), и поиск по нему всех нормальных словоформ. Объем словаря будет очень большим, т.к. нужно будет хранить все словоформы, полученные из ispell.
- Поиск основной формы слова (также по ispell) на основе алгоритма, описанного здесь:
Работа с русской морфологией при помощи словаря ispell
В базе потребуется хранить только исходный ispell-овский словарь.
- Вовсе без словаря — использовать стеммер Портера (это, насколько мне известно, единственный более-менее приемлемый стеммер для русского языка). Я, кстати предпочитаю именно этот вариант. Оригинальное описание здесь: http://snowball.tartarus.org/algorithms/russian/stemmer.html
У Котерова есть неплохая реализация: http://forum.dklab.ru/php/advi......ionOfARootFromRussianWord.html
Могу поделиться и своей, но у Дмитрия сделано проще и изящнее.
![[logo]](/site/images/logo.jpg)