我正在使用 Lucene.NET contrib NuGet 包 v3.0.3 中的拼写检查器。
拼写检查器索引是使用 _spellChecker.IndexDictionary(new SpellChecker.Net.Search.Spell.LuceneDictionary(reader, "Name")); 创建的;
我遇到的问题是(我假设)由于 shingles/n-grams 的工作方式,运行 _spellChecker.SuggestSimilar("Wiess")
不会得分“Weiss”很高。 “Witness”、“Wireless”和“Wills”得分高于“Weiss”。
看来“Weiss”的得分应该高于“Wireless”。有什么方法可以调整它以获得该结果吗?
最佳答案
您还没有提供返回的内容,所以我假设您只是不喜欢它所提供的内容,而不是它没有给您带来任何好处。
在 Lucene 文档中,没有采用 1 个参数的 SuggestSimilar 方法。我相信这是因为您永远不应该只依赖一个结果,根据 API,对建议参数数量的最小引用:
“也就是说,如果 numSug == 1,则不要指望该建议是最好的建议。因此,您应该将此值设置为至少 5,以获得一个好的建议。”
我假设您可以提供第二个参数。尝试将其设置得更高,看看会得到什么。
编辑--
好的。我懂了。也许一个简单的 Levenshtein 距离风格算法更适合您。 Lucene 4.0 为此提供了一个(实验性)新的拼写检查器:DirectSpellChecker 。另外,一个简单的FuzzyQuery我相信,也能完成这项工作。这些方法中的任何一种都会删除 SpellChecker 算法的某些方面,从而有效地简化它,并且您可能会发现您的结果总体上会变得更糟。
注意:
- “维斯”“维斯”距离 2
- “Wiess”“见证人”距离2
- “Wiess”“无线”距离 3
- “Wiess”“Wills”距离 2
所以,实际上,这可能对你没有多大帮助。您可能可以编写一个过滤器,优先选择与查询长度相等的结果,但这无助于区分遗嘱。你可能不得不忍受的那个人。
关于c# - Lucene 拼写检查器排名建议很奇怪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13653702/