拼写检查算法如何优化搜索建议的单词?

时间:2015-03-31 14:07:28

标签: algorithm dictionary spell-checking

根据我的理解,拼写检查算法通过检查转换的数量(交换字母,添加字母,删除字母等)来寻找建议。给定的单词需要成为字典中的一个或多个真实单词。我知道他们也会关注背景,但是现在让我们把它排除在外。

如果在适当的位置添加1个字母,我想看看overflw这个词在字典中是否会像一个单词。我能看到完成的唯一方法就是蛮力:检查是否每个

aoverflw
boverflw
coverflw
.
.
.
overflnw
overflow
overflpw
.
.
overflwy
overflwz

是字典中的一个单词。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

你的假设是拼写检查器有一个只能告诉你字典中是否存在单词的字典。但是在大多数拼写检查器中,字典被实现为某种类型的trie,通常是directed acyclic word graph(DAWG)。这是一个比具有是/否查找功能的简单字典更通用的数据结构。

实现方式各不相同,但从概念上讲,您可以在字典中查找单词的搜索,其中单词的第一个字符从单词的第一个字符开始,并从DAWG的根目录中获取该节点。该节点包含以下所有字母的条目等。如果您重复这样做,您最终会得到以下其中一种可能性:

  1. 您在树中遇到了一个叶子节点,并且您在该单词的末尾。如果这是真的,你就知道字典中存在这个词。
  2. 您遇到了一个叶节点,但该单词中还有字母。想象一下,如果文档中的单词是“fatx”。您已到达树中的叶节点“t”,但您的单词中仍然留有“x”。
  3. 你到达了这个词的结尾,但你不在叶子节点。例如,文档中的单词是“overfl”。
  4. 您在非叶子节点上遇到无法识别的字母。例如,这个词是“overfdow”。你在树的'f'节点,字符'd'不在'f'后面的字母列表中。
  5. 在最后三种情况下,您知道您在树中的节点,并且您知道可以生成哪些字母(以及哪些字段)。例如,你有“overflw”。树中的'l'节点表示'l'后面的可能字符是'e'(overlelew),'o'(溢出,溢出等)和'y'(overfly)。如果您想对可能性进行详尽的搜索以提出建议,则不必尝试使用字母表中的每个字母。所有你必须尝试的是字典知道的字母跟随“overfl”。在这种情况下无需检查'q',因为我们已经知道它不可能匹配。

    基本思想是字典数据结构(trie)包括搜索行为。或者,替代地,依赖于数据结构的代码具有对如何实现trie的深入了解。这样可以更快地寻找建议,但我不会说它特别容易。

    你可以做的另一件事是加快搜索速度,创建另一个具有相反顺序的单词。如果您想查找缺少前几个字符的单词的建议,这将非常有用。例如,如果有人输入“elpful”,你会想要“有用”的建议。您可以搜索每个第一级节点,寻找“aelpful”,“belpful”等。但反向DAWG将以'l'开头并生成“lufple”...然后看到'h'可以跟随,并建议“有用”。当缺少单词的第2个或第3个字母时,这种类型的东西非常有用。

    基本上,使用DAWG可以轻松查找后缀。寻找前缀在计算上是昂贵的。但是如果你创建一个具有相同单词的DAWG,只有向后,那么前缀搜索就像后缀搜索一样有效。