Computer science 最小Levenshtein距离快速估计

Computer science 最小Levenshtein距离快速估计,computer-science,spell-checking,information-retrieval,Computer Science,Spell Checking,Information Retrieval,我们有基于的拼写检查器实现。由于我们无法计算所有可能替换的距离(在O(n^2)中计算的两个字符串之间的Levenshtein距离),因此我们用于检索替换的候选项 所以K-gram索引只是快速消除不相关替代的方法之一。我对其他方面也感兴趣。现在我们又耍了几招。考虑到我们只对编辑距离的替换感兴趣,不再是原始字符串的d,我们可以使用以下规则: 两个字符串之间的编辑距离不能小于它们之间的长度差。因此,长度差大于d的替换可以被消除 字符串更改中的一个字符更改/删除至少kk-grams。因此,计数差为k-

我们有基于的拼写检查器实现。由于我们无法计算所有可能替换的距离(在
O(n^2)
中计算的两个字符串之间的Levenshtein距离),因此我们用于检索替换的候选项

所以K-gram索引只是快速消除不相关替代的方法之一。我对其他方面也感兴趣。现在我们又耍了几招。考虑到我们只对编辑距离的替换感兴趣,不再是原始字符串的d,我们可以使用以下规则:

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

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

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


此外,还可以使用permuterm索引。考虑查询的所有旋转,遍历B树以查找与任何旋转匹配的任何字典项。您还可以通过在执行遍历之前省略l字符的后缀来优化此旋转方案

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


此外,还可以使用permuterm索引。考虑查询的所有旋转,遍历B树以查找与任何旋转匹配的任何字典项。在执行遍历之前,您还可以通过省略l个字符的后缀来完善此旋转方案

根据我的经验,k-gram近似法还有很多需要改进的地方(它排除了许多相关结果)

相反,将术语放在自动机/转换器中,trie甚至排序数组就足够了,并通过交叉点找到真正的levenshtein匹配项

如果你仔细想想,这是很直观的:如果你只想要距离为1的单词,而输入的术语是“foo”,那么在检查“b”节点时,检查“bar”、“baz”等就没有意义了。只有boo、bfoo等才有可能,因此您可以将搜索限制为可能导致最终状态的前缀

因此,您只需创建一个自动机,该自动机接受“foo”k编辑距离内的所有单词,然后将该自动机与您的字典自动机/trie/which相交

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


根据我的经验,k-gram近似法还有很多地方需要改进(它排除了许多相关的结果)

相反,将术语放在自动机/转换器中,trie甚至排序数组就足够了,并通过交叉点找到真正的levenshtein匹配项

如果你仔细想想,这是很直观的:如果你只想要距离为1的单词,而输入的术语是“foo”,那么在检查“b”节点时,检查“bar”、“baz”等就没有意义了。只有boo、bfoo等才有可能,因此您可以将搜索限制为可能导致最终状态的前缀

因此,您只需创建一个自动机,该自动机接受“foo”k编辑距离内的所有单词,然后将该自动机与您的字典自动机/trie/which相交

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


在permuterm搜索更多信息:)有趣。我在《信息检索导论》一书中读到了关于首字母限制的内容。有统计证据吗?还是这只是经验假设?@DenisBazhenov:我也在同一个地方读到过。看这一章的结尾。他们对这方面的论文有一些很好的建议:)。不确定是否存在一些统计证据搜索permuterm以获取更多信息:)有趣。我在《信息检索导论》一书中读到了关于首字母限制的内容。有统计证据吗?还是这只是经验假设?@DenisBazhenov:我也在同一个地方读到过。看这一章的结尾。他们对这方面的论文有一些很好的建议:)。不确定是否存在一些统计证据