改进lucene拼写检查

时间:2011-11-13 08:18:15

标签: lucene lucene.net spell-checking

我有一个lucene索引,文档大约有20种不同的语言,并且都在同一个索引中,我有一个字段'lng',我只用一种语言来过滤结果。

根据这个索引,我实施了拼写检查,问题是我从所有语言中得到了相关的建议(如果我用英语搜索,德语中的建议不是我需要的)。我的第一个想法是为每种语言创建一个不同的拼写检查索引,而不是根据查询的语言选择索引,但我不喜欢这个,是否可以在拼写检查索引中添加额外的列并使用它,还是有更好的方法来做到这一点?

另一个问题是如何在搜索查询中改进2个或更多条款的建议,目前我只是为第一个做了,可以大力改进以组合使用它们,但我找不到任何样本或实现这可以帮助我解决这个问题。

感谢 阿尔米尔

3 个答案:

答案 0 :(得分:2)

据我所知,不可能在拼写检查器索引中添加“语言”字段。我认为您需要定义几个搜索SpellChecker来实现此目的。

编辑:正如评论中所说,用户也输入了查询语言,那么我的答案仅限于:定义多个拼写检查程序。至于您添加的第二个问题,我认为之前已经讨论过,例如here

但是,即使有可能,它也无法解决最大的问题,即查询语言的检测。对于非常短的消息来说,这是非常重要的任务,包括首字母缩略词,专有名词和俚语。简单的基于n-gram的方法可能是不准确的(例如来自Tika的语言检测器)。所以我认为最具挑战性的部分是如何使用语言检测器和拼写检查器的确定性分数以及应该选择什么阈值来提供有意义的校正(例如语言检测器更喜欢德语,但拼写检查器在丹麦语中有很好的匹配......)。

答案 1 :(得分:2)

如果你看一下SpellChecker.SuggestSimilar的来源,你可以看到:

    BooleanQuery query = new BooleanQuery();
    String[] grams;
    String key;

    for (int ng = GetMin(lengthWord); ng <= GetMax(lengthWord); ng++)
    {
      <...>
      if (bStart > 0)
      { 
         Add(query, "start" + ng, grams[0], bStart); // matches start of word
      }
      <...>

即。建议搜索只是一堆OR'd布尔查询。您当然可以使用以下内容修改此代码:

  query.Add(new BooleanClause(new TermQuery(new Term("Language", "German")),
                    BooleanClause.Occur.MUST));

只能查找德语的建议。除非有多个拼写检查程序,否则无需修改代码就无法做到这一点。


要处理多个字词,请使用QueryTermExtractor获取一系列字词。每个拼写检查和笛卡尔加入。您可能希望对每个组合运行查询,然后根据它们发生的频率进行排序(如单字拼写检查程序的工作方式)。

答案 2 :(得分:-2)

在两个不同的网站中使用lucene和sphinx实现两个不同的搜索功能后,我可以说狮身人面像是明显的赢家。

考虑使用http://sphinxsearch.com/而不是lucene。它由craigslist等人使用。

他们有一个名为形态预处理器的功能:

 # a list of morphology preprocessors to apply
 # optional, default is empty
 #
 # builtin preprocessors are 'none', 'stem_en', 'stem_ru', 'stem_enru',
 # 'soundex', and 'metaphone'; additional preprocessors available from
 # libstemmer are 'libstemmer_XXX', where XXX is algorithm code
 # (see libstemmer_c/libstemmer/modules.txt)
 #
 # morphology  = stem_en, stem_ru, soundex
 # morphology = libstemmer_german
 # morphology = libstemmer_sv
 morphology  = none

有许多词干器可供选择,正如你所看到的,德语就是其中之一。

更新:

详细阐述为什么我认为狮身人面像对我来说是明显的赢家。

  • 速度:狮身人面像很快愚蠢。索引和服务搜索查询。
  • 相关性:虽然很难对此进行量化,但我觉得与我的lucene实现相比,我能够通过sphinx获得更多相关结果。
  • 对文件系统的依赖:使用lucene,我无法打破对文件系统的依赖。虽然它们是变通方法,比如创建一个ram磁盘,但我觉得选择sphinx中的“仅在内存中运行”选项更容易。这对具有多个Web服务器的网站有影响,将动态数据添加到索引,重新索引等等。

是的,这些只是意见的一点。但是,他们是来自尝试过两种系统的人的意见。

希望有帮助...