两字符串相似度计算方法有好多,现对基于编距的算法的相似度计算自己总结下。
简单介绍下Levenshtein Distance(LD):LD 可能衡量两字符串的相似性。它们的距离就是一个字符串转换成那一个字符串过程中的添加、删除、修改数值。
举例:
- 如果str1="test",str2="test",那么LD(str1,str2) = 0。没有经过转换。
- 如果str1="test",str2="tent",那么LD(str1,str2) = 1。str1的"s"转换"n",转换了一个字符,所以是1。
如果它们的距离越大,说明它们越是不同。
Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名。不会拼读,可以叫它edit distance(编辑距离)。
Levenshtein distance可以用来:
- Spell checking(拼写检查)
- Speech recognition(语句识别)
- DNA analysis(DNA分析)
- Plagiarism detection(抄袭检测)
LD用m*n的矩阵存储距离值。算法大概过程:
- str1或str2的长度为0返回另一个字符串的长度。
- 初始化(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-它们的距离/字符串长度最大值。
源码:
package com.chenlb.algorithm;
/**
* 编辑距离的两字符串相似度
*
* @author chenlb 2008-6-24 下午06:41:55
*/
public class Similarity {
private int min(int one, int two, int three) {
int min = one;
if(two < min) {
min = two;
}
if(three < min) {
min = three;
}
return min;
}
public int ld(String str1, String str2) {
int d[][]; //矩阵
int n = str1.length();
int m = str2.length();
int i; //遍历str1的
int j; //遍历str2的
char ch1; //str1的
char ch2; //str2的
int temp; //记录相同字符,在某个矩阵位置值的增量,不是0就是1
if(n == 0) {
return m;
}
if(m == 0) {
return n;
}
d = new int[n+1][m+1];
for(i=0; i<=n; i++) { //初始化第一列
d[i][0] = i;
}
for(j=0; j<=m; j++) { //初始化第一行
d[0][j] = j;
}
for(i=1; i<=n; i++) { //遍历str1
ch1 = str1.charAt(i-1);
//去匹配str2
for(j=1; j<=m; j++) {
ch2 = str2.charAt(j-1);
if(ch1 == ch2) {
temp = 0;
} else {
temp = 1;
}
//左边+1,上边+1, 左上角+temp取最小
d[i][j] = min(d[i-1][j]+1, d[i][j-1]+1, d[i-1][j-1]+temp);
}
}
return d[n][m];
}
public double sim(String str1, String str2) {
int ld = ld(str1, str2);
return 1 - (double) ld / Math.max(str1.length(), str2.length());
}
public static void main(String[] args) {
Similarity s = new Similarity();
String str1 = "chenlb.blogjava.net";
String str2 = "chenlb.iteye.com";
System.out.println("ld="+s.ld(str1, str2));
System.out.println("sim="+s.sim(str1, str2));
}
}
不知sim方法中的公式是合理,个人认为差强人意思,不知javaeyer们,有没有高见,指点一二,^_^
参考: http://www.merriampark.com/ld.htm
分享到:
相关推荐
在本文中,我们将讨论一种常用的字符串相似度算法:Levenshtein Distance。 什么是Levenshtein Distance? Levenshtein Distance(LD)是一种衡量两个字符串之间相似度的方法,衡量的是将源字符串(s)转换为目标...
Levenshtein Distance(简称LD),又称编辑距离,是衡量两个字符串相似度的一种方法。这个概念由俄国科学家Vladimir Levenshtein在1965年提出,因此得名。 编辑距离定义了将一个字符串转换成另一个字符串所需的最少...
**字符串相似度算法——Levenshtein Distance(编辑距离)** 在信息技术和计算机科学领域,字符串相似度计算是一个重要的概念,特别是在文本处理、搜索引擎优化、数据校验和生物信息学等多个场景中。Levenshtein ...
C#,字符串相似度的莱文斯坦距离(Levenshtein Distance)算法与源代码 莱文斯坦距离(Levenshtein Distance)用于衡量两个字符串之间的相似度。 莱文斯坦距离以俄国科学家(Vladimir I. Levenshtein)命名,他于...
LD(Levenshtein Distance)算法,又称编辑距离,是由俄国科学家Vladimir Levenshtein在1965年提出的一种衡量两个字符串相似度的算法。该算法通过计算将一个字符串转换成另一个字符串所需的最少单字符编辑操作(插入...
莱文斯坦距离(Levenshtein Distance)是一种衡量两个字符串之间差异的度量,由俄罗斯科学家弗拉迪米尔·莱文斯坦提出。它定义为将一个字符串转换为另一个字符串所需的最少单字符编辑操作的次数,包括插入、删除和...
编辑距离(Edit Distance),又称Levenshtein距离,是一种衡量两个字符串相似度的方法。它定义为通过插入、删除或替换一个字符的方式将一个字符串转换成另一个字符串所需的最少操作次数。 #### 二、编辑距离的应用...
编辑距离是一种衡量两个字符串相似度的方法,它表示从一个字符串转换成另一个字符串所需的最少单字符编辑操作次数。在考试系统中,可以将学生提交的程序和标准解之间的编辑距离作为评分的基础。LD算法能够有效地计算...
通过改进算法,比如结合其他的字符串相似度算法,可以提升比较的效率和准确性。 以上就是关于"C++、QT文本比较源码"这个项目的详细知识点介绍,涵盖从编程语言到具体算法的多个层面,对于理解和实践文本比较及GUI...
文章提出了一种创新的评分方法,即利用编辑距离(Levenshtein Distance, LD算法)来评估学生的代码与标准答案之间的相似度。LD算法通过计算最少的单字符编辑操作数量(包括插入、删除和替换)来衡量字符串之间的差异...