python - 如何找到与其他 2 个字符串相似的字符串(就 Levenshtein 距离而言)?

标签 python string similarity levenshtein-distance

假设我有 2 个非常相似的字符串。我想找到在 Levenshtein 距离方面接近 s1 和 s2 的其他字符串。

import Levenshtein
s1 = 'aaabbbccc'
s2 = 'abacbbbccde'
dist = Levenshtein.distance(s1, s2)
print(dist)
mid_str = get_avg_string(s1, s2)
什么可以有效实现功能:
def get_avg_string(s1, s2):
    return ''
我需要这个变量:
sum_lev = Levenshtein.distance(s1, mid_str) + Levenshtein.distance(s2, mid_str)
diff_lev = abs(Levenshtein.distance(s1, mid_str) - Levenshtein.distance(s2, mid_str)
最小(我认为 sum_lev 将等于 distdiff_lev <= 1 )。

最佳答案

恐怕你所要求的是不可能的,因为问题是 NP-hard。我将尝试概述为什么会出现这种情况的一些关键概念,但我鼓励您查找中心弦和斯坦纳弦。
假设您有一组称为 S 的字符串。最佳 Steiner 字符串是一个字符串,它使 S 中每个字符串与其自身的距离之和最小(也称为共识错误)。这对应于您称为 sum_lev 的第一个属性.最佳 Steiner String 通常是不明确的,并且不是原始集合 S 的一部分(但不一定是)。
您面临的问题是没有有效的方法来计算最佳 Steiner 弦。即使您设法限制您的搜索空间,您仍然会有指数数量的候选人。因此,问题是 NP 难的。
可以证明 S 总是包含一个字符串,它是最优 Steiner 字符串的合理近似。因此,即使您只关注您的两个属性中的第一个,您拥有的最佳镜头也是简单地选择一个原始字符串。由于您显然只处理两个字符串,因此选择哪一个都无关紧要。
TL;博士
总而言之,您正在处理一个无法有效解决而只能近似解决的 NP 难题。如果您只处理两个字符串,则可以使用给定字符串之一来近似您要查找的字符串。很抱歉,这可能不是您希望的答案,但希望它仍然有些帮助。

关于python - 如何找到与其他 2 个字符串相似的字符串(就 Levenshtein 距离而言)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66686950/

相关文章:

python - Tensorflow - 检索字符串张量中的每个字符

用 strstr 不行吗?

python - 如何在python中分隔符的第一个实例上拆分字符串

r - Jaccard 在 R 中使用 for 循环实现字符串之间的相似度

algorithm - 计算绘制线之间的相似度

python - 在 python 中使用 BeautifulSoup 时出错 : ValueError: invalid literal for int() with base 10: 'xBB'

python - 使用一个 PDE 的解来定义另一个 PDE - FEniCS

python - 如何按两个变量分组的条形图

c# - 将 16 位字符串拆分为 4 个部分并将它们存储在 C# 中的数组中

python - 2 个数据框列之间的相似性