如何使用Trie进行拼写检查

时间:2014-01-26 17:18:39

标签: algorithm language-agnostic spell-checking trie

我有一个我用词典创建的特里。我想用它来进行拼写检查(并在字典中建议最接近的匹配,也许是对于给定数量的编辑x)。我想我会在目标单词和字典中的单词之间使用levenshtein距离,但有没有一种智能的方法可以遍历trie而不会分别在每个单词上运行编辑距离逻辑?我该如何进行遍历和编辑距离匹配?

例如,如果我有单词MAN,MANE,我应该能够在MANE中重用MAN上的编辑距离计算。否则,Trie不会用于任何目的

3 个答案:

答案 0 :(得分:6)

我认为你应该尝试bk-trees;它是一种适合拼写检查的数据结构,因为它可以让你用词典中的单词有效地计算编辑距离。

这个link可以很好地了解应用于拼写检查的BK树

答案 1 :(得分:1)

尝试为每个树节点计算一个数组A,其中A [x]是匹配目标词的前x个字母后,在trie中该位置的最小编辑距离。

如果数组中的每个元素都大于目标距离,则可以停止检查任何节点。

例如,使用包含MAN和MANE的trie和输入BANE:

Node 0 representing '', A=[0,1,2,3,4]
Node 1 representing 'M', A=[1,1,2,3,4]
Node 2 representing 'MA', A=[2,1,1,2,3]
Node 3 representing 'MAN' A=[3,2,2,1,2]
Node 4 representing 'MANE' A=[4,3,2,2,1]

A [end]的最小值是1,达到1,单词'MANE',所以这是最佳匹配。

答案 2 :(得分:0)

由于以下算法未包含转置,因此有一种聪明的方法来获取每个不完全属于Levenstein距离的元素。

假设我们具有Tree结构,则可以对树进行递归搜索。您的递归搜索假设我们从一个成本行开始,该行代表删除每个字母的成本。当我们递归搜索树时,我们所拥有的信息是

  • 您位于节点n,该节点已在Trie结构中由字母l索引。
  • 您正在考虑距单词w的距离
  • 您当前的路径假设到现在为止以前的成本行,我们希望对此进行更新以形成该节点n的新成本行。

我们要根据4种情况在您考虑的那封信中更新成本行; l是单词中的下一个字母(成本行保持不变),该字母需要插入(新成本+1),一个字母已被删除(上一步成本+1),并且该字母替换前一个单词(新费用+1)。

在您的树上沿这条路径前进的成本是这些成本中的最小值。此时,如果您在Trie结构中的某个点上定义了一个单词,请将其附加到列表中,然后假定当前成本在定义的最大成本内,则递归搜索所有子代以查找更多单词。可以在另一篇文章中找到Python的实现:

https://stackoverflow.com/a/62823597/8249836

我在C语言中也有这个用于管道。由于该算法即使在较高的编辑距离(