Джанго+Haystack+Whoosh:как бороться с флексией языка
-
02-10-2019 - |
Вопрос
Многие языки Европы флективны.Это означает, что одно слово может быть записано в тексте в нескольких формах.Например, слово «компьютер» в польском «компьютер» имеет несколько форм:«компьютер», «компутерови», «компьютер», «компьютеры» и т. д.
Как мне правильно использовать django+haystack+whoosh, чтобы справиться с изменением языка?
Всякий раз, когда я ищу любую форму «компьютер», «компьютер», «компьютерови», я имею в виду одно и то же -> «компьютер».
В НЛП существует базовый подход, основанный либо на формировании слов (вырезании суффиксов), либо на преобразовании формы в базовую («компутерови» => «компьютер»).Есть несколько библиотек, которые могут в этом помочь.
Моей первой мыслью было подготовить какой-то специальный шаблонный фильтр, который будет конвертировать каждое распознанное слово в заданной переменной в текст с помощью базовых форм, а не форм.Тогда я мог бы использовать его в шаблонах поисковых индексов в 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?
Решение
У меня была очень похожая проблема, поэтому надеюсь, что смогу помочь.
По умолчанию Whoosh имеет значение только для английского языка.
Чтобы реализовать стемминг для другого языка, сначала загляните внутрь:
/your_path_to_whoosh/whoosh/lang/analysis.py
Это где StemmingAnalyzer
(анализатор по умолчанию) определен и является отличной отправной точкой.А stem
функция, импортированная из porter.py
, это еще одно важное место для поиска.
Итак, три шага:
Реализуйте свою собственную функцию стемминга, взяв в качестве ссылки функцию стембинга в porter.py и любые ссылки на грамматику и язык, которые вам понадобятся для правильного понимания правил.
Реализуйте свой собственный анализатор, взяв за основу
StemmingAnalyzer
внутриanalysis.py
.Файл тщательно документирован, поэтому у вас не должно возникнуть проблем с навигацией по нему.Ты увидишь этоStemmingAnalyzer
по сути представляет собой цепочкуTokenizer
с регулярным выражением для соответствия словам, фильтром нижнего регистра и фильтром стемминга, который по сути вызывает указанную выше функцию стемминга.Ты увидишь этоStemFilter
принимает функцию стемминга в качестве параметра, поэтому вам не нужно переопределять фильтр.Передайте свою новую функцию анализатора во время создания схемы, см. здесь: http://files.whoosh.ca/whoosh/docs/latest/schema.html#creating-a-schema
Надеюсь, это поможет!
Другие советы
Для будущих читателей:Whoosh может работать с разными языками с помощью стеммера Snowball.
from whoosh.lang.snowball.russian import RussianStemmer
stemmer_ru = RussianStemmer()
analyzer = StemmingAnalyzer(stemfn=stemmer_ru.stem)
schema = fields.Schema(
name=fields.TEXT(analyzer=analyzer),
)