python - 在 python 中实现 Levenshtein 距离

标签 python levenshtein-distance

我已经实现了算法,但现在我想找到与其他字符串的编辑距离最短的字符串的编辑距离。

算法如下:

def lev(s1, s2):
    return min(lev(a[1:], b[1:])+(a[0] != b[0]), lev(a[1:], b)+1, lev(a, b[1:])+1)

最佳答案

您的“实现”有几个缺陷:

(1) 它应该以def lev(a, b):开头,而不是def lev(s1, s2):。请养成以下良好习惯:(a) 在提出问题之前运行您的代码 (b) 引用您实际运行的代码(通过复制/粘贴,而不是通过(容易出错的)重新键入)。

(2) 无终止条件;对于任何参数,它最终都会尝试评估 lev("", "") 如果不是 Python 实现限制,它将永远循环:RuntimeError: maximum recursion depth exceeded.

你需要插入两行:

if not a: return len(b)
if not b: return len(a)

让它发挥作用。

(3) Levenshtein 距离是定义递归的。没有“唯一”(唯一)算法这样的东西。递归代码很少出现在类之外,而且只能以“稻草人”的身份出现。

(4) 朴素的实现所花费的时间和内存与 len(a) * len(b) 成正比……这些字符串通常不是比 4 到 8 长一点吗?

(5) 你极其天真的实现更糟糕,因为它复制了输入的切片。

您可以在网络上找到工作 不是很天真的实现 ... google("levenshtein python") ...寻找那些使用 O(max(len( a), len(b))) 额外内存。

你问的是什么(“与其他字符串的编辑距离最短的字符串的编辑距离。”)没有意义......“THE string”??? “探戈需要两个人”:-)

您可能想要的(找到集合中具有最小距离的所有字符串对),或者可能只是那个最小距离,是一个简单的编程练习。你试过什么?

顺便说一句,通过简单的算法找到这些对将需要执行 O(N ** 2) 次 lev(),其中 N 是集合中字符串的数量...如果这个是真实世界的应用程序,您应该使用经过验证的代码而不是尝试自己编写。如果这是家庭作业,你应该这么说。

关于python - 在 python 中实现 Levenshtein 距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4173579/

相关文章:

python - numpy 矩阵乘法简化 - 这可能吗?

python - 无法将 Python 3.5 配置为在 Windows 上使用 Visual C++ 编译器

python - 在Python中从左到右匹配两个包含相同单词的字符串

algorithm - 除了 Levenshtein 之外,用于有序词集和后续聚类的更好的距离度量

levenshtein-distance - Levenshtein和Trigram的替代品

java - 最短编辑距离?我需要它吗?

python - 根据 Dataframe 中的项目生成唯一的可能组合

python - 如何在 paramiko 连接中临时添加 host_key

python - Numpy 复数数组乘法给出不支持的操作数类型

objective-c - 将多个单词名称与 Levenshtein 距离进行比较