利用编辑距离的子串模糊匹配——python实现

原文链接:http://ginstrom.com/scribbles/2007/12/01/fuzzy-substring-matching-with-levenshtein-distance-in-python/

       编辑距离是模糊字符串匹配领域广为人知的一项技术。经过一些改动,编辑距离同样可以用于子串的模糊匹配。

例子:

子串:“abc”

匹配对象:“c abba c”

       直观的看出“aba”能够匹配“abba”,以下是这些字符串之间的 编辑距离:


       右下角的5就是两个字符串之间的编辑距离。这是从“aba”到“c aba c”你需要修改的次数。但是,我们可以看到由子串“abba”变为“aba”只需要一步。

       为了得到子串的模糊匹配,我们将第一行设置为0。这表示我们不在乎匹配开始前在匹配对象中跳过的步数。

       在最后一行,我们选取的不是右下角的数值,而是该行的最小值,这表示我们不在乎匹配结束后在匹配对象中跳过的步数。

1234

      我们选取最后一行的最小值,所以在此例中为1,这正是我们应该得到的值。

以下是这个算法的python实现:

def fuzzy_substring(needle, haystack):
    """Calculates the fuzzy match of needle inhaystack,
    using a modified version of the Levenshtein distance
    algorithm.
    The function is modified from the levenshtein function
    in the bktree module by Adam Hupp"""

    m, n = len(needle), len(haystack)

    # base cases
    if m == 1:
        return not needle in haystack
    if not n:
        return m

    row1 = [0] * (n+1)
    for i in range(0,m):
        row2 = [i+1]
        for j in range(0,n):
            cost = ( needle[i] != haystack[j] )

            row2.append(min(row1[j+1]+1, # deletion
                              row2[j]+1, #insertion
                              row1[j]+cost) #substitution
                          )
        row1 = row2
    return min(row1)

 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值