最近由于工作需要,接触了编辑距离(Levenshtein Distance)算法。赶脚很有意思。最初百度了一些文章,但讲的都不是很好,读起来感觉似懂非懂。最后还是用google找到了一些资料才慢慢理解。当我完全理解的时就想把自己探索时遇到的“坑”总结起来,为后人“乘凉”。于是就有了这篇博文。

下面先来看一下他的定义:
   编辑距离就是用来计算从原串(s)转换到目标串(t)所需要的最少的插入、删除和替换
的数目,在NLP中应用比较广泛,如一些评测方法中就用到了(wer,mWer等),同时也常用来计算你对原文本所作的改动数。编辑距离的算法是首先由俄国科学家Levenshtein提出的,故又叫Levenshtein Distance。 
    Levenshtein Distance算法可以看作动态规划。它的思路就是从两个字符串的左边开始比较,记录已经比较过的子串相似度(实际上叫做距离),然后进一步得到下一个 字符位置时的相似度。比如:字符串intention变成execution需要进行下面的操作

如上图所示,d(deletion)代表删除操作,s(substitution)代表替换操作,i(insertion)代表插入操作。这里每种操作的cost为1,那么它的ED(Edit Distance)=5。

代码实现:

挖坑&填坑:
1、为什么要初始化第一行和第一列的值?
答:上面代码初始化后矩阵的结构如下:

    i n t e n t i o n
  0 1 2 3 4 5 6 7 8 9
e 1                  
x 2                  
e 3                  
c 4                  
u 5                  
t 6                  
i 7                  
o 8                  
n 9                  

从上面可以看出,第一行的值表示s2的距离,第一列的值表示s1的距离

2、matrix[i - 1, j] 、matrix[i, j - 1]、matrix[i - 1, j - 1] 分别表示啥?它们为啥都加1,而这个1又表示啥?
答:

根据编辑距离的概念可知,所需要最少的的插入、删除和替换的数目就是编辑距离。我们要找出每个字符中最小的操作,那么怎么找出“最小的操作”呢?只能挨个试了,所以出现了对每个字符进行删除、插入和替换的操作,然后进行对比从而找出最小的编辑距离
    matrix[i - 1, j] 表示删除操作
    matrix[i, j - 1]表示插入操作
    matrix[i - 1, j - 1]表示替换操作
   “1”表示距离值,因为ED算法是动态规划问题,后面的值由前面的结果得出,所以加1

3、为什么 matrix[i - 1, j]就表示删除操作,matrix[i, j - 1]就表示插入操作,matrix[i - 1, j - 1]就表示替换操作呢?
答:

举个例子:
matrix[3,3]位置,现在i=3,对应的字符串为exe;j=3,对应的字符串为int
matrix[i-1,j]=matrix[2,3],2对应的比较字符为ex,请注意关键点来了,i 和 i-1对比,也就是exe 和 ex 对比,是不是少了一个字符?那么我们就可以认为对字符exe进行了删除的操作得到ex。讲到这是不是有些感觉呢?ok,我们接着进行。
matrix[i,j-1]=matrix[3,2],2对应的比较字符in。同样我们用in和int相比,in少一个字符,那么我们可以认为in需要进行插入操作从而得到int。
matrix[i-1.j-1]=matrix[2,2],它表示替换操作,因为替换=删除+插入。看到这里你一定会恍然大悟原来是这样。这次比较的字符是ex和in,相当于我们对exe进行了删除操作得到ex,对in进行插入操作的到int

最后输出结果:

    i n t e n t i o n
  0 1 2 3 4 5 6 7 8 9
e 1 1 2 3 3 4 5 6 7 8
x 2 2 2 3 4 4 5 6 7 8
e 3 3 3 3 3 4 5 6 7 8
c 4 4 4 4 4 4 5 6 7 8
u 5 5 5 5 5 5 5 6 7 8
t 6 6 6 5 6 6 5 6 7 8
i 7 6 7 6 6 7 6 5 6 7
o 8 7 7 7 7 7 7 6 5 6
n 9 8 7 8 8 7 8 7 6 5

结束
以上是我个人的理解,如果有什么不对的地方还请大家指出

