计算字符串相似度之莱文斯坦距离

【DL经典回顾】距离度量大汇总(14-莱文斯坦距离(Levenshtein Distance)) 莱文斯坦距离(Levenshtein Distance),又称编辑距离,是两个字符串之间,由一个转换成另一个所需的最少单字符编辑操作的数量。 阅读详情

很多时候,我们在数据处理的时候需要进行模糊匹配,输入的内容和目标匹配内容并不能完全匹配,如果能有一部分匹配,那么根据需求我们也可以选择性的使用这些数据,而对于这些数据的具体匹配度,肯定会不同的数据有不同的结果。这样的数据分析处理场景,大多时候都是在进行字符串匹配时会遇到的情景,为了能够有一个具有说服力、标准化、通用性的匹配标准,我们通常会使用一些专业的算法去处理,今天给大家介绍一种办法,那就是 莱文斯坦距离(Levenshtein) 。

本文更新可能不及时,请至原网站查看:立即跳转

一、简介

莱文斯坦距离(Levenshtein) 是俄罗斯科学家弗拉基米尔·莱文斯坦(英语:Vladimir Levenshtein)在1965年提出这个概念。这是编辑距离① 的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。

注释①
编辑距离: 编辑距离是针对二个字符串(例如英文字)的差异程度的量化量测,量测方式是看至少需要多少次的处理才能将一个字符串变成另一个字符串。查看维基百科信息。

二、定义

莱文斯坦距离的定义其实非常简单,有点递归的影子,先计算出最小长度字符串时的距离,再计算出下一个长度的字符串的距离,从而实现整个字符串的全部距离。它的函数定义如下:

如果分别用 ∣ a ∣ |a| ∣a∣ 和 ∣ b ∣ |b| ∣b∣ 表示 a , b a, b a,b 两个字符串的长度,那么它们的莱文斯坦距离为 lev a , b ( ∣ a ∣ , ∣ b ∣ ) \text{lev}_{a,b}(|a|,|b|) leva,b​(∣a∣,∣b∣),它符合:

