Java 拼写纠正算法

Java 拼写纠正算法,java,algorithm,solr,lucene,spell-checking,Java,Algorithm,Solr,Lucene,Spell Checking,这也是通用算法的内容,所以如果您在文本中看到solr,请不要停止阅读(请跳过前3行) 在Solr中,对于拼写检查组件,我设置extendedResults以获得正确单词的频率,然后选择频率最佳的单词。我了解基于编辑距离的拼写检查算法。例如: 查询Solr:Marien 返回的拼写检查文本:Marine(频率:120)、Market(频率:900)和其他。我的字典是根据索引词编的 所以我选择了市场(更多的频率),但这是错误的,因为我的意图是海洋。两者的编辑距离均为2 现在,我如何改进这个算法来选择

这也是通用算法的内容,所以如果您在文本中看到solr,请不要停止阅读(请跳过前3行)

在Solr中,对于拼写检查组件,我设置extendedResults以获得正确单词的频率,然后选择频率最佳的单词。我了解基于编辑距离的拼写检查算法。例如:

查询Solr:Marien

返回的拼写检查文本:Marine(频率:120)、Market(频率:900)和其他。我的字典是根据索引词编的

所以我选择了市场(更多的频率),但这是错误的,因为我的意图是海洋。两者的编辑距离均为2

现在,我如何改进这个算法来选择marine而不是market(基于编辑距离和频率以外的内容)

我是否也必须合并一些“soundex”算法

我正在寻找简单的东西,我可以快速实现


我甚至尝试使用彼得·诺维格的拼写纠正算法(这很好),但我还是遇到了同样的问题。

所有这些都是排名问题。您需要做的是创建一个方法,该方法将接收多个信号&使用一些公式来强调每个单词的重要性。在用户输入并获取单词后,ranker将出现在图片中。在这个阶段,你需要对你的结果进行排序,而这正是排名的关键所在


现在来解决您的具体问题。假设你的排名函数只需要2个信号(频率和声音)。如果你想要
marine
而不是
market
的话,你需要做的就是给soundex信号赋予更多的权重,而给频率赋予更少的权重(比如70/30)。这些重量可以根据试验和错误进行温度调整,也可以通过机器学习。这样,在其他情况下准确的单词出现频率并没有被完全忽略,它仍然有一定的发言权

在这种特殊情况下,您可以通过使用一个识别换位的度量来改进结果——“marien”与“marine”的不同之处在于两个换位,但只有一个换位,因此如果您这样做,它似乎比“market”更接近


经典的Levenshtein编辑距离度量只处理插入、删除和替换。不过,它也处理换位。

我在编辑距离+换位的基础上使用了soundex/变音算法,效果很好。

添加soundex对我来说很好。对于一个给定的单词,如果你找到一个好的“soundex”,那么就向用户建议。如果没有,请继续使用另外两个变量:频率和距离。谢谢您的回答!我知道这是排名问题。我特别问soundex是否会改进我的拼写检查算法,或者我是否可以使用其他技术来改进它。我想你们在这里谈论的是“学习排名”的东西,在这种情况下,这并不是真正需要的+1.