我有一个我用词典创建的特里。我想用它来进行拼写检查(并在字典中建议最接近的匹配,也许是对于给定数量的编辑x)。我想我会在目标单词和字典中的单词之间使用levenshtein距离,但有没有一种智能的方法可以遍历trie而不会分别在每个单词上运行编辑距离逻辑?我该如何进行遍历和编辑距离匹配?
例如,如果我有单词MAN,MANE,我应该能够在MANE中重用MAN上的编辑距离计算。否则,Trie不会用于任何目的
答案 0 :(得分:6)
答案 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结构,则可以对树进行递归搜索。您的递归搜索假设我们从一个成本行开始,该行代表删除每个字母的成本。当我们递归搜索树时,我们所拥有的信息是
我们要根据4种情况在您考虑的那封信中更新成本行; l是单词中的下一个字母(成本行保持不变),该字母需要插入(新成本+1),一个字母已被删除(上一步成本+1),并且该字母替换前一个单词(新费用+1)。
在您的树上沿这条路径前进的成本是这些成本中的最小值。此时,如果您在Trie结构中的某个点上定义了一个单词,请将其附加到列表中,然后假定当前成本在定义的最大成本内,则递归搜索所有子代以查找更多单词。可以在另一篇文章中找到Python的实现:
https://stackoverflow.com/a/62823597/8249836
我在C语言中也有这个用于管道。由于该算法即使在较高的编辑距离(