Lucene Spellchecker排名建议奇怪

时间:2012-11-30 21:50:09

标签: c# lucene lucene.net spell-checking

我在Lucene.NET contrib NuGet包v3.0.3中使用了拼写检查程序。

使用_spellChecker.IndexDictionary(new SpellChecker.Net.Search.Spell.LuceneDictionary(reader, "Name"));

创建拼写检查器索引

我遇到的问题是(我假设)由于带状疱疹/ n-gram的工作原理,运行_spellChecker.SuggestSimilar("Wiess")并不会让“Weiss”得分非常高。 “见证”,“无线”和“遗嘱”得分高于“威斯”。

似乎“Weiss”应该得分高于“无线”。有没有办法可以通过调整来获得结果?

2 个答案:

答案 0 :(得分:2)

你没有提供DOES返回的内容,所以我假设你根本不喜欢它给的东西,而不是它什么都不给你。

在Lucene文档中,没有一个SuggestSimilar方法采用1个参数。我相信这是因为你不应该只依赖于一个结果,每个API,最小参考建议参数的数量:

“即如果numSug == 1,请不要指望该建议是最好的。因此,您应该将此值设置为至少5 以获得良好的建议。”

我假设您可以提供第二个参数。尝试将其设置得更高,看看你得到了什么。

编辑 -

好。我知道了。也许一个简单的Levenshtein距离风格算法会更符合您的要求。 Lucene 4.0为此提供了一个(实验性的)新拼写检查程序:DirectSpellChecker。另外,我认为,简单的FuzzyQuery也可以完成这项工作。这些方法中的任何一种都将删除SpellChecker算法的各个方面,有效地简化它,并且您可能会发现您的结果总体上变得更糟。

注意:

  • “Wiess”“Weiss”距离2
  • “Wiess”“见证”距离2
  • “Wiess”“无线”距离3
  • “Wiess”“Wills”distance 2

所以,实际上,这可能不会让你在那里。你可能会编写一个过滤器,它更喜欢查询相同长度的结果,但这无助于区分Wills。那个你可能不得不忍受的。

答案 1 :(得分:0)

这个问题导致了另一个问题。见答案:Lucene SpellChecker Prefer Permutations or special scoring

非常感谢femtoRgon让我指向正确的方向。