Levenshtein字符串距离算法介绍

文/开发部 Dimmacro

KMP完全匹配算法和 Levenshtein相似度匹配算法是模糊查找匹配字符串中最经典的算法,配合近期技术栏目关于算法的探讨,上期介绍了KMP算法的一些皮毛,收到了同事的一些反馈,本期再接再厉,搜集了一些资料,简单谈谈Levenshtein相似度匹配算法,希望能抛砖引玉。

算法简介:

Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,其原理是两个字符串之间,由一个经过许可的编辑操作转换成另一个所需的最少步骤。其中许可的编辑操作包括将替换一个字符,插入一个字符,删除一个字符。

概述:

如果要把两个不相同的字符串变得相同,可以通过如下操作方法:
  1.修改一个字符(如把“a”替换为“b”)。
  2.增加一个字符(如把“abdd”变为“aebdd”)。
  3.删除一个字符(如把“travelling”变为“traveling”)。
  比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加或者减少一个“g“的方式来达到目的。无论是增加还是减少,都仅需要一次操作。我们把两个不等字符串使之相等的操作次数定义为两个字符串的距离,这也是Levenshtein算法的核心原理。

如果有两个串A=xabcdae和B=xfdfa,它们的第一个字符是相同的,只要计算A[2,…,7]=abcdae和B[2,…,5]=fdfa的距离就可以了。但是如果两个串的第一个字符不相同,那么可以进行如下的操作(lenA和lenB分别是A串和B串的长度)
  1.删除A串的第一个字符,然后计算A[2,…,lenA]和B[1,…,lenB]的距离。
  2.删除B串的第一个字符,然后计算A[1,…,lenA]和B[2,…,lenB]的距离。
  3.修改A串的第一个字符为B串的第一个字符,然后计算A[2,…,lenA]和B[2,…,lenB]的距离。
  4.修改B串的第一个字符为A串的第一个字符,然后计算A[2,…,lenA]和B[2,…,lenB]的距离。
  5.增加B串的第一个字符到A串的第一个字符之前,然后计算A[1,…,lenA]和B[2,…,lenB]的距离。
  6.增加A串的第一个字符到B串的第一个字符之前,然后计算A[2,…,lenA]和B[1,…,lenB]的距离。
很明显,这是一个递归过程。

示例:

递归计算字符串” GUMBO”与” GAMBOL”的距离

1.    步骤1

设置n为字符串s即"GUMBO"的长度。设置m为字符串t即"GAMBOL"的长度。如果n等于0,返回m并退出。如果m等于0,返回n并退出。构造两个向量v0[m+1] 和v1[m+1],串联0..m之间所有的元素并初始化v0 to 0..m。如下图


v0

v1

G

U

M

B

O

0

1

2

3

4

5

G

1

A

2

M

3

B

4

O

5

L

6

                             

2.    步骤2

检查 s (i from 1 to n) 中的每个字符。

检查 t (j from 1 to m) 中的每个字符

如果 s[i] 等于 t[j],则编辑代价为 0;如s1=t1=G,所以第四行第三列为0

如果 s[i] 不等于 t[j],则编辑代价为1。s1=G,t2=A,所以第五行第三列为1。

如下图i=1;


v0

v1

G

U

M

B

O

0

1

2

3

4

5

G

1

0

A

2

1

M

3

2

B

4

3

O

5

4

L

6

5

                             

3.    步骤3

当 i = 2,其原理如步骤2,设置单元v1[j]为下面的最小值之一:
a、紧邻该单元上方+1:v1[j-1] + 1
b、紧邻该单元左侧+1:v0[j] + 1
c、该单元对角线上方和左侧+cost:v0[j-1] + cost(cost值为对角线上方即上一个字符比较结果,相等为0,不等为1)

如下图展示


v0

v1

G

U

M

B

O

0

1

2

3

4

5

G

1

0

1

A

2

1

1

M

3

2

2

B

4

3

3

O

5

4

4

L

6

5

5

                             

4.    步骤4

以此类推,当i=3,4,5,如下图:


v0

v1

G

U

M

B

O

0

1

2

3

4

5

G

1

0

1

2

3

4

A

2

1

1

2

3

4

M

3

2

2

1

2

3

B

4

3

3

2

1

2

O

5

4

4

3

2

1

L

6

5

5

4

3

2

                             

5.    步骤5

从上面的图可以看出,编辑距离就是矩阵右下角的值,v1[m]
== 2。由"GUMBO"变换为"GAMBOL"的过程对于我们来说是很直观的,即通过将"A"替换为"U",并在末尾追加"L"这样子(实际上替换的过程是由移除和插入两个操作组合而成的)。

用途:

·      Spell checking(拼写检查)

·      Speech recognition(语句识别)

