java中的拼写检查解决方案

时间:2012-03-15 21:52:30

标签: java nlp

我需要在java中实现一个拼写检查器,让我给你一个字符串的例子让我们说“sch aproblm iseasili solve”我的输出是“这样的问题很容易解决”。字符串的最大长度要纠正你可以看到我的字符串可以在错误的地方插入空格,或者根本不插入拼写错误的单词。我需要一些帮助来找到一个有效的算法来提出纠正后的字符串。我目前正在尝试删除我的字符串中的所有空格并在每个可能的位置插入空格,所以让我们说这个单词(它也适用于一个句子)“hot”我生成下一个可能的字符串到后面的字逐字逐句地纠正使用levenshtein距离:热; ot;浩热。如您所见,我已经生成了2 ^(string.length() - 1)个可能的字符串。因此,对于长度为64的字符串,它将生成2 ^ 63个可能的字符串,这是非常高的,之后我需要逐个处理它们并通过一组不同的参数选择最佳的字符串,例如: - 总编辑距离(必须采取最小的一个) - 如果我有更多具有相同编辑距离的字符串,我必须选择具有较少字数的字符串 - 如果我有更多字符串,单词数量相同,我需要选择具有单词最大频率的单词(我有一个最频繁的8000字的字典及其频率) - 最后如果有更多的字符串具有相同的总频率,我必须采用最小的字典字符串。

所以基本上我生成所有可能的字符串(在所有可能的位置插入原始字符串中的空格),然后逐个计算它们的总编辑距离,nr的单词等。然后选择最佳的一个,并输出更正后的字符串。我想知道是否有更简单的(在效率方面)这样做的方式,比如不必生成所有可能的字符串组合等。

编辑:所以我认为我应该采取另一种方法。这就是我的想法:我从我的字符串中取出第一个字母,并从字典中提取所有以该字母开头的单词。我处理所有这些并从我的字符串中提取所有可能的第一个单词。我将继续我之前的例子,因为“热”这个词通过生成所有可能的组合我得到了4个结果,但是使用我的新算法我只获得2个“热”和“ho”,所以它已经是一个改进。虽然我在创建递归或PD算法时需要一些帮助。我需要一种方法来存储第一个单词的所有可能的字符串,然后为所有这些可能的字符串存储第二个单词,依此类推,最后连接所有可能性并将它们添加到数组或其他内容中。对于大型字符串,仍然会有很多组合,但不会像所有这些组合那样多。有人可以帮助我使用伪代码或其他东西,因为这不是我的强项。

EDIT2:这是我从我的字符串http://pastebin.com/d5AtZcth生成所有可能的第一个单词的代码。我需要以某种方式实现它来为其余部分执行相同的操作并将每个第一个单词与每个第二个单词组合在一起等等,并将所有这些连接成一个数组或其他东西。

1 个答案:

答案 0 :(得分:3)

为您提供一些提示:

  1. 尝试纠正字符串的一小部分,而不是一次性纠正所有内容。

  2. 90%的错误(IIRC)距离来源有1个编辑距离。

  3. 您可以使用语音索引将单词与听起来相似的单词进行匹配。

  4. 你可以假设大多数拼写错误是QWERTY错误(j => k,h => g),并尝试先检查它们。

  5. 在这篇好文章中可以找到更多的想法:

    http://norvig.com/spell-correct.html