Python Levenstein距离子串

Python Levenstein距离子串,python,levenshtein-distance,Python,Levenshtein Distance,有没有一种好方法可以使用levenstein距离将一个特定字符串与第二个较长字符串中的任何区域进行匹配 例如: str1='aaaaa' str2='bbbbbbaabaabbbb' if str1 in str2 with a distance < 2: return True str1='aaaaa' str2='bbbbbb aabbbbbb' 如果str1位于距离小于2的str2中: 返回真值 因此,在上面的示例中,字符串2的一部分是aabaa和distance(st

有没有一种好方法可以使用levenstein距离将一个特定字符串与第二个较长字符串中的任何区域进行匹配

例如:

str1='aaaaa'
str2='bbbbbbaabaabbbb'

if str1 in str2 with a distance < 2:
    return True
str1='aaaaa'
str2='bbbbbb aabbbbbb'
如果str1位于距离小于2的str2中:
返回真值
因此,在上面的示例中,字符串2的一部分是
aabaa
distance(str1,str2)<2
,因此语句应该返回
True


我能想到的唯一方法是一次从str2中取出5个字符,与str1进行比较,然后在str2中重复这个过程。不幸的是,这似乎效率很低,我需要以这种方式处理大量数据。

技巧通常是使用插入(较短)或删除(较长)成本。你也可以考虑使用DaMaul-LevsTein。
诀窍是生成所有长度适当的
b
子字符串,然后比较每个子字符串

def lev_dist(a,b):
    length_cost = abs(len(a) - len(b))
    diff_cost = sum(1 for (aa, bb) in zip(a,b) if aa != bb)
    return diff_cost + length_cost

def all_substr_of_length(n, s):
    if n > len(s):
        return [s]
    else:
        return [s[i:i+n] for i in range(0, len(s)-n+1)]

def lev_substr(a, b):
    """Gives minimum lev distance of all substrings of b and
    the single string a.
    """

    return min(lev_dist(a, bb) for bb in all_substr_of_length(len(a), b))

if lev_substr(str1, str2) < 2:
    # it works!
def lev_dist(a、b):
长度成本=abs(长度(a)-长度(b))
差异成本=总和(如果aa!=bb,则拉链(a,b)中的(aa,bb)为1)
返回差异成本+长度成本
定义长度(n,s)的所有子项:
如果n>len(s):
返回[s]
其他:
为范围(0,len(s)-n+1)内的i返回[s[i:i+n]
def lev_substr(a、b):
“”“给出b和的所有子串的最小lev距离
单字符串a。
"""
返回最小值(所有长度(len(a),b))中bb的水平距离(a,bb))
如果级别substr(str1、str2)<2:
#它起作用了!

您可以看看支持模糊匹配的:

>>> import regex
>>> regex.search("(aaaaa){s<2}", 'bbbbbbaabaabbbb')
<regex.Match object; span=(6, 11), match='aabaa', fuzzy_counts=(1, 0, 0)>
导入正则表达式
>>>正则表达式搜索(“(aaaaa){sLevenstein距离,仅用于
str2
的5个长度的子字符串或所有子字符串(例如,较短的4个字符和较长的6个字符,其Levenstein距离可能为1)?@Mr.Xcoder这是我的想法,但我需要处理每行10GB的文件,我认为这会非常慢。所以只有5个长度的子字符串?@Mr.Xcoder是的,我可以试试看它有多慢。为了好玩,我在Haskell中实现了这个
str1='aaaaa'
str2='bbbbbbaabaabbbb'
for s in [str2[i:i+len(str1)] for i in range(0,len(str2)-len(str1)+1)]:
    if sum(a!=b for a,b in zip(str1,s))<2:
        print s    # prints 'aabaa'