lev a , b ( i , j ) = { max ( i ,    j ) if   min ( i , j ) = 0 , min { lev a , b ( i − 1 , j ) + 1 lev a , b ( i , j − 1 ) + 1 lev a , b ( i − 1 , j − 1 ) + 1 ( a i ≠ b j ) otherwise. \displaystyle \text{lev}_{a,b}(i,j)= \begin{cases} \text{max}(i,\ \ j)\qquad\qquad\qquad\qquad\qquad\text{if}\ \ \ \text{min}(i,j)=0,\\\\ \text{min}\begin{cases} \text{lev}_{a,b}(i-1,j)+1\\ \text{lev}_{a,b}(i,j-1)+1\\ \text{lev}_{a,b}(i-1,j-1)+1_{(a_i\neq b_j)} \end{cases}\text{otherwise.} \end{cases} leva,b​(i,j)=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧​max(i,  j)if   min(i,j)=0,min⎩⎪⎨⎪⎧​leva,b​(i−1,j)+1leva,b​(i,j−1)+1leva,b​(i−1,j−1)+1(ai​​=bj​)​​otherwise.​

其中 1 ( a i ≠ b j ) 1_{(a_i\neq b_j)} 1(ai​​=bj​)​ 是一个 指示性函数,当 a i = b j a_i=b_j ai​=bj​时为 0 0 0 ,其它情况下为 1 1 1 。

lev a , b ( i , j ) \text{lev}_{a,b}(i,j) leva,b​(i,j) 表示 a a a 的前 i i i 个字符与 b b b 的前 j j j个字符之间的莱文斯坦距离。( i i i 和 j j j 都是从1开始的下标。)

我相信你看到这么大的一堆函数表达式,瞬间好像回到了高中时期,脑袋突然宕机,完全不知道说的是什么。不用担心看了下面的原理你就明白了, 其实这个函数表达式就是对原理的一个表示。

三、原理

我们先用人话翻译一下上面的函数式。

  • 第一行:当给定两个字符串中,最短的字符串长度为0的话,那么这两个的莱文斯坦距离为最大的字符串的长度。
  • 第二行:当给定的两个字符串中最短的字符串长度不为0,那么使用第二部分的规则。这部分规则为取三个值中最小的一个值作为结果,而这三个值又分别是计算a的上一个位置和b当前位置的结果加1;计算a的当前位置和b的上一个位置的结果加1;计算a的上一个位置和b的上一个位置的结果然后判断当前位置两个字符是否相等,不等则加1。

光是口说无凭,也依然很难理解,如果我们将这个原理通过表格的形式,会更容易理解一点,下面我们就以这两句话:

  • “First”
  • “Last”

作为例子,通过表格的形式来解释 莱文斯坦距离 的原理。首先我们将这两句话横竖放置在表的顶部和左部,就像这样:

First
012345
L1
a2
s3
t4

可以看到上表已经填写了一些数字,这些数字其实很好理解,最左上角的0,可以认为是两个字符串缩减到了空字符串的时候,即两个空字符串的莱文斯坦距离肯定是0,因为不需要任何编辑步数。而“F”下面的值1,则可以使用定义中的第一条,两个字符串中如果有一个空字符串,那么它们的莱文斯坦距离就是最长的字符串的长度。很明显,字符串“F”与空字符串的莱文斯坦距离是1。同样的道理即可得到后面的2、3、4、5。

现在开始进一步计算,我们把目光看向字符串“L”和“F”在表中相交的单元格,这时由于两个字符串都是有内容的,我们可以根据定义中的第二部分定义进行计算,根据定义,我们需要得到3个算式的值,然后取最小的那个值。我们一个一个算:

lev a , b ( i − 1 , j ) + 1 \text{lev}_{a,b}(i-1,j)+1 leva,b​(i−1,j)+1 其中的(i-1)可以理解为上一个单元格,坐标减一嘛。也就是上表中“F”下面的这个格子,里面计算出值是1,因此这里的算式结果就是:1+1 即得:2。

lev a , b ( i , j − 1 ) + 1 \text{lev}_{a,b}(i,j-1)+1 leva,b​(i,j−1)+1 同样的,只不过是另一个字符串的上一个单元格了。也就是上表中“L”右边的格子,我们计算出来的值是1,所以这里的算式结果也是:1+1 即得:2。

lev _ a , b ( i − 1 , j − 1 ) + 1 ( a i ≠ b j ) \text{lev}\_{a,b}(i-1,j-1)+1_{(a_i\neq b_j)} lev_a,b(i−1,j−1)+1(ai​​=bj​)​ 对于这个算式,我们就需要先知道对角线上一个格子内的值,我们已经计算出来了,等于0。然后再根据我们当前位置的两个字符串是否相同来确定是否+1,很显然“L”不等于“F”,因此这个算式最终结果为:0+1=1。

最后,我们将三个结果2,2,1比较取最小的一个值,也就是1是我们这个格子对应的两个字符串的莱文斯坦距离。的却,字符串“L”要变成“F”只需要进行一次替换操作就可以了。

那么现在,我们这个表就变成了下面的样子:

First
012345
L11
a2
s3
t4

现在,我们已经大致的了解了这个计算流程,很容易我们就能够推导出接下来所有的空格。下面我已经把所有空格都填上对应的值了:

First
012345
L112345
a222345
s333334
t444443

最后这两个字符串“First”和Last的莱文斯坦距离就是整个表最右下角的格子里面的数字3。现在,你应该掌握了莱文斯坦距离的精髓了。

四、立即体验

点击立即体验:在线体验

五、实现

当我们了解了实现原理之后,用代码实现就只是时间问题了。不过你要庆幸,我们已经是站在许多巨人的肩膀上了,实现了这个原理的第三方库有许许多多。下面就列举几个:

npm库:

夜深人静写算法(二十二)- 最小编辑距离 最小编辑距离的那几个题 阅读详情

相关推荐

C#实战:如何用Chart控件打造专业级数据可视化报表(附完整代码)

本文详细介绍了如何使用C#的Chart控件创建专业级数据可视化报表,涵盖柱状图、饼图和雷达图等多种图表类型的高级定制与交互增强。通过完整的代码示例,展示了从环境配置到动态数据绑定的全流程,助力开发者提升企业级应用的数据可视化能力。

ipfs8storage的博客 420

莱文斯坦距离(Levenshtein)

莱文斯坦距离是编辑距离的一种,指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。我们要用最少的字符操作次数,将字符串 A 转换为字符串 B。其中:|a|和|b|分别表示字符串a和b的长度,字符 l (L)是当a[i]!=b[j]时值为1,否则为0;i==0时,即s1为空,那么对应的dp[0][j]的值就为j:增加j个字符,使s1转化为s2。j==0时,即s2为空,那么对应的dp[i][0]的值就为i:减少i个字符,使s1转化为s2。指 字符串a 的前 i个字符和b的前j个字符之间的距离。

monlyy的博客 856

高精地图语义分割标注

什么是语义分割?语义分割与目标检测的区别?语义分割的关键应用场景有哪些?高精地图语义分割标注的难点?

weixin_52509513的博客 1645

莱文斯坦距离(编辑距离)算法 (Levenshtein Distance Algorithm)

什么是 莱文斯坦距离算法 (Levenshtein Distance Algorithm) ? Levenshtein Distance,莱文斯坦距离,通常被称为编...

aben_sky的专栏 4971

QMI8658姿态传感器实战:从校准到自检的完整避坑指南

本文详细解析了QMI8658姿态传感器的校准与自检流程,提供了从硬件环境搭建到高级功能开发的完整避坑指南。通过真实案例揭示电源设计、接口优化、温度补偿等关键细节,帮助开发者提升传感器精度和可靠性,适用于工业级应用场景。

weixin_29184075的博客 455

STM32驱动HC-SR04超声波模块:两种精准测距方案详解

本文详解STM32驱动HC-SR04超声波模块的两种精准测距方案:定时器中断计数法和外部中断边沿检测法。涵盖硬件连接、代码实现与优化技巧,帮助开发者根据精度和复杂度需求选择合适方案,提升超声波测距在嵌入式项目中的稳定性和准确性。

g5h6i的博客 684

编辑距离——莱文斯坦距离(Levenshtein distance)

在信息论和计算机科学中,

Turingkk的专栏 1万+

Redis简介和项目应用

内存优先架构简介Redis的读写操作都是在内存中执行的,计算机内存的读写速度极快,比机械硬盘的读写快很多,因此也会比MySql采用机械读写的方式性能更高。但是这样会产生一个问题,当Redis重启之后,内存中的数据就会丢失,为了保证数据不会因为服务器重启而丢失,Redis实现了数据持久化的机制,这个机制会把数据存储到磁盘中,当服务器重启的时候,能够从磁盘中恢复原有的数据。

人工智能、机器学习 759

莱文斯坦距离计算字符串的相似度

转载: https://blog.youkuaiyun.com/qq_30843221/article/details/51471049 基本理论 莱文斯坦距离(LD)用于衡量两个字符串之间的相似度。 以下我们称这两个字符串分别为 s (原字符串) 和 t (目标字符串)。莱文斯坦距离被定义为”将字符串 s 变换为字符串 t 所需的删除、插入、替换操作的次数” 算法原理 该算法的解决是基于动态规划的思想...

甦萌的博客 639

CSP-J2019普及组复赛T4:加工零件

CSP-J2020普及组复赛T1:优秀的拆分,广度优先遍历求最短路。

少儿编程乔老师 1854

国自然基金申请书撰写新思路:如何合理利用AI提高本子竞争力?

最后给大家推荐的400多所高校教师都在用的AI平台——高级学术版专业应用平台,集成了国际主流学术应用,以及ChatGPT、Claude、Gemini、Grok等Al大模型的高级版本平台,还有,可以辅助大家高效完成科研和学术写作任务,当然撰写硕博论文,课题、职称论文、国社科、国自然基金本子也是手拿把掐。创新点、技术路线、前期基础,但是我们也可以把写好的初稿交给AI,让它扮演资深研究员,帮我们精炼表述、优化段落结构,并揪出可能被评审追问的逻辑漏洞。,我们需要的是让它帮我们理清楚思路,而不是让它替我们完成内容。

智能AI让学术科研更容易 664

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

Levenshtein:莱文斯坦距离 Levenshtein的经典算法,参考http://en.wikipedia.org/wiki/Levenshtein_distance的伪代码实现的,同时参考了一些C++的实现,求字符串相似度。 下面求出结果是0.0~100.0, 表示为0%~100%。 static inline int min(int a, int b) { re...

weixin_30268921的博客 100

【ComfyUI】Wan 2.2 14B 首尾帧转视频 平滑过渡

本文介绍了基于 Wan2.2 ComfyUI 的视频生成工作流,通过预训练模型、提示词与参考图像的结合,实现高质量视频合成。工作流采用高低噪声模型与 LoRA 模块优化风格与细节,确保画面过渡平滑稳定。核心流程包括模型加载、图像输入、提示词编码、潜空间采样、解码与视频合成,最终生成动态转场视频。节点设计涵盖 CLIPTextEncode、KSamplerAdvanced 等关键模块,协同完成从文本到视频的全链路生成。正向提示词作为核心驱动力,直接影响视频的动作、镜头与画面变化。

Mr数据杨 1702

字符串相似度匹配算法python_字符串相似度算法-莱文斯坦距离算法

莱文斯坦(Levenshtein)距离莱文斯坦距离可以解决字符串相似度的问题。在莱文斯坦距离中,对每一个字符都有三种操作:删除、添加、替换例如有s1和s2两个字符串,a和b是与之对应的保存s1和s2全部字符的数组,i/j是数组下标。莱文斯坦距离的含义,是求将a变成b(或者将b变成a),所需要做的最小次数的变换。举个例子,字符串"kitten" 与“sitting” 的莱文斯坦距离是3,因为将kit...

weixin_39531374的博客 529

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

Levenshtein Distance莱文斯坦距离定义: 数学上,两个字符串a、b之间的莱文斯坦距离表示为levab(|a|, |b|)。 levab(i, j) = max(i, j) 如果min(i, j) = 0; = min(levab(i - 1, j) + 1, levab(i, j-1) + 1, levab(i - 1, j - 1) + ...

weixin_30511107的博客 317

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

字符串相似度 算法 - 莱文斯坦距离

字符串相似度 算法 - 莱文斯坦距离 /** * <p> * StringSimilarityUtil<br> * 字符串相似度<br> * 莱文斯坦距离,又称 Levenshtein 距离,是编辑距离的一种。指两个字串之间,由一个转成另一个所需的最少编辑操作次数。<br> * 简单的说,就是用编辑距离表示字符串相似度, 编辑距离越小,字符串越相似<br> * 我们使用了** 1 - ( 编辑距离 / 两个字符串的最大长度) ** 来

叁金Coder 449

动态规划——莱文斯坦距离

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 莱文斯坦距离 在搜索引擎中会有搜索词纠错的功能。这个功能背后的原理是编辑距离。 编辑距离 编辑距离是量化两个词之间的相似度。 编辑距离是指将一个字符串变为另外一个字符串,需要的最少编辑操作次数。编辑操作包含新增一个字符、修改一个字符、删除一个字符。编辑次数越少,编辑距离越小,两个字符串相似度越大。如果两个字符串完...

约定的博客 2658

莱文斯坦距离

nlp莱文斯坦距离

优快云_Lrcx的博客 488

【excel VBA】excel 计算字符串相似度

Private Function min(one As Integer, two As Integer, three As Integer) min = one If (two < min) Then min = two End If If (three < min) Then min = three End I

赖德发的博客 1万+

求两字符串的距离的算法

莱文斯坦距离(LD)用于衡量两个字符串之间的相似度。 以下我们称这两个字符串分别为 s (原字符串) 和 t (目标字符串)。莱文斯坦距离被定义为将字符串 s 变换为字符串 t 所需的删除、插入、替换操作的次数。 例如: s="test", t="test", 那么 LD(s,t)=0,因为不需要做任何变换两者已相等; s="test", t="tent", 那么 LD(s,t)=1,因为

站着编程 943

如何求两个序列的相似度

两个字符串/数组(不等长)的距离,怎么算?

ybdesire的专栏 2万+

字符串按相似度分组

相关代码已经上传GitHub : https://github.com/EricLi404/go-utils 0x00 概述 在做在做反垃圾账号业务的时候,检测发现有几十名用户都在某个IP上有过行为打点。 # 原始数据 ꧁❥????➦SAMI????MMS➣????❥꧂ ꧁❥????➦Ⓜ️AHI????MMS➣????❥꧂.. jgcch7b????V????O????I???? 2kc7fd7????V????O????I???? ꧁❥????➦VIDYA????MMS➣????❥꧂ RcR...

Eric's Blog 1785

[算法]莱茵斯坦距离算法优化

算法介绍: 莱文斯坦距离 算法用途: 查询字符串之间相似度 算法问题: 对于“abcdef”和“higabc”算法计算结果为0,不符合实际,“abc”为相似字符串 优化方法: 原来方法最后计算结果是(1-最长不同字符串长度)/ 最长字符串长度,优化后的方法将最长不同字符串长度的结果由d[n][m]改为数组最后一行或者最后一列的最小值(后面优化后的代码中的getRowColumnMin函数实现) 优化前算法Java实现: import org.junit.Test; /** * <h3>Jav

一杯糖不加咖啡 688
上一篇: 【layui】下拉控件dropdown文档
Microanswer
博客等级 码龄10年 38粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值