介绍
编辑距离(Edit Distance)的作用主要是用来比较两个字符串的相似度的,主要是指在两个字符串之间,由一个转成另一个所需的最少操作次数,如果它们的编辑距离越大,说明它们越是不同。可用的编辑操作包括字符替换,插入,删除这三种。
具体步骤:
- 第一步,我们先创建一个矩阵(二维数组),假设有两个字符串,长度分别是m和n,那矩阵的维度就应该是(m+1)*(n+1),初始化:第一行和第一列分别是该矩阵的行号和列号,其他位置的元素值都是0。
- 第二步,我们分别使用d[i-1,j]+1 来表示增加操作,d[i,j-1]+1 来表示删除操作操作,d[i-1,j-1]+cost 来表示替换操作。
- 第三步,遍历矩阵中的所有数值,通过if语句进行判断,不断更新矩阵元素值。最后设计输出结果,取这三种操作d[i,j]=min(d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+cost)中的最小值作为两个字符串之间的最少编辑操作次数。
- 第四步,计算并输出两者之间的相似度:1-d/MAX(str1,str2),结束。
习题:
1、分别输入词项input和insert,计算编辑距离
def minEditDist(sm, sn):
m, n = len(sm) + 1, len(sn) + 1
len1 = len(sm) # len1计算相似度使用
if len(sm) < len(sn):
len1 = len(sn)
# create a matrix (m*n) 矩阵
matrix = [[0] * n for i in range(m)]
matrix[0][0] = 0 # 初始化矩阵
#
for i in range(1, m):
matrix[i][0] = matrix[i - 1][0] + 1 # 每行的首列初始化为本行的行号
for j in range(1, n):
matrix[0][j] = matrix[0][j - 1] + 1 # 每列的首行初始化为本列的列号
for i in range(m):
print(matrix[i]) # 展示初始化后的矩阵
print("**********开始计算**********")
for i in range(1, m):
for j in range(1, n): # 遍历矩阵中的所有数值(i为行,j为列)
if sm[i - 1] == sn[j - 1]: # 如果这个位置的字符相同,cost赋值为 0
cost = 0
else:
cost = 1 # 该位置的字符不同,cost赋值为 1
matrix[i][j] = min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost)
# print("按行进行计算结果是:\n",matrix[i], '\n')
for i in range(m): # 输出计算之后的结果
print(matrix[i])
print(1-matrix[m-1][n-1]/len1) # 输出相似度
return matrix[m - 1][n - 1] # 返回最终的编辑距离
if __name__ == '__main__':
ABC1 = input("input是:")
ABC2 = input("insert是:")
mindist = minEditDist(ABC1, ABC2)
print("二者的编辑距离是:", mindist)
2、分别输入词项solution和source,计算编辑距离
def minEditDist(sm, sn):
m, n = len(sm) + 1, len(sn) + 1
len1 = len(sm) # len1计算相似度使用
if len(sm) < len(sn):
len1 = len(sn)
# create a matrix (m*n) 矩阵
matrix = [[0] * n for i in range(m)]
matrix[0][0] = 0 # 初始化矩阵
#
for i in range(1, m):
matrix[i][0] = matrix[i - 1][0] + 1 # 每行的首列初始化为本行的行号
for j in range(1, n):
matrix[0][j] = matrix[0][j - 1] + 1 # 每列的首行初始化为本列的列号
for i in range(m):
print(matrix[i]) # 展示初始化后的矩阵
print("**********开始计算**********")
for i in range(1, m):
for j in range(1, n): # 遍历矩阵中的所有数值(i为行,j为列)
if sm[i - 1] == sn[j - 1]: # 如果这个位置的字符相同,cost赋值为 0
cost = 0
else:
cost = 1 # 该位置的字符不同,cost赋值为 1
matrix[i][j] = min(matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j - 1] + cost)
# print("按行进行计算结果是:\n",matrix[i], '\n')
for i in range(m): # 输出计算之后的结果
print(matrix[i])
print(1-matrix[m-1][n-1]/len1) # 输出相似度
return matrix[m - 1][n - 1] # 返回最终的编辑距离
if __name__ == '__main__':
ABC1 = input("solution是:")
ABC2 = input("source是:")
mindist = minEditDist(ABC1, ABC2)
print("二者的编辑距离是:", mindist)