LD算法获取字符串相似度
一个如何识别相似语句的问题,于是上网找了找,一个叫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算法获取字符串相似度的更多相关文章
- 百度面试题 字符串相似度 算法 similar_text 和页面相似度算法
在百度的面试,简直就是花样求虐. 首先在面试官看简历的期间,除了一个自己定义字符串相似度,并且写出求相似度的算法. ...这个确实没听说过,php的similar_text函数也是闻所未闻的.之前看s ...
- 字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)
在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个 ...
- [Irving]字符串相似度-字符编辑距离算法(c#实现)
编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字 ...
- 字符串相似度算法(编辑距离算法 Levenshtein Distance)
在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录.据百度百科介绍:编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串 ...
- 用C#实现字符串相似度算法(编辑距离算法 Levenshtein Distance)
在搞验证码识别的时候需要比较字符代码的相似度用到"编辑距离算法",关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Dist ...
- [转]字符串相似度算法(编辑距离算法 Levenshtein Distance)
转自:http://www.sigvc.org/bbs/forum.php?mod=viewthread&tid=981 http://www.cnblogs.com/ivanyb/archi ...
- C#实现字符串相似度算法
字符串的相似性比较应用场合很多,像拼写纠错.文本去重.上下文相似性等. 评价字符串相似度最常见的办法就是: 把一个字符串通过插入.删除或替换这样的编辑操作,变成另外一个字符串,所需要的最少编辑次数,这 ...
- Java利用MessageDigest提供的MD5算法加密字符串或文件
MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性.用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm).另外还有一种常用的消息摘要算法SHA1.如果想了 ...
- Python 连接MongoDB并比较两个字符串相似度的简单示例
本文介绍一个示例:使用 pymongo 连接 MongoDB,查询MongoDB中的 字符串 记录,并比较字符串之间的相似度. 一,Python连接MongoDB 大致步骤:创建MongoClient ...
随机推荐
- js笔记
1.克隆对象 克隆数组: var country=['中国','美国']; var copyCountry=country.slice(0); 克隆对象: var people={sex:'man', ...
- 强有力的Linux历史命令 你还记得几个
列出所有出现到的命令:(所有一下信息都可以通过man history得到,而且还更多) history:列出历史中执行过的命令(-c清除所有的命令历史) !N:执行编号为N的历史命令 !-N:执行倒数 ...
- 移动端开发概览【webview和touch事件】
作为一个前端,而且作为一个做移动端开发的前端,那意味着你要有三头六臂,跟iOS开发哥哥一起打酱油,跟Android开发哥哥一起修bug... Android vs Ios 我在webkit内核的chr ...
- VBA学习思路
打算花两三天学习VBA的基础,学习资料为<别怕,VBA其实很简单>,为了快速学习,先了解大致框架,后续再深入学习各种属性.方法和技巧. 1.VBA编程环境基本操作,手工操作,熟悉即可 2. ...
- [译]Object.getPrototypeOf
原文 概要 返回指定object的prototype. 语法 Object.getPrototypeOf(object) 参数 object 要返回原型的对象. 描述 当object参数不是一个对象的 ...
- 蒙特卡洛模拟入门的几个小例子(R语言实现)
嗯,第一个例子是怎么用蒙特卡洛模拟求pi的值:第二个是用蒙特卡洛模拟求解定积分:第三个是用蒙特卡洛模拟证券市场求解其收益:第四个是用蒙特卡洛模拟验证OLS的参数的无偏性:然后还要R是如何求导,计算导数 ...
- 通过代码自定义cell(cell的高度不一致,比如微博)
1.新建一个继承自UITableViewCell的类 2.重写initWithStyle:reuseIdentifier:方法 (先要调用父控件的nitWithStyle:reuseIdentifie ...
- Go收藏
Go项目收藏 电子书 1.Go Web 编程 2.Go入门指南(the-way-to-go_ZH_CN) 3.Go语言圣经(中文版) Go by Example 中文 一些Go英文电子书 High P ...
- entityframework
entityframework扩展: http://entityframework-plus.net/
- Thinkphp 3.2.2 验证码check_verify方法,只能验证一次
问题: Thinkphp 3.2.2 验证码check_verify方法,只能验证一次. function check_verify($code, $id = ''){ $verify = \Thin ...