热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python编辑距离_字符串相似度算法(编辑距离算法LevenshteinDistance)(转)

在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录。据百度百科介绍:编辑距离,又称Levenshtein距离(也叫做EditDistanc

在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录。

据百度百科介绍:

编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将kitten一字转成sitting:

sitten (k→s)

sittin (e→i)

sitting (→g)

俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。因此也叫Levenshtein Distance。

例如

如果str1=”ivan”,str2=”ivan”,那么经过计算后等于 0。没有经过转换。相似度=1-0/Math.Max(str1.length,str2.length)=1

如果str1=”ivan1″,str2=”ivan2″,那么经过计算后等于1。str1的”1″转换”2″,转换了一个字符,所以距离是1,相似度=1-1/Math.Max(str1.length,str2.length)=0.8

应用

DNA分析

拼字检查

语音辨识

抄袭侦测

感谢大石头在评论中给出一个很好的关于此方法应用的连接 补充在此:

小规模的字符串近似搜索,需求类似于搜索引擎中输入关键字,出现类似的结果列表,文章连接:【算法】字符串近似搜索

算法过程

str1或str2的长度为0返回另一个字符串的长度。 if(str1.length==0) return str2.length; if(str2.length==0) return str1.length;

初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。

扫描两字符串(n*m级的),如果:str1[i] == str2[j],用temp记录它,为0。否则temp记为1。然后在矩阵d[i,j]赋于d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp三者的最小值。

扫描完后,返回矩阵的最后一个值d[n][m]即是它们的距离。

计算相似度公式:1-它们的距离/两个字符串长度的最大值。

为了直观表现,我将两个字符串分别写到行和列中,实际计算中不需要。我们用字符串“ivan1”和“ivan2”举例来看看矩阵中值的状况:

1、第一行和第一列的值从0开始增长

i

v

a

n

1

0

1

2

3

4

5

i

1

v

2

a

3

n

4

2

5

2、i列值的产生 Matrix[i – 1, j] + 1 ; Matrix[i, j – 1] + 1   ;    Matrix[i – 1, j – 1] + t

i

v

a

n

1

0+t=0

1+1=2

2

3

4

5

i

1+1=2

取三者最小值=0

v

2

依次类推:1

a

3

2

n

4

3

2

5

4

3、V列值的产生

i

v

a

n

1

0

1

2

i

1

0

1

v

2

1

0

a

3

2

1

n

4

3

2

2

5

4

3

依次类推直到矩阵全部生成

i

v

a

n

1

0

1

2

3

4

5

i

1

0

1

2

3

4

v

2

1

0

1

2

3

a

3

2

1

0

1

2

n

4

3

2

1

0

1

2

5

4

3

2

1

1

最后得到它们的距离=1

相似度:1-1/Math.Max(“ivan1”.length,“ivan2”.length) =0.8

算法用C#实现

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

《python 编辑距离_字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)》public class LevenshteinDistance

{

///

/// 取最小的一位数

///

///

///

///

///

private int LowerOfThree(int first, int second, int third)

{

int min = Math.Min(first, second);

return Math.Min(min, third);

}

private int Levenshtein_Distance(string str1, string str2)

{

int[,] Matrix;

int n = str1.Length;

int m = str2.Length;

int temp = 0;

char ch1;

char ch2;

int i = 0;

int j = 0;

if (n == 0)

{

return m;

}

if (m == 0)

{

return n;

}

Matrix = new int[n + 1, m + 1];

for (i = 0; i <= n; i++)

{

//初始化第一列

Matrix[i, 0] = i;

}

for (j = 0; j <= m; j++)

{

//初始化第一行

Matrix[0, j] = j;

}

for (i = 1; i <= n; i++)

{

ch1 = str1[i &#8211; 1];

for (j = 1; j <= m; j++)

{

ch2 = str2[j &#8211; 1];

if (ch1.Equals(ch2))

{

temp = 0;

}

else

{

temp = 1;

}

Matrix[i, j] = LowerOfThree(Matrix[i &#8211; 1, j] + 1, Matrix[i, j &#8211; 1] + 1, Matrix[i &#8211; 1, j &#8211; 1] + temp);

}

}

for (i = 0; i <= n; i++)

{

for (j = 0; j <= m; j++)

{

Console.Write(&#8221; {0} &#8220;, Matrix[i, j]);

}

Console.WriteLine(&#8220;&#8221;);

}

return Matrix[n, m];

}

///

/// 计算字符串相似度

///

///

///

///

public decimal LevenshteinDistancePercent(string str1, string str2)

{

//int maxLenth = str1.Length > str2.Length ? str1.Length : str2.Length;

int val = Levenshtein_Distance(str1, str2);

return 1 &#8211; (decimal)val / Math.Max(str1.Length, str2.Length);

}

}

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

1

调用

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

《python 编辑距离_字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)》static void Main(string[] args)

{

string str1 = &#8220;ivan1&#8221;;

string str2 = &#8220;ivan2&#8221;;

Console.WriteLine(&#8220;字符串1 {0}&#8221;, str1);

Console.WriteLine(&#8220;字符串2 {0}&#8221;, str2);

Console.WriteLine(&#8220;相似度 {0} %&#8221;, new LevenshteinDistance().LevenshteinDistancePercent(str1, str2) * 100);

Console.ReadLine();

}

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

1

结果

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

http://www.cnblogs.com/ivanyb/archive/2011/11/25/2263356.html


推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文介绍了C函数ispunct()的用法及示例代码。ispunct()函数用于检查传递的字符是否是标点符号,如果是标点符号则返回非零值,否则返回零。示例代码演示了如何使用ispunct()函数来判断字符是否为标点符号。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
author-avatar
月色清朗
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有