Levenshtein Distance (LD) 算法

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 开始增长。
扫描两字符串(n
m级的):

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

发布了26 篇原创文章 · 获赞 3 · 访问量 1395

猜你喜欢

转载自blog.csdn.net/qq_42937176/article/details/103548117