欧洲的许多语言都是屈折的。这意味着一个单词可以在文本中以多种形式书写。例如,波兰语“komputer”中的“计算机”一词有多种形式:“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
但我不认为这是“优雅”解决这个问题的方法,其他一些功能也不会起作用 - 比如建议拼写错误的建议。
那么 - 我该如何解决这个问题呢?也许我应该使用其他搜索引擎而不是嗖嗖?
答案 0 :(得分:4)
我有一个非常类似的问题,所以我希望我可以提供帮助。
默认情况下,飞快移动仅限于英语语言 要实现其他语言的词干,首先要看一下:
/your_path_to_whoosh/whoosh/lang/analysis.py
这是定义StemmingAnalyzer
(默认分析器)的地方,也是一个很好的起点。从stem
导入的porter.py
功能是另一个值得关注的重要位置。
所以,这三个步骤是:
实现自己的词干提取功能,将porter.py中的词干函数作为参考,以及正确规则所需的语法和语言参考。
在StemmingAnalyzer
内以analysis.py
作为参考,实施您自己的分析工具。该文件记录很多,因此您可以毫无问题地浏览它。您会看到StemmingAnalyzer
基本上是Tokenizer
的链接,其中正则表达式匹配单词,小写过滤器和词干过滤器基本上调用上述词干功能。您会看到StemFilter
将词干函数作为参数,因此您不必重新实现过滤器。
在架构创建时传递全新的Analyzer功能,请参见此处:http://files.whoosh.ca/whoosh/docs/latest/schema.html#creating-a-schema
我希望这有帮助!
答案 1 :(得分:3)
对于未来的读者:飞快移动可以使用雪球词干来处理不同的语言。
from whoosh.lang.snowball.russian import RussianStemmer
stemmer_ru = RussianStemmer()
analyzer = StemmingAnalyzer(stemfn=stemmer_ru.stem)
schema = fields.Schema(
name=fields.TEXT(analyzer=analyzer),
)