编辑距离——莱文斯坦距离

1.编辑距离

1.1简介

编辑距离是针对二个字符串(例如英文字)的差异程度的量化量测,量测方式是看至少需要多少次的处理才能将一个字符串变成另一个字符串。

1.2应用

  • 自然语言处理:如拼写检查可以根据一个拼错的字和其他正确的字的编辑距离,判断哪一个(或哪几个)是比较可能的字。
  • 生物信息学:DNA也可以视为用A、C、G和T组成的字符串,编辑距离可以用来判断二个DNA的类似程度。
  • Unix下的diff及patch即是利用编辑距离来进行文本编辑对比的例子

1.3分类

  • 最长公共子序列距离(Longest Common Subsequence):只允许删除、加入子元
  • Jaro距离:只允许字符转置
  • 汉明距离(Hamming distance):只允许取代字元
  • 莱文斯坦距离(Levenshtein distance):可替换、插入、删除

2.莱文斯坦距离

2.1简介

莱文斯坦距离,由俄罗斯科学家弗拉基米尔·莱文斯坦在1965年提出。指两个字串之间,由一个转成另一个所需的最少编辑操作次数,允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

2.2代码实现

动态规划

def editDistance(str1, str2):
    m, n = len(str1), len(str2)
    # 状态空间:dp[i][j]表示长度为i的str1和长度为j的str2的最小编辑距离
    dp = [[i + j for i in range(n + 1)] for j in range(m + 1)]
    # 初始条件
    dp[0][0] = 0
    for i in range(1, m + 1):
        for j in range(1, n + 1):
            d = 0 if str1[i - 1] == str2[j - 1] else 1
            # 转移方程
            dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + d)
    return dp[-1][-1]
print(editDistance("a cat"*10, "the cats"*10))    # 40

递归
昨天看了斯坦福大学人工智能原理技术第1课:概述,讲述了莱文斯坦编辑距离

def computeEditDistance(s, t):
    cache = {}
    def recurse(m, n):
        """
        Return the minimum edit distance between:
        - first m letters of s
        - first n letters of t
        """
        if (m, n) in cache:
            return cache[(m, n)]
        if m == 0:  # Base case
            result = n
        elif n == 0:    # Base case
            result = m
        elif s[m - 1] == t[n - 1]:  # Last letter matches
            result = recurse(m - 1, n - 1)
        else:
            subCost = 1 + recurse(m - 1, n - 1)
            delCost = 1 + recurse(m - 1, n)
            insCost = 1 + recurse(m, n - 1)
            result = min(subCost, delCost, insCost)
        cache[(m, n)] = result
        return result
    return recurse(len(s), len(t))
print(computeEditDistance("a cat"*10, "the cats"*10))    # 40
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值