ApacheSolr и словарь для русского стемминга
Имеем Drupal 7 и Solr 1.4.1. Русский стэмминг реализован стандартным стэммингом от Портера. Он там довольно грубый, думаю все это знают. А вот в случае Sphinx можно для стэмминга подключать пользовательский словарь.
Обновил сегодня Solr до 3.4.0. Обновление прошло без проблем, потребовалось только заменить schema.xml на другой, из папки соответствующего друпаловского модуля.
И вот на 3-м Solr имеется интересная возможность: http://wiki.apache.org/solr/LanguageAnalysis#Customizing_Stemming, а конкретно solr.StemmerOverrideFilterFactory и возможность подключения словаря stemdict.txt.
Сделал его из словаря ispell как описывают в отношении такого же словаря для Sphinx при помощи spelldump. Только заменил символ " > " между терминами и корнями на табуляцию. Подключил.
Просто прописал в schema.xml соответствующие строки:
перед строками в стандартном schema.xml:
Перезапустил Solr. Создал по новой индекс. Все заработало - вижу что стэмминг стал более аккуратным. Появилась возможность подстраивать стемминг под свои нужды, редактируя stemdict.txt.
Странно, что эта возможность не реализована "из коробки" в друпаловском модуле интеграции Solr, хотя бы для варианта с 3-м Solr'ом, отдельный schema.xml все-таки для тройки же есть.
Но возникают два вопроса:
1) Может что-то делаю не так? Что стоит еще поправить?
2) В 3-м Solr есть кроме solr.PorterStemFilterFactory еще и solr.RussianLightStemFilterFactory (http://wiki.apache.org/solr/LanguageAnalysis#Russian). Кто-нибудь имел опыт его использования?
P.S. В Solr 3.5 обещают вообще в качестве стеммера возможность выбрать Hunspeel, который используется в OpenOffice. А следовательно, даже словари myspeel не нужно будет конвертировать, что не может не радовать.
P.P.S. Кстати, походу у Solr есть ограничение по максимальному размеру stemdict.txt.
Комментарии
А как поставить этот русский стреминг от Портера?
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Находите в файле schema.xml в двух местах строки: filter language="English" protected="protwords.txt"
меняете их на: filter language="Russian" protected="protwords.txt"
Это в случае, если у вас сайт одноязычный и поиск будет только по русскому языку. Если многоязычный - ставьте соответствующий модуль и им генерите файлы для нужных языков. Ну или вручную их делайте.
Если у вас два домена под разные языки, то еще вариант - запускаете ядра Solr по числу доменов и у каждого прописываете свою директорию Solr, куда кладете необходимые файлы.
Но, повторюсь, SnowballPorterFilterFactory по умолчанию не всегда хорошо русские корни выделяет. Почему и заинтересовала возможность прикрутить отдельно русский словарь.
P.S. Это все, естественно, подразумевает установленный и работающий ApacheSolr.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Спасибо! А файл protwords.txt брать из архива модуля для друпала или же есть специальный какой?
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
protwords.txt в друпаловском архиве - пример, на его основе можно свой составить.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Да, кстати, при использовании 3-й версии Solr придется solrconfig.xml править: http://drupal.org/node/1116896, хоть это и не критично, но все же.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
gasloff@drupal.org А можете поделиться своим protwords.txt у вас он наверняка лучше стандартного.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Я protwords.txt под себя еще не правил. Stopwords.txt подрихтовал. Сейчас вожусь с stemdict.txt. Затем в планах разобраться с spellings.txt и вообще настройками спеллинга, а также с учетом переносов. А там еще синонимы на очереди. Но у меня довольно специфические потребности сейчас, учитывающие один специфический спортивный жаргон. Потому вряд ли файлы подойдут для паблика.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Да, кстати, ради интереса попробовал просто заменить в типовом schema.xml solr.PorterStemFilterFactory на solr.RussianLightStemFilterFactory. Результат не понравился, индексация идет, но в финале друпаловский модуль виснет. Хотя сам Solr вроде с индексацией справляется. Но все равно не айс
Чтобы не было глюка, описанного выше, solr.RussianLightStemFilterFactory подключается без указания ссылки на protwords.txt, т.е. вместо: filter language="Russian" protected="protwords.txt" пишем: filter
К сожалению, не смог выяснить глюк ли это модуля под Друпал или у данного стеммера просто нельзя указывать такой параметр в schema.xml.
Еще не очень приятная особенность у нынешнего стеммера в Solr http://lucene.472066.n3.nabble.com/Russian-stemmer-td998603.html - он временами хулиганит со склонениями имен собственных и географических названий. Но это лечится как раз при помощи указания таких имен в словаре stemdict.txt. Причем некоторые он нормально склоняет, а на некоторых спотыкается. Надо смотреть в "полевых условиях", судя по всему. Могут быть как глюки со склонением редких имен, которые он без указания в словаре может просто отказаться склонять. Так и с неправильным выделением корня. Например, в имени "Вася" Solr выделяет корень "вас" и, естественно, выдает не только словоформы от "Вася", но и все упоминания "вас". Лечим внесением правильного корня в stemdict.txt.
Конечно есть надежда, что в 3.5 в Hunspeel это будет учтено. Вобщем продолжаем экспериментировать
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
А можно немного подробнее? У меня сайт на двух языках - рус и англ, соответственно поиск нужен и по-русски и по английски. К сожалению, о том, как совместить два языка вместе нет информации. Буду очень признателен.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
У меня разные языки разведены на разные сайты, потому проще. Вам, видимо, нужно копать в сторону этого модуля: http://drupal.org/project/apachesolr_multilingual Там создаются отдельные файлы для каждого из необходимых языков, плюс вносятся коррективы в общие файлы, при этом для сайта используется одно ядро, вроде. Но сам не пробовал. Попробуйте, там довольно все просто.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Спасибо огромное! В попыхах не заметил этого модуля )) Попробую разобраться.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Только что попробовал Hunspell - http://wiki.apache.org/solr/LanguageAnalysis#Notes_about_solr.HunspellSt. Пока что не понял, работает оно или нет (может не надо словари конвертить в UTF8. ). Словари для Hunspell брать тут - http://download.services.openoffice.org/files/contrib/dictionaries/ - их надо сконвертить в UTF8 и подложить солру (рядом с schema.xml).
Из всего вышеописанного получается, что можно использовать следующие варианты стемминга для русского языка:
Первый из них - это кастомный маппинг для слов, защищает их от последующих стеммеров. Из трех следующих по идее надо выбирать один. Сейчас пока остановился на RussianLightStemFilterFactory.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
duozersk, спасибо, очень помогло. Hunspell показал наилучший результат. SnowballPorter и RussianLightStem, например, не различают слова "отдых" и "отдам", а StemmerOverrideFilterFactory у меня почему-то не заработал (вообще не стартует Солр с этим фильтром, ловится exception).
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Рад, что помог Не могли бы вы тогда тут по свежим следам отписать, как вы заводили Hunspell (нужно ли было конвертировать файлы, как вы это делали, куда и какие файла конвертировали/копировали)? Я сейчас уже давно не на том проекте, где это использовал - но поможет в будущем. Помню, что по теории Hunspell должен был дать лучший результат, но у меня тогда так и не заработало.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
С Hunspell довольно просто. Словари по ссылке обязательно нужно перевести в UTF-8. Только открыть и удостовериться, что файл действительно стал читабельным иначе работать не будет. Положить в папку с конфигом, подключить как вы и написали, и все работает! Только строит индекс очень и очень медленно.
Есть еще один альтернативный стимер, но завести к сожалению не смог. jmorphy2-solr-stemmer который использует библиотеку rymorphy2 https://github.com/anti-social/jmorphy2-solr-stemmer
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
«С Hunspell довольно просто. Словари по ссылке обязательно нужно перевести в UTF-8. Только открыть и удостовериться, что файл действительно стал читабельным иначе работать не будет. Положить в папку с конфигом, подключить как вы и написали, и все работает! Только строит индекс очень и очень медленно.»
а через что вы конвертировали? я пробовал через iconv следующим образом:
iconv -f ISO- 8859 - 1 - t UTF8 ru_RU.dic > new_ru_RU.dic
Тоже самое с .aff файлом. В schema.xml добавил строку < filter class = "solr.HunspellStemFilterFactory" dictionary= "ru_RU.dic" affix= "ru_RU.aff" ignoreCase= "true" />
Перезагружал сервер солра, переиндексировал в друпале. В итоге ищет только по полному соответствию
Может надо что то отредактировать еще в конфиге? Или как то по другому надо конвертить?
P.S. Версия солра - 3.6.1
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Это наверно проблема кодировки. Я открыл оба файла в эдиторе у себя под windows, увидел абракадабру, изменил кодировку, сохранил, залил на сервер и все встало на свои места. До этого тоже была проблема: Solr так же искал по полному соответствию. iconv не пользовался.
Кстати, в конце концов мы начали пользоваться SnowballPorterFilterFactory, так как индексация в разы быстрее, а ощутимой разницы с Hunspell все таки не увидели.
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
А как назывался редактор под windows?
>Кстати, в конце концов мы начали пользоваться SnowballPorterFilterFactory, так как индексация в разы быстрее, а ощутимой разницы с Hunspell все таки не увидели. чтобы он нормально работал, нужен заполненный protwords.txt?
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
и еще хороший вопрос, какая у вас была версия солра?
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Я переконвертировал файлы в UTF-8 через Krusader но ищет по прежнему только по точному соответствию
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Спасибо! Это помогло!
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Для слова радиаторный находит только по радиаторн и радиаторны. Что интересно по точному соответствию не находит!
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Привет всем Я так и не понял почему Solr не ищет по части слова, можете подсказать в чем дело?
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Solr ищет по части слова, и успешно.
Изначально же тема была про стемминг, то есть индексацию слов с учетом морфологии языка. Наконец-то снова заработал поиск на computerbild.ru (я уже не занимаюсь этим проектом) - можете посмотреть, например, вот этот запрос - видеокарты - по слову "видеокарты" поиск найдёт статьи (и выделит в сниппете), содержащие различные слово-формы поисковой фразы: "видеокарту", "видеокарта", "видеокарте", "видеокартами" и тд. Но по запросу видеокар поиск уже не выдаст этих результатов (в отличие от способа образования n-грамм). Настроен он тут так, как я отписывал выше - http://www.drupal.ru/node/71073#comment-417724
- Войдите или зарегистрируйтесь, чтобы отправлять комментарии
Словари я конвертировал в UTF-8 в текстовом редакторе в Ubuntu/Linux Mint.