使用 Lucene 搜索单词替代形式的最佳实践
-
23-08-2019 - |
题
我有一个可以使用 Lucene 进行搜索的网站。我从日志中注意到,用户有时找不到他们正在寻找的内容,因为他们输入了单数术语,但网站上只使用了该术语的复数版本。我希望搜索也能找到单词其他形式的用法。我确信这个问题已经被解决了很多次,那么对此的最佳实践是什么?
请注意:该网站只有英文内容.
我想到的一些方法:
- 在某种同义词库文件中查找该单词以确定给定单词的替代形式。
- 一些例子:
- 搜索“car”,同时将“cars”添加到查询中。
- 搜索“carry”,同时将“carries”和“carried”添加到查询中。
- 搜索“small”,同时在查询中添加“smaller”和“smallest”。
- 搜索“can”,同时将“can't”、“cannot”、“cans”和“canned”添加到查询中。
- 它应该反向工作(即搜索“carries”应添加“carry”和“carried”)。
- 缺点:
- 除非字典/同义词库经常更新,否则不适用于许多新技术单词。
- 我不确定搜索同义词库文件的性能。
- 一些例子:
- 根据一些启发法,通过算法生成替代形式。
- 一些例子:
- 如果单词以“s”或“es”或“ed”或“er”或“est”结尾,则删除后缀
- 如果单词以“ies”或“ied”或“ier”或“iest”结尾,则转换为“y”
- 如果单词以“y”结尾,则转换为“ies”、“ied”、“ier”和“iest”
- 尝试在单词中添加“s”、“es”、“er”和“est”。
- 缺点:
- 为大多数输入生成大量非单词。
- 感觉就像黑客。
- 看起来像是您在 TheDailyWTF.com 上找到的东西。:)
- 一些例子:
- 有更复杂的东西吗?
我正在考虑对前两种方法进行某种组合,但我不确定在哪里可以找到同义词库文件(或者它的名称,因为“同义词库”不太正确,但“词典”也不是) )。
解决方案
考虑包括 PorterStemFilter
在您的分析管道中。请务必对构建索引时使用的查询执行相同的分析。
我也用过 兰卡斯特词干 算法并取得了良好的效果。使用 PorterStemFilter
作为指导,与 Lucene 集成很容易。
其他提示
词干提取对于英语来说效果很好,但是对于几乎不可能进行词干提取的语言(比如我的),选项 #1 是可行的。我知道 Lucene 的语言(冰岛语)至少有一种这样的实现,它似乎工作得很好。
如果您在专业领域工作(我在园艺方面做到了这一点),或者使用的语言不能很好地使用正常的词干提取方法,您可以使用查询日志记录来创建手动词干提取表。
只需为您能想到的/人们正在搜索的所有不匹配创建一个单词 -> 词干映射,然后在索引或搜索时用适当的词干替换表中出现的任何单词。由于查询缓存,这是一个非常便宜的解决方案。
词干提取是解决这个问题的一种非常标准的方法。我发现 Porter 词干分析器对于标准关键字搜索来说非常激进。它最终会将具有不同含义的单词混为一谈。尝试 KStemmer 算法。
不隶属于 StackOverflow