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

时间:2021-12-22 06:13:20

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

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

例子:

子串:“abc”

匹配对象:“c abba c”

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

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

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

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

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

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

      我们选取最后一行的最小值,所以在此例中为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)