我正在实现法语文本的Lucene搜索。无论用户是否输入了口音,搜索都必须工作,并且还必须支持词干。我目前正在Lucene 3中使用基于Snowball的法语词干编辑器。
在索引方面,我在分析器中添加了一个ASCIIFoldingFilter
,它在词干分析器之后运行。
然而,在搜索方面,该操作是不可逆的:仅在输入内容包含重音的情况下,词干器才起作用。例如,它从université
的末尾词干ité
,但在用户搜索输入universit
时,词干器在查询分析期间返回universit
。当然,由于索引包含术语univers
,因此搜索universit
不会返回任何结果。
一个解决方案似乎是改变分析器中词干和折叠的顺序:不是词干然后折叠,而是在词干之前折叠。这有效地使操作可逆,但也大大阻碍了词干分析器,因为许多单词不再符合词干规则。
或者,词干分析器可以修改为对折叠输入进行操作,即忽略重音,但这会导致词干过度吗?
有没有一种方法可以在不改变词干算法行为的情况下有效地进行折叠搜索?
步骤1.)使用详尽的引理同义词映射文件
步骤2.)ASCII(ICU)lemmatize后折叠。
你可以在这里得到详尽的法语引理:http://www.lexiconista.com/datasets/lemmatization/
此外,因为lemmatizer不像stemmer那样具有破坏性,你可以多次应用lemmatizer,也许你的lemmatizer也包含无口音的标准化…只需再次应用lemmatizer。