编辑距离算法用于判定两个字符串对象之间的相似度。如str1=qingzhiyu str2=pingzhiyu str3=abngzhiyu三个字符串对象。str2变为str1只需要经过一次更新操作来将p更新为q即可,而str3变为str1则需要执行两次更新操作来将a、b分别更新为q、i才可。
在编辑距离算法当中定义了三种基本的操作(insert、delete、substitution),任意一个字符串变为另一个字符串对象的时候都可以经过若干步基本操作变为目标字符串对象。
因此变化的次数越多,则表明两个字符对象之间的相似度越低,所以可以通过变幻次数来判定任意两个字符串的相似度。
原理:
假设有两个字符串对象str1=XYZ、str2=XXE 。通过编辑距离矩阵的计算来说明算法原理:
如上图所示行从左往右代表字符XYZ,列从上往下代表字符串对象XXE。最上边一行是Excel表格请自动忽略。0代表为空字符串。接下来对第一行表格数据进行填充:
接下来对第一列进行填充:
对第二行进行填充:
依次类推对第三行第四行进行填充:
再举一个例子:
EG判断字符串bxlqing和字符串zhangxia之间的相似度:
由图中矩阵可知由字符串qingzhiyu变为字符串zhangxia需要经过7次变化才能得到。
接下来是代码实现:
if __name__ == '__main__':
str1 = "zhangxia"
str2 = "qingzhiyu"
col = len(str1)
row = len(str2)
# X for j in range(row+1)代表的含义为
# 先执行for循环,然后再每一个循环当中执行X表达式
# 所以 0*i for i in range(col+1)]for j in range(row+1)
# 等价于for j in range(row+1)
# 0 * i for i in range(col+1)]
# 等价于for j in range(row+1)
# i for i in range(col+1)]
# array[i][j]=i*0
# 进行而已举证的初始化操作
array1 = [[0 * i for i in range(col + 1)] for j in range(row + 1)]
# 为二维矩阵进行赋值操作。对矩阵的第一列和第一行进行赋值操作
for i in range(1, row + 1):
array1[i][0] = array1[i - 1][0] + 1 # 第一列每一行的值为上一行的值加1
for j in range(1, col + 1):
array1[0][j] = array1[0][j - 1] + 1 # 第一行的每一列为前一列的值加1
for line in array1:
print(line)
# 接下来对初始化好的矩阵对象进行初始化赋值操作
for i in range(1, row+1):
for j in range(1, col+1):
if(str2[i-1]==str1[j-1]):
# print(str2[i])
#print(i,j)
array1[i][j]=array1[i-1][j-1]#选取当前数组对象左上角的值赋值到当前元素当中
else:#当当前的两个字符对象不相等的时候选取
array1[i][j]=min(array1[i-1][j],array1[i-1][j-1],array1[i][j-1])+1;
print("编辑距离矩阵为:")
for line in array1:
print(line)
# print(array1[9][8])
print("字符串对象"+str2+"变为字符串对象”+str1+“一共需要经过",array1[9][8],"步。")
程序运行结果:
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[1, 0, 0, 0, 0, 0, 0, 0, 0]
[2, 0, 0, 0, 0, 0, 0, 0, 0]
[3, 0, 0, 0, 0, 0, 0, 0, 0]
[4, 0, 0, 0, 0, 0, 0, 0, 0]
[5, 0, 0, 0, 0, 0, 0, 0, 0]
[6, 0, 0, 0, 0, 0, 0, 0, 0]
[7, 0, 0, 0, 0, 0, 0, 0, 0]
[8, 0, 0, 0, 0, 0, 0, 0, 0]
[9, 0, 0, 0, 0, 0, 0, 0, 0]
编辑距离矩阵为:
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[1, 1, 2, 3, 4, 5, 6, 7, 8]
[2, 2, 2, 3, 4, 5, 6, 6, 7]
[3, 3, 3, 3, 3, 4, 5, 6, 7]
[4, 4, 4, 4, 4, 3, 4, 5, 6]
[5, 4, 5, 5, 5, 4, 4, 5, 6]
[6, 5, 4, 5, 6, 5, 5, 5, 6]
[7, 6, 5, 5, 6, 6, 6, 5, 6]
[8, 7, 6, 6, 6, 7, 7, 6, 6]
[9, 8, 7, 7, 7, 7, 8, 7, 7]
字符串对象qingzhiyu变为字符串对象”+str1+“一共需要经过 7 步。