Django+Haystack+Whoosh:如何处理语言屈折

the*_*edk 2 django inflection whoosh django-haystack

欧洲的许多语言都是屈折变化的。这意味着一个词可以在文本中以多种形式书写。例如,波兰语“komputer”中的“computer”一词有多种形式:“komputera”、“komputerowi”、“komputerem”、“komputery”等。

我应该如何正确使用 django+haystack+whoosh 来处理语言屈折?

每当我搜索任何形式的“komputer”、“komputera”、“komputerowi”时,我的意思都是一样的 ->“komputer”。

在 NLP 中,有一种基于词干(切割后缀)或将形式转换为基本形式(“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 
Run Code Online (Sandbox Code Playgroud)

但我不认为这是这个问题的“优雅”解决方案,其他一些功能也不起作用 - 比如建议拼写错误的建议。

那么 - 我应该如何解决这个问题?也许我应该使用其他搜索引擎而不是 whoosh?

Ago*_*gos 5

我有一个非常相似的问题,所以我希望我能帮上忙。

默认情况下,Whoosh 仅针对英语进行词干。
要为另一种语言实现词干提取,请先查看内部:

/your_path_to_whoosh/whoosh/lang/analysis.py
Run Code Online (Sandbox Code Playgroud)

这是StemmingAnalyzer(默认分析器)定义的地方,也是一个很好的起点。stem从 导入的函数porter.py是另一个需要查看的重要位置。

所以,这三个步骤是:

  • 实现您自己的词干提取函数,将 porter.py 中的词干函数以及任何语法和语言参考作为参考,以正确获取规则。

  • 实现您自己的分析器,作为StemmingAnalyzer内部参考analysis.py。该文件有大量文档记录,因此您浏览它应该没有问题。你会看到这StemmingAnalyzer基本上是一个Tokenizer带有正则表达式的链接,以匹配单词、小写过滤器和基本上调用上述词干函数的词干过滤器。您会看到,StemFilter它将词干提取函数作为参数,因此您不必重新实现过滤器。

  • 在模式创建时传递您全新的分析器功能,请参见此处:http : //files.whoosh.ca/whoosh/docs/latest/schema.html#creating-a-schema

我希望这有帮助!


MrK*_*Ksn 5

对于未来的读者: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),
)
Run Code Online (Sandbox Code Playgroud)