·      DNA analysis(DNA分析)

·      Plagiarism detection(抄袭检测)

Levenshtein字符串距离算法介绍的更多相关文章

  1. iOS:使用莱文斯坦距离算法计算两串字符串的相似度

    Levenshtein:莱文斯坦距离 Levenshtein的经典算法,参考http://en.wikipedia.org/wiki/Levenshtein_distance的伪代码实现的,同时参考了 ...

  2. Levenshtein distance 编辑距离算法

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

  3. Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法

    2019独角兽企业重金招聘Python工程师标准>>> Lucene的FuzzyQuery中用到的Levenshtein Distance(LD)算法 博客分类: java 搜索引擎 ...

  4. 扒一扒编辑距离(Levenshtein Distance)算法

    最近由于工作需要,接触了编辑距离(Levenshtein Distance)算法.赶脚很有意思.最初百度了一些文章,但讲的都不是很好,读起来感觉似懂非懂.最后还是用google找到了一些资料才慢慢理解 ...

  5. 自然语言处理(5)之Levenshtein最小编辑距离算法

    自然语言处理(5)之Levenshtein最小编辑距离算法 题记:之前在公司使用Levenshtein最小编辑距离算法来实现相似车牌的计算的特性开发,正好本节来总结下Levenshtein最小编辑距离 ...

  6. KNN算法介绍

    KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思. 算法描述 KNN是一种分类算法,其基本思想是采用测量不同特征值之间的距离方法进行分类. 算法过程如下: 1.准备样本数据集( ...

  7. Atitti knn实现的具体四个距离算法 欧氏距离、余弦距离、汉明距离、曼哈顿距离

    Atitti knn实现的具体四个距离算法  欧氏距离.余弦距离.汉明距离.曼哈顿距离 1. Knn算法实质就是相似度的关系1 1.1. 文本相似度计算在信息检索.数据挖掘.机器翻译.文档复制检测等领 ...

  8. 推荐算法——距离算法

    本文内容 用户评分表 曼哈顿(Manhattan)距离 欧式(Euclidean)距离 余弦相似度(cos simliarity) 推荐算法以及数据挖掘算法,计算"距离"是必须的~ ...

  9. ISP基本框架及算法介绍

    什么是ISP,他的工作原理是怎样的? ISP是Image Signal Processor的缩写,全称是影像处理器.在相机成像的整个环节中,它负责接收感光元件(Sensor)的原始信号数据,可以理解为 ...

随机推荐

  1. HP发送HTTP POST请求 返回结果

    HP发送HTTP POST请求 返回结果 <?php $srv_ip = '192.168.10.188';//你的目标服务地址或频道.$srv_port = 80;$url = '/demo/ ...

  2. sqlserver镜像相关资料

    本文出处:http://blog.csdn.net/dba_huangzj/article/details/35995083 镜像(Mirroring) SQL Server镜像简介 计划搭建SQL ...

  3. C#中一个窗口是一个类呢,还是一个窗口类的实例呢?(转)

    C#中一个窗口是一个类呢,还是一个窗口类的实例呢? 答: 没有一个人说到重点上. 一个窗口,它不是仅仅用一个类可以描述的: 首先,这个窗口的数据类型类型,是从Form类派生下来的,也就是说它的定义是一 ...

  4. 1056 IMMEDIATE DECODABILITY

    题目链接: http://poj.org/problem?id=1056 题意: 给定编码集, 判断它是否为可解码(没有任何一个编码是其他编码的前缀). 分析: 简单题目, 遍历一遍即可, 只需判断两 ...

  5. 34 输入3个数a,b,c,按大小顺序输出

    题目:输入3个数a,b,c,按大小顺序输出 public class _034Sorting { public static void main(String[] args) { sorting(); ...

  6. .NET基础 (01).NET基础概念

    .NET基础概念 1 什么是CTS.CLS和CLR2 开发和运行.NET程序需要的最基本环节是什么3 .NET是否支持多编程语言开发4 CLR技术和COM技术的比较5 什么是程序集和应用程序域 1 什 ...

  7. mybatis_入门程序

    Mybatis入门 (一).程序环境 1.jar包 2.classpath目录下建立SqlMapConfig.xml. mybatis的配置文件.全部设置有如下 同时,数据库的参数可以用propert ...

  8. 解决Hbuilder打包的apk文件按手机返回键直接退出软件

    问题描述:Hbuilder打包的app如果点击手机返回键,app会直接退出,返回不了上一页. 写在公共js文件中,每个页面均引入该js,代码如下: document.addEventListener( ...

  9. [LeetCode 题解]: Search a 2D Matrix

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  10. Android 工具类大全

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38965311 1.日志工具类L.java package com.zhy.uti ...