`
chenlb
  • 浏览: 700015 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Levenshtein Distance(LD)-计算两字符串相似度算法

阅读更多

    两字符串相似度计算方法有好多,现对基于编距的算法的相似度计算自己总结下。

 

    简单介绍下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的矩阵存储距离值。算法大概过程:

  1. str1或str2的长度为0返回另一个字符串的长度。
  2. 初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。
  3. 扫描两字符串(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三者的最小值。
  4. 扫描完后,返回矩阵的最后一个值即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

1
0
分享到:
评论
2 楼 chenlb 2008-06-27  
抄袭检测是,参考: http://www.merriampark.com/ld.htm 里面说的, 此算法在聚类应用中还算可以.

抄袭,用关键词余弦定理(向量空间模型),应该比较好.我的毕业设计就做了这方面的功能.就是用向量项. 它的缺点就是不检测结构上的相似, 当关键字相同时,把顺序倒过来,相似度还是一样.但正常情况可能满足了.
1 楼 minstrel 2008-06-26  
我觉得这个在检查抄袭上估计不行,这个方法好像更关注交换程度,因为抄袭是关键词差不多的,监测抄袭还是google那个余弦(cos)方法更合理

相关推荐

    字符串相似度算法 字符串相似度算法 字符串相似度算法

    在本文中,我们将讨论一种常用的字符串相似度算法:Levenshtein Distance。 什么是Levenshtein Distance? Levenshtein Distance(LD)是一种衡量两个字符串之间相似度的方法,衡量的是将源字符串(s)转换为目标...

    Levenshtein Distance--求字符串的相似程度的算法

    Levenshtein Distance--求字符串的相似程度的算法,文件用IE6可以打开。

    Python-Levenshtein快速计算编辑距离以及字符串的相似度

    除了编辑距离外,Levenshtein库还提供了其他有用的功能,如`ratio`函数,它能计算两个字符串的相似度,返回值范围在0到1之间,值越接近1表示相似度越高: ```python from Levenshtein import ratio ratio('kitten',...

    delphi计算两个字符串相似度源码 Levenshtein算法版

    《使用Delphi实现Levenshtein算法:计算字符串相似度》 在信息技术领域,字符串处理是常见的任务之一,其中计算两个字符串的相似度是尤为重要的一个环节。Levenshtein算法,也称为编辑距离算法,就是用于衡量两个...

    LD的两字符串相似度计算.zip

    Levenshtein Distance(简称LD),又称编辑距离,是衡量两个字符串相似度的一种方法。这个概念由俄国科学家Vladimir Levenshtein在1965年提出,因此得名。 编辑距离定义了将一个字符串转换成另一个字符串所需的最少...

    字符串相似度比较算法

    在计算机科学领域,字符串相似度比较算法是一种用于评估两个字符串之间相似程度的技术。这些算法广泛应用于文本处理、信息检索、生物信息学等多个领域。当我们要判断两个字符串是否含有相同或相近的信息时,这类算法...

    字符串相似度算法 levenshtein distance 编辑距离算法

    **字符串相似度算法——Levenshtein Distance(编辑距离)** 在信息技术和计算机科学领域,字符串相似度计算是一个重要的概念,特别是在文本处理、搜索引擎优化、数据校验和生物信息学等多个场景中。Levenshtein ...

    DELPHI Levenshtein算法 字符串相似度计算(附源码)

    Levenshtein算法,也称为编辑距离算法,是由俄国数学家Vladimir Levenshtein在1965年提出的一种衡量两个字符串相似度的方法。这个算法基于动态规划原理,可以计算出将一个字符串转换成另一个字符串所需要的最少单...

    字符串相似度算法

    在IT领域,字符串相似度算法是一种非常重要的工具,特别是在数据挖掘、信息检索、文本分类以及自然语言处理等应用中。这个小例子旨在介绍如何通过计算字符串间的相似度来进行模糊匹配。我们将探讨几种常见的字符串...

    mysql 计算字符串相似度

    1. **使用更高效的算法**:例如,采用编辑距离算法(Levenshtein 距离)或 Jaccard 相似度等更复杂的相似度计算方法。 2. **利用 MySQL 的内置函数**:例如,尝试使用 `UNHEX()` 和 `HEX()` 函数来处理多字节字符。 ...

    Delphi计算字符串的相似度

    字符串相似度计算通常用于找出两个字符串之间的相似程度,这在许多场景下都非常有用,例如拼写检查、搜索引擎排名、推荐系统等。有多种算法可以用来衡量字符串的相似性,包括但不限于: 1. **Levenshtein距离**:也...

    python_Levenshtein-0.12.2-cp37-cp37m-win_amd64.whl.zip

    Python中的`Levenshtein`库提供了多种计算Levenshtein距离的方法,如`distance`用于计算两个字符串的距离,`ratio`返回两个字符串的相似度(介于0和1之间),以及`editops`返回实现从一个字符串转换到另一个字符串的...

    python_Levenshtein-0.12.2-cp38-cp38-win_amd64.whl.zip

    Python中的`Levenshtein`库是一个用于计算字符串之间的编辑距离的模块,它提供了一种度量两个序列相似度的方法。这个压缩包`python_Levenshtein-0.12.2-cp38-cp38-win_amd64.whl.zip`包含了`Levenshtein`库的特定...

    两个字符串的相似度算法实现——编辑距离之Levenshtein距离

    两个字符串的相似度算法实现——编辑距离之Levenshtein距离

    各种字符串相似度和距离算法的实现Levenshtein、Jaro-winkler、n-Gram、Q-Gram、Jaccard index、最长公共子序列编辑距离、余弦相似度…….zip

    java 字符串相似度 实现不同字符串相似度和距离度量的库。目前已实现十几种算法(包括 Levenshtein 编辑距离和兄弟算法、Jaro-Winkler、最长公共子序列、余弦相似度等)。请查看下面的汇总表以获取完整列表...下载...

    python_Levenshtein_wheels-0.13.2-cp37-cp37m-win_amd64.whl.zip

    在实际应用中,`Levenshtein`模块提供了多种函数,如`distance`用于计算两个字符串之间的Levenshtein距离,`ratio`用于计算两个字符串的相似度百分比,以及`editops`返回将一个字符串转换为另一个字符串所需的编辑...

    python_Levenshtein_wheels-0.13.2-cp38-cp38-win_amd64.whl.zip

    在实际使用中,Levenshtein库主要通过`import Levenshtein`导入,然后可以使用其提供的函数,如`distance()`来计算两个字符串的编辑距离,或者使用`ratio()`来获取两个字符串的相似度比例。 例如: ```python ...

    python_Levenshtein-0.12.2-cp310-cp310-win_amd64.whl.zip

    `distance`返回两个字符串之间的编辑距离,`ratio`则计算它们的相似度百分比,`shortest_distance`用于计算一个字符串列表中的所有字符串对的最小编辑距离。 使用这个库的一个典型例子是检查用户输入的拼写错误,...

    java字符串相似度算法

    Java字符串相似度算法是用于衡量两个字符串之间相似程度的一种计算方法。在文本处理、信息检索、数据清洗等领域中,这种算法具有重要的应用价值。这里主要介绍了一种基于Levenshtein距离的Java实现。 Levenshtein...

Global site tag (gtag.js) - Google Analytics