扒一扒编辑距离(Levenshtein Distance)算法的更多相关文章

  1. Levenshtein Distance算法(编辑距离算法)

    编辑距离 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符, ...

  2. 字符串相似度算法——Levenshtein Distance算法

    Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...

  3. 字符串相似度算法-LEVENSHTEIN DISTANCE算法

    Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...

  4. Magic Number(Levenshtein distance算法)

    Magic Number Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit ...

  5. 动态规划 001 - 编辑距离(Levenshtein Distance)问题

    问题 字符串的编辑距离也被称为距Levenshtein距离(Levenshtein Distance),属于经典算法,常用方法使用递归,更好的方法是使用动态规划算法,以避免出现重叠子问题的反复计算,减 ...

  6. 编辑距离算法详解:Levenshtein Distance算法

    算法基本原理:假设我们可以使用d[ i , j ]个步骤(可以使用一个二维数组保存这个值),表示将串s[ 1…i ] 转换为 串t [ 1…j ]所需要的最少步骤个数,那么,在最基本的情况下,即在i等 ...

  7. 字符串相似度算法(编辑距离Levenshtein Distance)的应用场景

    应用场景 DNA分析: 将DNA的一级序列如β-球蛋白基因的第一个外显子(Exon)转化为分子“结构图”,然后由所得“结构图”提取图的不变量,如分子连接性指数.以图的不变量作为自变量,再由相似度计算公 ...

  8. Levenshtein distance 编辑距离算法

    这几天再看 virtrual-dom,关于两个列表的对比,讲到了 Levenshtein distance 距离,周末抽空做一下总结. Levenshtein Distance 介绍 在信息理论和计算 ...

  9. Levenshtein Distance(编辑距离)算法与使用场景

    前提 已经很久没深入研究过算法相关的东西,毕竟日常少用,就算死记硬背也是没有实施场景导致容易淡忘.最近在做一个脱敏数据和明文数据匹配的需求的时候,用到了一个算法叫Levenshtein Distanc ...

随机推荐

  1. Ossim主要功能实战

    Ossim主要功能实战 OSSIM通过将开源产品进行集成,从而提供一种能够实现安全监控功能的基础平台将Nagiso,Ntop,Snort,Nmap等开源工具集成在一起提供综合的安全保护功能,而不必在各 ...

  2. 可视化数据包分析工具-CapAnalysis

    可视化数据包分析工具-CapAnalysis 我们知道,Xplico是一个从pcap文件中解析出IP流量数据的工具,本文介绍又一款实用工具-CapAnalysis(可视化数据包分析工具),将比Xpli ...

  3. std::cout彩色输出

    Mac OS效果 Windows 效果 想写这个东西其实是因为最近要写个命令行的工具,但是有个问题是什么呢?就是传统的那个黑漆漆的窗口看起来很蛋疼.并且完全看不到重点,于是就想起 来这么一个东西.相对 ...

  4. sublime text 2 中文乱码解决办法

    sublime text 2是一款非常优秀的跨平台文本及源代码编辑器,本人非常喜欢,但是不支持GB2312和GBK编码在某些时候比较麻烦.可以通过向sublime text 中添加编码类型转换包(比如 ...

  5. Linux rename命令

    转载:http://blog.csdn.net/sea_shore/article/details/6102437 1.rename命令批量修改文件名, 其实linux下可以使用别的办法来批量修改文件 ...

  6. c#文本文件写入

      string err = "Hellod world";             FileStream fs = null;             string filePa ...

  7. 第一部分 CLR基础:第3章 共享程序集和强命名程序集

    第一部分 CLR基础:第3章 共享程序集和强命名程序集

  8. 修改Hosts后对火狐不起作用解决办法

    修改Hosts后对火狐不起作用: 重启火狐浏览器仍不起作用的话,执行下面操作即可. FireFox - 选项 - 高级 - 网络 - 立即清除(缓存)  就解决了

  9. 记 移动端页面中莫名其妙的渲染BUG

    问题描述: 在一个很简单的测试页面中 简单的两块布局,上下两块均没有单独设置字体大小,都用body继承的大小,即40px.我们现在给第一个块.fl  加上浮动 float:left; 另外一个块处于正 ...

  10. sqoop导出工具

    sqoop的导出工具是把HDFS上文件中的数据导出到mysql中 mysql中的表 现在在linux上创建一个文件,并把这个文件上传到hdfs上 cat person.txt ,no7, ,no8, ...