我正在设计一个很酷的拼写检查程序(我知道我知道,现代浏览器已经有了这个),无论如何,我想知道开发一个相当简单但体面的建议字算法需要付出多少努力。
我的想法是,我首先会查看拼写错误的单词的字符,并计算字典中每个单词匹配的字符数量(声音资源密集),然后选择前5个匹配项(如果拼写错误的单词匹配字典中包含7个单词的大多数字符,它会随机显示其中5个单词作为建议的拼写单词。
显然,为了获得更高级,我们会查看“常用词”并使用一个字典文件,该文件的编号为“英语中使用该词的频率”排名。我认为这有点过分了。
你怎么看?有人有这方面的想法吗?答案 0 :(得分:2)
首先,你必须考虑到找到拼写错误的单词“更近”的单词的复杂性。我看到你正在使用字典,也许是哈希表。但这可能还不够。这里最好和最酷的解决方案是采用TRIE数据结构。找到这些所谓的更接近的单词的复杂性将采用线性顺序时序,并且很容易耗尽树。
一个小例子
单词“njce”。这是1级示例,其中一个单词拼写错误。预计明显的建议会很好。第一步非常明显,看这个单词是否出现在字典中。使用TRIE的搜索功能,这可以在O(1)时间内完成,类似于字典。较冷的部分正在寻找建议。你显然不得不把所有以'a'开头的单词排成'z',这些单词有像ajce bjce cjce upto zjce这样的单词。现在找到这种类型的出现再次是线性的,具体取决于字符数。你不应该将这个数字乘以26的单词长度。由于TRIE随着长度的增长而立即减少。回到这个问题。一旦完成搜索但未找到结果,则转到下一个字符。现在你将寻找nace nbce ncce upto nzce。事实上,您不会探索所有组合,因为TRIE数据结构本身不会具有中间字符。也许它不会有任何字符,搜索空间变得非常简单。更进一步的事件也是如此。您可以根据二阶和三阶匹配进一步发展这一概念。希望这有帮助。
答案 1 :(得分:0)
我不确定你要重新发明多少轮子,所以你可能想看看Lucene。
Apache Lucene Core™(以前称为Lucene Java)是我们的旗舰子项目,它提供基于Java的索引和搜索实现,以及拼写检查,命中突出显示和高级分析/标记化功能。