最小Levenshtein距离快速估计

时间:2011-10-28 00:04:42

标签: computer-science spell-checking information-retrieval

我们有基于Levenshtein distance的拼写检查程序实现。由于我们无法计算所有可能替换的距离(在O(n^2)中计算的两个字符串之间的Levenshtein距离),我们使用K-gram index来检索候选替换。

因此,K-gram指数只是快速消除无关替代的方法之一。我也对其他方式感兴趣。目前我们使用了更多技巧。考虑到我们只对编辑距离的替换感兴趣,不再使用原始字符串中的 d ,我们可以使用以下规则:

  • 两个字符串之间的编辑距离不能小于它们之间的长度差异。因此可以消除长度差大于 d 的替换;
  • 字符串中的一个字符更改/删除至少 k k-gram。因此,计数差异为k-gram k * d的字符串的编辑距离不能小于 d

这些假设是否正确?还有哪些替代消除方法适用于拼写检查?

2 个答案:

答案 0 :(得分:1)

您可以使用简单规则将搜索限制为以与查询字符串相同的字母开头的字典术语。希望用户不要拼错第一个字母。

此外,您可以使用permuterm索引。考虑查询的所有旋转并遍历B树以查找与任何旋转匹配的任何字典术语。您还可以通过在执行遍历

之前省略l个字符的后缀来优化此轮换方案

答案 1 :(得分:0)

根据我的经验,k-gram近似值得期待(它排除了许多相关结果)。

而是将你的术语放在自动机/换能器中,trie,甚至排序的数组就足够了,并通过交叉找到真正的levenshtein匹配。

如果你想一想它是直观的:如果你只想要距离为1的单词,而输入术语是“foo”,那么在检查'b'时检查“bar”,“baz”等是没有意义的'节点。只有boo,bfoo等有机会,所以你可以将搜索限制为只有可能导致最终状态的前缀。

所以你只需要创建一个自动机,它接受“foo”的k个编辑距离内的所有单词,然后将这个自动机与你的词典自动机/ trie /无论如何相交。

您可以非常有效地计算这些这些DFA,避免任何缓慢的NFA-DFA确定等:

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.652