使用Lucene搜索单词的替代形式的最佳实践

时间:2009-05-21 15:08:28

标签: language-agnostic search lucene linguistics

我有一个可以使用Lucene搜索的网站。我从日志中注意到用户有时候找不到他们想要的东西,因为他们输入了一个单数术语,但只有该术语的复数版本在网站上使用。我希望搜索能够找到其他形式的单词的用法。这是一个我肯定已经解决过多次的问题,那么最佳做法是什么呢?

请注意:此网站只有英文内容

我想到的一些方法:

  1. 在某种词库文件中查找单词以确定给定单词的替代形式。
    • 一些例子:
      • 搜索“car”,同时在查询中添加“cars”。
      • 搜索“carry”,同时在查询中添加“carry”和“carry”。
      • 搜索“小”,同时在查询中添加“较小”和“最小”。
      • 搜索“can”,同时在查询中添加“can not”,“can not”,“cans”和“canned”。
      • 它应该反向工作(即搜索“携带”应该添加“携带”和“携带”)。
    • 缺点:
      • 除非经常更新词典/词库,否则不适用于许多新的技术词汇。
      • 我不确定搜索同义词库文件的效果。
  2. 根据一些启发式算法生成替代表单。
    • 一些例子:
      • 如果单词以“s”或“es”或“ed”或“er”或“est”结尾,请删除后缀
      • 如果单词以“ies”或“ied”或“ier”或“iest”结尾,则转换为“y”
      • 如果单词以“y”结尾,则转换为“ies”,“ied”,“ier”和“iest”
      • 尝试在单词中添加“s”,“es”,“er”和“est”。
    • 缺点:
      • 为大多数输入生成大量非单词。
      • 感觉像是黑客。
      • 看起来像你在TheDailyWTF.com上找到的东西。 :)
  3. 更复杂的东西?
  4. 我正在考虑对前两种方法进行某种组合,但是我不确定在哪里可以找到同义词库文件(或者它叫什么,因为“词库”不太正确,但两者都不是“字典”)。

5 个答案:

答案 0 :(得分:4)

单词词干对英语很有用,但是对于几乎不可能出现词语的语言(如我的),选项#1是可行的。我知道至少有一个这样的实现,我的语言(冰岛语)对Lucene似乎运作得很好。

答案 1 :(得分:4)

考虑在分析渠道中加入PorterStemFilter。确保对构建索引时使用的查询执行相同的分析。

我还使用了Lancaster stemming算法,效果很好。使用PorterStemFilter作为指南,很容易与Lucene集成。

答案 2 :(得分:3)

其中一些看起来很漂亮。就个人而言,我只是在查询中添加一些标签(查询转换)以使其模糊,或者您可以使用内置FuzzyQuery,它使用Levenshtein编辑距离,这将有助于拼写错误。

使用模糊搜索'query tags',也使用了Levenshtein。考虑搜索“汽车”。如果您将查询更改为'car~',它将找到'car'和'cars'等等。查询还有其他变换,可以处理您需要的几乎所有内容。

答案 3 :(得分:1)

如果您在专业领域工作(我使用园艺工作)或者使用的语言不能很好地使用正常的词干提取方法,您可以使用查询记录来创建手动词干表。

只需创建一个单词 - >你可以想到/人们正在搜索的所有不匹配的词干映射,然后在索引或搜索时用相应的词干替换表中出现的任何单词。感谢查询缓存,这是一个非常便宜的解决方案。

答案 4 :(得分:0)

词干是解决此问题的一种非常标准的方法。我发现Porter stemmer是标准关键字搜索的积极方式。它最终将词汇混合在一起,具有不同的含义。试试KStemmer算法。