Levenshtein Distance(莱文斯坦距离/编辑距离/Edit Distance):指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。
算法过程:
- ①
if(str1.length==0) return str2.length;
if(str2.length==0) return str1.length;
- ②
init (n+1)(m+1)的矩阵 d,并让第一行和列的值从 0 开始增长。
扫描两字符串(nm级的):
if str1[i] == str2,temp = 0
else temp = 1
然后 矩阵点 d[i,j] = min(d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp )
用:d[i-1,j]+1 表示增加操作,d[i,j-1]+1 表示删除操作,d[i-1,j-1]+temp 表示替换操作
- ③
扫描完后,返回矩阵的最后一个值 d[n][m]即是它们的最小编辑距离。
计算相似度公式:1-它们的距离/两个字符串长度的最大值。(最简单)
# -*- coding: utf-8 -*-
"""
Created on Tue Nov 26 16:54:05 2019
@author: HTING
"""
def edit(str1, str2):
matrix = [[i+j for j in range(len(str2) + 1)] for i in range(len(str1) + 1)]
'''
matrix = np.zeros([len(str1)+1,len(str2)+1])
for i in range(len(str1) + 1):
for j in range(len(str2) + 1):
matrix[i][j] = i+j
'''
for i in range(1,len(str1)+1):
for j in range(1,len(str2)+1):
if str1[i-1] == str2[j-1]:
d = 0
else:
d = 1
matrix[i][j] = min(matrix[i-1][j]+1,matrix[i][j-1]+1,matrix[i-1][j-1]+d)
return matrix[len(str1)][len(str2)]
test data:
>>> edit('abc','cba')
2
>>> edit("string","story")
4
>>> edit("book","block")
2