Вопрос

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

Как мне правильно использовать 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),
)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top