一个如何识别相似语句的问题,于是上网找了找,一个叫Levenshtein Distance的算法比较简单,就写了段代码实现了一下,效果还不错。

这个算法是一个俄国人Lvenshtein提出的,用于计算两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。次数越少,表示两个字符串相似度越高。

用实例来讲解算法最直观,我们假设有两个字符串:test和est,需要经过以下几个步骤来获取LD值。

1、初始化一个矩阵

┌──┬───────────┐ │  │test t e s t │ ├──┼───────────┤ │ est│ 0 1 2 3 4 │ │ e│ 1 x │ │ s│ 2 │ │ t│ 3 │ └──┴───────────┘

2、计算x值

计算x的算法为:

取x1 = 左边的值+1 = 1+1 = 2;

取x2 = 上边的值+1 = 1+1 = 2;

如果横纵坐标的字符不一样,则取x3 = 左上角的值+1,否则取x3 = 左上角的值。此处由于e≠t,所以x3 = 0+1 = 1。

然后得到x = min(x1, x2, x3) = 1。

3、以此类推,填满矩阵,最右下角的值即为LD值

┌──┬───────────┐ │ │test t e s t │ ├──┼───────────┤ │ est│ 0 1 2 3 4 │ │ e│ 1 1 1 2 3 │ │ s│ 2 2 2 1 2 │ │ t│ 3 2 3 2 1 │ └──┴───────────┘

4、计算相似度

公式为:相似度 = 1 - (LD / 最大字符串长度)

本例中,相似度 = 1 - (1 / 4) = 0.75,这个值介于0到1之间,值越高,表示两字符串相似度越大。

用C#代码实现一下:

///



/// 计算LD值

///

/// 第一个字符串

/// 第二个字符串

/// LD

public int GetLevenshteinDistince(string str1, string str2)

{

//初始化矩阵

int[,] matrix = new int[str1.Length + 1, str2.Length + 1];

//赋第一行与第一列的初值
for(int i = 0; i <= str1.Length; ++i)
matrix[i, 0] = i; for(int i = 0; i <= str2.Length; ++i)
matrix[0, i] = i; //开始填充矩阵
for(int i = 1; i <= str1.Length; i++)
{
for(int j = 1; j <= str2.Length; j++)
{
//左上角相同加0,否则加1
int addition = str1[i - 1] == str2[j - 1] ? 0 : 1; //取三者中的最小值
int min = Math.Min(matrix[i - 1, j - 1] + addition, matrix[i, j - 1] + 1);
matrix[i, j] = Math.Min(min, matrix[i - 1, j] + 1);
}
} //矩阵最右下角数字即是LD
return matrix[str1.Length, str2.Length];

}

///



/// 计算相似度

///

/// 第一个字符串

/// 第二个字符串

/// 相似度,0-1之间

public float ComputeSimilarity(string str1, string str2)

{

return 1 - (float)GetLevenshteinDistince(str1, str2) / Math.Max(str1.Length, str2.Length);

}

LD算法获取字符串相似度的更多相关文章

  1. 百度面试题 字符串相似度 算法 similar_text 和页面相似度算法

    在百度的面试,简直就是花样求虐. 首先在面试官看简历的期间,除了一个自己定义字符串相似度,并且写出求相似度的算法. ...这个确实没听说过,php的similar_text函数也是闻所未闻的.之前看s ...

  2. 字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)

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

  3. [Irving]字符串相似度-字符编辑距离算法(c#实现)

    编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字 ...

  4. 字符串相似度算法(编辑距离算法 Levenshtein Distance)

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

  5. 用C#实现字符串相似度算法(编辑距离算法 Levenshtein Distance)

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

  6. [转]字符串相似度算法(编辑距离算法 Levenshtein Distance)

    转自:http://www.sigvc.org/bbs/forum.php?mod=viewthread&tid=981 http://www.cnblogs.com/ivanyb/archi ...

  7. C#实现字符串相似度算法

    字符串的相似性比较应用场合很多,像拼写纠错.文本去重.上下文相似性等. 评价字符串相似度最常见的办法就是: 把一个字符串通过插入.删除或替换这样的编辑操作,变成另外一个字符串,所需要的最少编辑次数,这 ...

  8. Java利用MessageDigest提供的MD5算法加密字符串或文件

    MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性.用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm).另外还有一种常用的消息摘要算法SHA1.如果想了 ...

  9. Python 连接MongoDB并比较两个字符串相似度的简单示例

    本文介绍一个示例:使用 pymongo 连接 MongoDB,查询MongoDB中的 字符串 记录,并比较字符串之间的相似度. 一,Python连接MongoDB 大致步骤:创建MongoClient ...

随机推荐

  1. adobe premiere pro cc2015.0已停止工作 解决办法

    adobe premiere pro cc2015.0已停止工作 一直报错 解决办法就是: 删除我的电脑  我的饿文档下的 Adobe下的Premiere Pro文件夹 现象就是怎么重新安装都不管用P ...

  2. 浅谈Android样式开发之布局优化

    引言 今天我们来谈一下Android中布局优化常用的一些手段.官方给出了3种优化方案,分别是</include>.</viewstub>.</merge>标签,下面 ...

  3. SpringMVC学习记录5

    Springmvc流程中的扩展点有很多,可以在很多地方插入自己的代码逻辑达到控制流程的目的. 如果要对Controller的handler方法做统一的处理.我想应该会有很多选择,比如:@ModelAt ...

  4. 关于springMVC+Mybatis jar包详解

    1.Aopalliance.jar: 这个包是AOP联盟的API包,里面包含了针对面向切面的接口,通常spring等其它具备动态织入功能的框架依赖此包. 2.aspectjweaver-1.7.1.j ...

  5. 【postman】postman

    谷歌插件网 http://chromecj.com/utilities/2014-09/181.html

  6. Sublime Text 3 安装Package Control

    原来Subl3安装Package Control很麻烦,现在简单的方法来了 一.简单的安装方法 使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码: ...

  7. &&&&数组去重方法总结&&&&&

    [数组去重]本文一共总结了5种方法: //方法一:sort方法 var ary = [1, 4, 2, 3, 1, 2, 2, 3, 3, 2, 5, 2, 1, 2];Array.prototype ...

  8. eclipse软件创建servlet

    网上找了好多资料,eclipse创建servlet后,发到tomcat下发布,不能编译,生产class文件. 很多回答的都是一知半解,太气人了,看书.把资料找了一天,才发现是没有servlet-api ...

  9. 各种Android手机Root方法

    Root的介绍  谷歌的android系统管理员用户就叫做root,该帐户拥有整个系统至高无上的权利,它可以访问和修改你手机几乎所有的文件,只有root才具备最高级别的管理权限.我们root手机的过程 ...

  10. iOS sqlite数据库图像化查看

    问题描述:在xocde上用sqlite数据库的时候,因为没有图形化界面,有些时候很难看出自己设计的数据库是否有问题,比如我刚上手sqlite数据库设计id为自增长时,很自然的用了identify(1, ...