Levenshtein字符串距离算法介绍

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(抄袭检测)

来自为知笔记(Wiz)

时间: 2024-10-16 18:18:08

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

字符串相似度三种算法介绍

余弦相似度 计算公式为: P(A,B) = sqrt(A × B) / (|A| × |B|) 设有两个字符串: ABCDEFG ABCHIJK 其中共有11个字符,为: A B C D E F G H I J K 如果,不考虑他们之间的关联性以及顺序等隐私,那么可以讲这两个字符串转换成两个11维空间中的向量: {1.1.1.1.1.1.1.0.0.0.0} {1.1.1.0.0.0.0.1.1.1.1} 那,计算他们之间的相似度为: P = sqrt(3) / (sqrt(7) × sqrt(

Levenshtein distance 编辑距离算法

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

KNN算法介绍

KNN算法全名为k-Nearest Neighbor,就是K最近邻的意思. 算法描述 KNN是一种分类算法,其基本思想是采用测量不同特征值之间的距离方法进行分类. 算法过程如下: 1.准备样本数据集(样本中每个数据都已经分好类,并具有分类标签):2.使用样本数据进行训练:3.输入测试数据A:4.计算A与样本集的每一个数据之间的距离:5.按照距离递增次序排序:6.选取与A距离最小的k个点:7.计算前k个点所在类别的出现频率:8.返回前k个点出现频率最高的类别作为A的预测分类. 主要因素 训练集(或

字符串kmp算法详解

之前要研究aho-corasick算法 拖了好久  感觉自己博客要开始了!! aho-corasick算法依赖2元素: 1.Trie树解析,1个月前就已经写过博客分析过了. 2.KMP算法 此文重点介绍字符串KMP算法: 一开始说说普通模式算法("BF"算法)思路:模式串从主串的第一个字符开始匹配,每匹配失败,主串中记录匹配进度的指针 i 都要进行 i-j+1 的回退操作(这个过程称为"指针回溯"),同时模式串向后移动一个字符的位置.一次次的循环,直到匹配成功或者程

机器学习中的度量——字符串距离

??????机器学习是时下流行AI技术中一个很重要的方向,无论是有监督学习还是无监督学习都使用各种"度量"来得到不同样本数据的差异度或者不同样本数据的相似度.良好的"度量"可以显著提高算法的分类或预测的准确率,本文中将介绍机器学习中各种"度量","度量"主要由两种,分别为距离.相似度和相关系数,距离的研究主体一般是线性空间中点:而相似度研究主体是线性空间中向量:相关系数研究主体主要是分布数据.本文主要介绍字符串距离. 1 汉明

【数据结构&&算法系列】KMP算法介绍及实现(c++ && java)

KMP算法如果理解原理的话,其实很简单. KMP算法简介 这里根据自己的理解简单介绍下. KMP算法的名称由三位发明者(Knuth.Morris.Pratt)的首字母组成,又称字符串查找算法. 个人觉得可以理解为最小回溯算法,即匹配失效的时候,尽量少回溯,从而缩短时间复杂度. KMP算法有两个关键的地方,1)求解next数组,2)利用next数组进行最小回溯. 1)求解next数组 next数组的取值只与模式串有关,next数组用于失配时回溯使用. 在简单版本的KMP算法中,每个位置 j 的 n

【算法】表达式求值--逆波兰算法介绍

逆波兰算法介绍 假定给定一个只 包含 加.减.乘.除,和括号的算术表达式,你怎么编写程序计算出其结果. 问题是:在表达式中,括号,以及括号的多层嵌套 的使用,运算符的优先级不同等因素,使得一个算术表达式在计算时,运算顺序往往因表达式的内容而定,不具规律性. 这样很难编写出统一的计算指令.使用逆波兰算法可以轻松解决.他的核心思想是将普通的中缀表达式转换为后缀表达式. 转换为后缀表达式的好处是:1.去除原来表达式中的括号,因为括号只指示运算顺序,不是完成计算必须的元素.2.使得运算顺序有规律可寻,计

BWT 压缩解压缩算法介绍 poj 1147

poj上1147题, 题意:任意一个长度为N的字符串,循环左移一个字符长度,这样形成N个新字符串,将这N个字符串按字典顺序排序,从上到下取得排序后的每行最后一列的的所有字符,求排序后的第一行字符串? 举个简单例子: 原串为: 0 0 0 1 1 那么循环左移排序后的矩阵为: 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 0 那么我们得到最后列的字符串为: 1 0 0 1 0 现在我们只知道最后列的字符串 1 0 0 1 0,让我们求循环左移排序后

联合人脸检测、校准算法介绍

联合人脸检测.校准算法介绍 人脸检测(detection)在opencv中早就有直接能拿来用的haar分类器,基于Viola-Jones算法.但是毕竟是老掉牙的技术,Precision/Recall曲线渣到不行,在实际工程中根本没法给boss看,作为MSRA脑残粉,这里介绍一种MSRA在14年的最新技术:下载   [ECCV 2014] Joint Cascade Face Detection and Alignment.这篇文章直接在30ms的时间里把detection和alignment都给