【问题标题】:Best practices for seaching for alternate forms of a word with Lucene使用 Lucene 搜索单词的替代形式的最佳实践
【发布时间】:2009-05-21 15:08:28
【问题描述】:

我有一个可以使用 Lucene 搜索的网站。我从日志中注意到,用户有时找不到他们正在寻找的内容,因为他们输入了一个单数术语,但网站上只使用了该术语的复数形式。我希望搜索也能找到其他形式的单词的用法。我确信这个问题已经解决了很多次,那么最好的做法是什么?

请注意:本站只有英文内容

我想到的一些方法:

  1. 在某种同义词库文件中查找单词以确定给定单词的替代形式。
    • 一些例子:
      • 搜索“汽车”,同时将“汽车”添加到查询中。
      • 搜索“carry”,同时在查询中添加“carries”和“carried”。
      • 搜索“small”,同时在查询中添加“smaller”和“smallest”。
      • 搜索“can”,同时在查询中添加“can't”、“cannot”、“cans”和“canned”。
      • 它应该反向工作(即搜索“carries”应该添加“carry”和“carried”)。
    • 缺点:
      • 除非词典/词库经常更新,否则不适用于许多新的技术词汇。
      • 我不确定搜索词库文件的性能。
  2. 根据一些启发式算法以算法方式生成替代形式。
    • 一些例子:
      • 如果单词以“s”或“es”或“ed”或“er”或“est”结尾,请去掉后缀
      • 如果单词以“ies”或“ied”或“ier”或“iest”结尾,则转换为“y”
      • 如果单词以“y”结尾,则转换为“ies”、“ied”、“ier”和“iest”
      • 尝试在单词中添加“s”、“es”、“er”和“est”。
    • 缺点:
      • 为大多数输入生成大量非单词。
      • 感觉像个黑客。
      • 看起来像是您可以在 TheDailyWTF.com 上找到的内容。 :)
  3. 更复杂的东西?

我正在考虑对前两种方法进行某种组合,但我不确定在哪里可以找到同义词库文件(或者它的名称,因为“同义词库”并不完全正确,但也不是“字典”)。

【问题讨论】:

    标签: language-agnostic search lucene linguistics


    【解决方案1】:

    考虑在您的分析管道中包含PorterStemFilter。请务必对构建索引时使用的查询执行相同的分析。

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

    【讨论】:

      【解决方案2】:

      词干对英语来说效果很好,但是对于词干几乎不可能的语言(比如我的)选项#1 是可行的。我知道我的语言(冰岛语)的 Lucene 至少有一种这样的实现,它似乎运行良好。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            词干提取是解决此问题的一种非常标准的方法。我发现 Porter 词干分析器对于标准关键字搜索来说是一种激进的方式。它最终将具有不同含义的单词混为一谈。试试 KStemmer 算法。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2015-10-28
              • 2023-04-08
              • 1970-01-01
              • 2012-11-16
              • 2015-09-25
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多