Django + Haystack + Whoosh: как бороться с языковым перегибом - PullRequest
2 голосов
/ 11 сентября 2010

Многие языки в Европе являются флективными. Это означает, что одно слово может быть написано в нескольких формах в тексте. Например, слово «компьютер» в польском языке «компьютер» имеет несколько форм: «компьютер», «компьютер», «компьютер», «компьютер» и т. Д.

Как правильно использовать django + haystack + whoosh, чтобы справиться с перегибом языка?

Всякий раз, когда я ищу любую форму "komputer", "komputera", "komputerowi", я имею в виду одно и то же -> "komputer".

В НЛП существует базовый подход, основанный либо на словах-основах (суффиксы сокращения), либо на преобразовании формы в базовую форму ("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 

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

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

Ответы [ 2 ]

4 голосов
/ 10 октября 2010

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

Whoosh по умолчанию имеет только stemming для английского языка.
Чтобы реализовать stemming для другого языка, сначала загляните внутрь:

/your_path_to_whoosh/whoosh/lang/analysis.py

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

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

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

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

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

Надеюсь, это поможет!

3 голосов
/ 11 ноября 2014

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

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