我是靠谱客的博主 激动帽子,最近开发中收集的这篇文章主要介绍编辑距离——莱文斯坦距离1.编辑距离2.莱文斯坦距离,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

最后

以上就是激动帽子为你收集整理的编辑距离——莱文斯坦距离1.编辑距离2.莱文斯坦距离的全部内容,希望文章能够帮你解决编辑距离——莱文斯坦距离1.编辑距离2.莱文斯坦距离所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部