【发布时间】:2012-12-03 01:13:26
【问题描述】:
我正在实施拼写检查算法。我已经构建了一个 Trie 来存储我的单词以便快速搜索。
当传递给定的输入字符串时,我想做的是为该字符串生成潜在的删除、插入、替换和转置,编辑距离为 1。使用这个超集,我可以尝试在我的 @ 中找到这个词987654322@ 并向用户提供“您的意思是?”输入结果。
我在网上查看过,大多数解决方案都提到了计算莱文斯坦距离。仅当您已经知道这两个字符串并且想要找到两者之间的编辑距离时,这才有效。
建议?
【问题讨论】:
-
1) 你可以通过 trie-tree 遍历并计算 levenstein 距离(使用一些切割启发式)
-
嗯,不错的建议……你能补充更多吗?
-
因此,levenstein 算法可以描述为递归函数 D(i,j),它接受 (m,n) 其中 m - 第一个字符串的长度,n - 第二个字符串的长度。让修复第一个字符串并将其视为输入字符串。因此,计算 d("input","ab") 调用 d("input","a")。计算 d("input","ac") 调用 d("input","a")。看?您计算当前节点的 ldistance,遍历子节点并根据当前节点的 precalf 为他们计算 ldistance。
-
现在,关于剪切启发式。你不需要 ldistance >= 7 的词。更多:你只需要 N 个词来为用户推荐它们。对树使用某种 djkstra 算法
-
是的,您建议生成单词的所有修改。所有修改的生成都很慢。所以最好计算 trie 中所有单词的 Levenstain 距离,因为所有单词都有一些共同的前缀,并且它们的 LD 可以被缓存