通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)

[版权声明]:本文章由danvid发布于http://danvid.cnblogs.com/,如需转载或部分使用请注明出处 

  最近看到一些动态规划的东西讲到莱文斯坦距离(编辑距离)的计算,发现很多都讲的不是很清楚,比较难理解,自己思考过后重新给大家讲解一下;

  维基百科解析:莱文斯坦距离,又称Levenshtein距离,是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。允许的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten转成sitting:

sitten (k→s)
sittin  (e→i)
sitting(→g)
俄罗斯科学家弗拉基米尔·莱文斯坦在1965年提出这个概念。

  意思很好明白,这东西主要用在文本相似度匹配上就是通过这个最小距离来判断两个文本相似度情况,ES临近搜索(match_phrase)的打分也是基于这个编辑距离进行的,编辑距离越小则表示文本越接近,那么现在就是要求出最小的编辑距离。

  先给出计算公式再解析原理:

假如两个字符串分别是String A="abc"和String B="abbf"做成一个二维数组 i代表B的序号[行],j代表A的序号[列],i或者j等于0的时候代表大家都是空字符串

  0 a b c
0        
a        
b        
b        
f        

1.如果i=0或者j=0,edit(i,j)=j或者i

2.如果i&&j>=1 则edit(i,j)=min{edit(i-1,j)+1,edit(i,j-1)+1,edit(i-1,j-1)+x} 如果B[i]=A[j]相等,则x=0,否则x=1;

  其实思想就是基于上一个状态的最小距离,推出下一个的最小距离,对于两个数据A,B来说,如何找出他们的上一个状态呢,其实穷举一下就可以了假设当前状态大家都是一个字符A="a",B="a",那么他们上一个状态有以下3种情况,A="",B="a"|A="a",B=""|A="",B=""对应其实就是 edit(i-1,j)|edit(i,j-1)|edit(i-1,j-1),在表结构对应的位置就是当前位置的上|左|右上。而对于edit(i-1,j)|edit(i,j-1)这两种情况无论怎么样,他们要转换到当前状态至少都要加1的编辑距离,例如A="",B="a"变到A="a",B="a" A要增加1个编辑距离,而对于edit(i-1,j-1)如果edit(i,j)中i对应的字符等于j其实是不用增加编辑距离的,例如A="",B=""到A="a",B="a",时原本的编辑距离是0,现在还是0,但如果i,j对应的字符不相等,例如A="ab",B="ab"到A="abb",B="abc",其实是从原来的编辑距离是0,变成了1,所以最小编辑距离应该是上一个编辑距离edit(i-1,j-1)+1 ,理解这个推理就理解情况2了,理解情况2,情况1一看就知道这里不解析了,然后就可以按这个思想推出下面的表

条件1时:

  0 a b c
0 0 1 2 3
a 1      
b 2      
b 3      
f 4      

  

递推执行条件2:

  0 a b c
0 0 1 2 3
a 1 0    
b 2 1    
b 3 2    
f 4 3    
  0 a b c
0 0 1 2 3
a 1 0 1  
b 2 1 0  
b 3 2 1  
f 4 3 2  
  0 a b c
0 0 1 2 3
a 1 0 1 2
b 2 1 0 1
b 3 2 1 1
f 4 3 2 2

  看到这里如果还觉得不够清楚的话,自己对着上面的表格自己尝试一个一个计算一下最小编辑距离,随着字符的增加,你一定会发现跟上一个状态的字符编辑距离是有关系的,这里再说一点,为什么我们都是只做加1而不是加2加3,是因为假如上一个字符对的编辑距离是x,这个字符对任意一个字符的增加最多只会增加1个编辑距离,如果还理解不了还是自己对着表个去一个一个字符往上加对比就会发现规律。

  以上就是我的通俗讲解,至于代码实现我觉得大家理解了之后应该都会写,就不在这增加篇幅了,网上也很多,大家可以找找。

原文地址:https://www.cnblogs.com/danvid/p/10877231.html

时间: 2024-08-03 16:05:19

通俗解析莱文斯坦距离(Levenshtein Distance)计算原理(最小编辑距离)的相关文章

Levenshtein Distance莱文斯坦距离算法来计算字符串的相似度

转 理解起来不难,但是很实用. 核心公式就是下面:             (1) 1.百度百科介绍: Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数. 许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance. 2.用途 模糊查询 3.实现过程 a.首先是有两个字符串,这里写一个简单的 abc和abe b.将

Minimum edit distance(levenshtein distance)(最小编辑距离)初探

最小编辑距离的定义:编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten(k→s) sittin(e→i) sitting(→g) 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. Thewords `computer' and `commuter' are

java文本相似度计算(Levenshtein Distance算法(中文翻译:编辑距离算法))----代码和详解

算法代码实现: package com.util; public class SimFeatureUtil { private static int min(int one, int two, int three) { int min = one; if (two < min) { min = two; } if (three < min) { min = three; } return min; } public static int ld(String str1, String str2)

计算两组标签相似度算法——levenshtein distance 编辑距离算法

标签在数据分析中起到很重要的作用,给用户打标签,给商品打标签,给新闻打标签,好的标签可以为我们后期分析数据时提供很大的便利.有时我们需要计算两个对象之间标签的相似度.目前学习的算法是levenshtein distance 编辑距离算法. 代码示例: //标签相似度 public static double levenshtein(String s1, String s2) { System.out.println("levenshtein str1:"+s1+" str2:

字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)

在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 俄罗斯科学家V

Levenshtein distance 编辑距离算法

这几天再看 virtrual-dom,关于两个列表的对比,讲到了 Levenshtein distance 距离,周末抽空做一下总结. Levenshtein Distance 介绍 在信息理论和计算机科学中,Levenshtein 距离是用于测量两个序列之间的差异量(即编辑距离)的度量.两个字符串之间的 Levenshtein 距离定义为将一个字符串转换为另一个字符串所需的最小编辑数,允许的编辑操作是单个字符的插入,删除或替换. 例子 ‘kitten’和’sitten’之间的 Levensht

MachingLearning中的距离和相似性计算以及python实现

在机器学习中,经常要用到距离和相似性的计算公式,我么要常计算个体之间的差异大小,继而评价个人之间的差异性和相似性,最常见的就是数据分析中的相关分析,数据挖掘中的分类和聚类算法.如利用k-means进行聚类时,判断个体所属的类别,要利用距离计算公式计算个体到簇心的距离,如利用KNN进行分类时,计算个体与已知类别之间的相似性,从而判断个体所属的类别等. 文章编辑的过程中或许存在一个错误或者不合理的地方,欢迎指正. 参考:http://www.cnblogs.com/heaad/archive/201

马氏距离(Mahalanobis distance)

马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示数据的协方差距离.它是一种有效的计算两个未知样本集的相似度的方法.与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的)并且是尺度无关的(scale-invariant),即独立于测量尺度. 对于一个均值为,协方差矩阵为Σ的多变量矢量,其马氏距离为 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的

海明距离hamming distance

仔细阅读ORB的代码,发现有很多细节不是很明白,其中就有用暴力方式测试Keypoints的距离,用的是HammingLUT,上网查了才知道,hamming距离是相差位数.这样就好理解了. 我理解的HammingLUT lut; result=lut((a),(b),size_t size):result=a与b的hamming distance+size; [cpp] view plain copy print? unsigned int hamdist(unsigned int x, unsi