热门标签 | 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反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文总结了Java初学者需要掌握的六大核心知识点,帮助你更好地理解和应用Java编程。无论你是刚刚入门还是希望巩固基础,这些知识点都是必不可少的。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 最详尽的4K技术科普
    什么是4K?4K是一个分辨率的范畴,即40962160的像素分辨率,一般用于专业设备居多,目前家庭用的设备,如 ... [详细]
  • 【刷题篇】Java 不用Math.sqrt() 如何求一个数的平方根
    题目:在不用Math.sqrt()方法中如何求解一个大于1的数的平方根题解一、牛顿迭代法计算x2n的解,令f(x)x2-n,相当于求解f( ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 字节流(InputStream和OutputStream),字节流读写文件,字节流的缓冲区,字节缓冲流
    字节流抽象类InputStream和OutputStream是字节流的顶级父类所有的字节输入流都继承自InputStream,所有的输出流都继承子OutputStreamInput ... [详细]
  • JComponentJLabel的setBorder前言用例2205262241前言setBorder(Border边框)实现自JComponentjava.awt.Insets ... [详细]
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 如何在PHP中获取数组中特定元素的索引位置
    在PHP中获取数组中特定元素的索引位置有多种方法。首先,可以使用 `array_search()` 函数,其语法为 `array_search(目标值, $array)`,该函数将返回匹配元素的第一个键名(即下标)。其次,也可以利用 `array_keys()` 函数,通过 `array_keys($array, 目标值)` 语法来获取所有匹配元素的键名列表。这两种方法都能有效解决数组元素定位的问题,具体选择取决于实际需求和性能考虑。 ... [详细]
  • Webdriver中元素定位的多种技术与策略
    在Webdriver中,元素定位是自动化测试的关键环节。本文详细介绍了8种常用的元素定位技术与策略,包括ID、名称、标签名、类名、链接文本、部分链接文本、XPath和CSS选择器。每种方法都有其独特的优势和适用场景,通过合理选择和组合使用,可以显著提高测试脚本的稳定性和效率。此外,文章还探讨了在复杂页面结构中如何灵活运用这些定位技术,以应对各种挑战。 ... [详细]
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社区 版权所有