2010-09-10 2 views
2

Многие языки в Европе являются флективными. Это означает, что одно слово может быть написано в нескольких формах в тексте. Например, слово «компьютер» на польском языке «компутер» имеет несколько форм: «компутер», «komputerowi», «komputerem», «KOMPUTERY» и т.д ..Django + Haystack + Whoosh: как бороться с перегибом языка

Как следует использовать Джанго + стог + правильно свист иметь дело с перегибом языка?

Всякий раз, когда я ищу любую форму «компьютер», «компутера», «компьютер», я имею в виду эту же вещь -> «компьютер».

В НЛП существует базовый подход, основанный либо на словесных словах (суффиксах суффиксов), либо на преобразовании формы в базовую форму («komputerowi» => «komputer»). Есть некоторые библиотеки, которые могут помочь с этим.

Моя первая мысль заключалась в подготовке специального фильтра шаблонов, который преобразует каждое распознанное слово в заданной переменной в текст с базовыми формами, а не с формами. Тогда я мог бы использовать его в шаблонах поисковых индексов в django + haystack. Если поисковый запрос будет также преобразован, прежде чем оценивать механизм whoosh, это должно работать отлично. Смотрите пример:

haystack search index template: 
    {{some_indexed_text|convert_to_base_form_filter}} 

text to index: "Nie ma komputera" => "Nie ma komputer" <- this is really indexed 
search query: "komputery"   => "komputer" <-- this will match 

Но я не думаю, что это «элегантное» решение этой проблемы, а также некоторые другие функции не будут работать - как предлагая предложения орфографических ошибок.

Итак - как я должен решить эту проблему? Может быть, я должен использовать другую поисковую систему, чем whoosh?

ответ

4

У меня была очень похожая проблема, поэтому я надеюсь, что смогу помочь.

Whoosh по умолчанию используется только для английского языка.
Для реализации вытекающих для другого языка, первый заглянуть внутрь:

/your_path_to_whoosh/whoosh/lang/analysis.py 

Это где StemmingAnalyzer (по умолчанию анализатор) определена и является отличной отправной точкой. . stem функции, импортировано из porter.py, является другим важным местом для поиска в

Итак, три шага:

  • Реализовать свою собственную вытекающую функцию, взяв в качестве ссылки функции стволовой в швейцару .py и любые грамматические и языковые ссылки, которые вам понадобятся, чтобы получить правильные правила.

  • Внесите свой собственный анализатор, взяв в качестве ссылки StemmingAnalyzer внутри analysis.py. Файл сильно задокументирован, поэтому у вас не должно возникнуть проблем с навигацией по нему. Вы увидите, что StemmingAnalyzer в основном представляет собой цепочку Tokenizer с регулярным выражением для соответствия словам, нижнему регистровому фильтру и фильтру стебля, который в основном вызывает вышеуказанную функцию вытеснения. Вы увидите, что StemFilter выполняет функцию вытеснения в качестве параметра, поэтому вам не нужно переопределять фильтр.

  • Пройдите свою новенькую функцию анализатора в момент создания схемы, смотрите здесь: http://files.whoosh.ca/whoosh/docs/latest/schema.html#creating-a-schema

Я надеюсь, что это помогает!

+0

Спасибо! Я не знал, что у него есть все. – thedk

+1

К сожалению, эта ссылка больше не работает – Rost

3

Для будущих читателей: Whoosh может обрабатывать разные языки со стеблем снежного кома.

from whoosh.lang.snowball.russian import RussianStemmer 
stemmer_ru = RussianStemmer() 
analyzer = StemmingAnalyzer(stemfn=stemmer_ru.stem) 
schema = fields.Schema(
    name=fields.TEXT(analyzer=analyzer), 
)