【问题标题】:Improving lucene spellcheck改进 lucene 拼写检查
【发布时间】:2011-12-27 23:16:40
【问题描述】:

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

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

另一个问题是如何改进搜索查询中 2 个或多个术语的建议,目前我只做第一个,可以强烈改进以组合使用它们,但我找不到任何示例或实现这可以帮助我解决这个问题。

谢谢 阿尔米尔

【问题讨论】:

    标签: lucene lucene.net spell-checking


    【解决方案1】:

    在使用 lucene 和 sphinx 在两个不同的站点中实现两种不同的搜索功能后,我可以说 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
    

    有许多可用的词干分析器,如您所见,德语就是其中之一。

    更新:

    详细说明为什么我觉得 sphinx 是我的明显赢家。

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

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

    希望对您有所帮助...

    【讨论】:

    • 我认为这是一个关于 lucene 的问题,而不是关于替代品的问题
    • 是的,因为它混淆了所有其他响应。
    • I can say that sphinx is the clear winner. 请在公开场合详细分享您的意见/经验,说明为什么它是赢家,以便人们在选择文本搜索引擎时可以轻松决定
    • 狮身人面像能解决OP的问题吗? (多语言拼写检查)如果是这样,他们是怎么做的?
    • Sphinx 有一个称为形态学的功能,可以解决 OP 的问题,这就是我发布该功能的原因。
    【解决方案2】:

    据我所知,无法在拼写检查器索引中添加“语言”字段。我认为您需要定义几个搜索SpellCheckers 来实现这一点。

    编辑:在 cmets 中发现查询的语言也是由用户输入的,那么我的答案仅限于:定义多个拼写检查器。至于你添加的第二个问题,我认为之前已经讨论过,例如here

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

    【讨论】:

    • 在这种情况下检测查询语言非常简单,有一个下拉列表,用户必须选择语言:)
    • 抱歉,看了你的问题后,我有了不同的印象——你没有提到这些信息并不常见。
    • 嗨,您能否为我提供“无法在拼写检查器索引中添加 '语言' 字段”的参考,如果可以,我会接受作为答案并奖励您 - 谢谢
    【解决方案3】:

    如果你查看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
          }
          <...>
    

    I.E.建议搜索只是一堆 OR'd 布尔查询。您当然可以在此处修改此代码,例如:

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

    它只会寻找德语的建议。但是,除了拥有多个拼写检查器之外,如果不修改代码,就无法做到这一点。


    要处理多个术语,请使用 QueryTermExtractor 获取术语数组。对每个进行拼写检查,然后进行笛卡尔连接。您可能希望对每个组合运行查询,然后根据它们出现的频率进行排序(例如单字拼写检查器的工作方式)。

    【讨论】:

      猜你喜欢
      • 2014-01-21
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多