Levenshtein Distance
概念:
首先由俄国科学家Levenshtein提出的,又叫Levenshtein Distance。
是一种字符串之间相似度计算的方法。给定两个字符串S、T,将S转换成T所需要的删除,插入,替换操作的数量就叫做S到T的编辑路径。而最短的编辑路径就叫做字符串S和T的编辑距离。
分析:
例子:S=“eeba” T="abac" 我们可以按照这样的步骤转变:
(1) 将S中的第一个e变成a;
(2) 删除S中的第二个e;
(3) 在S中最后添加一个c;
那么S到T的编辑路径就等于3。当然,这种变换并不是唯一的。
但如果3是所有变换中最小值的话,那么我们就可以说S和T的编辑距离等于3了。
动态规划解决编辑距离
动态规划(dynamicprogramming)是一种解决复杂问题最优解的策略。
它的基本思路就是:将一个复杂的最优解问题分解成一系列较为简单的最优解问题,再将较为简单的的最优解问题进一步分解,直到可以一眼看出最优解为止。
例子:S=“eeba” T="abac" 。
首先定义一个函数
edit(i, j):它表示第一个字符串S长度为i的子串si(S[0...i])到第二个字符串T长度为j的子串T[0...j]的编辑距离.
如果S只有1个字符e、T只有1个字符a,那么就可以立即得到S和T的编辑距离edit(0,0)=1(将e替换成a) ------------ 替换一个
如果S中有1个字符e、T中有2个字符ab,可以分解成:edit(0,1)=edit(0,0)+1 (将e替换成a后,在添加一个b)。 ------------ 替换一个,增加一个
如果S中有2个字符ee,T中有2个字符ab,可以分解成:edit(1,1)=min(edit(0,1)+1, edit(1,0)+1, edit(0,0)+f(1,1)).
这样我们可以得到这样一些动态规划公式:
如果i=0且j=0 edit(0, 0) = 1
如果i=0且j>0 edit(0, j) = edit(0, j-1)+1
如果i>0且j=0 edit(i, 0) = edit(i-1, 0)+1
如果i>0且j>0 edit(i, j) = min(edit(i-1, j)+1, edit(i,j-1)+1, edit(i-1,j-1)+f(i, j) )
f(i, j):表示S中第i个字符s(i)转换到T中第j个字符s(j)所需要的操作次数。
如果s(i)==s(j),则不需要任何操作f(i, j)=0; 否则,需要替换操作,f(i, j)=1 。
这就是将长字符串间的编辑距离问题一步一步转换成短字符串间的编辑距离问题,直至只有1个字符的串间编辑距离为1。
相似度计算
相似度 = 1 - edit(S.length, T.length) / Math.Max(S.length, T.length)
例如:
如果str1="ivan",str2="ivan",没有经过转换。那么经过计算后等于 0。相似度=1-0/Math.Max(str1.length,str2.length)=1
如果str1="ivan1",str2="ivan2",str1的"1"转换"2",转换了一个字符,所以距离是1,相似度=1-1/Math.Max(str1.length,str2.length)=0.8
public class SimilarityCalculate {
//Levenshtein Distance
private int edit(String source, String target) {
int n = source.length();
int m = target.length();
int i, j; //
char schar, tchar; //
int temp; //
if (n == 0)
return m;
if (m == 0)
return n;
int d[][] = new int[n + 1][m + 1];
// initialization
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++) {
schar = source.charAt(i - 1);
for (j = 1; j <= m; j++) {
tchar = target.charAt(j - 1);
if (schar == tchar) {
temp = 0;
} else {
temp = 1;
}
int one = d[i - 1][j] + 1;
int two = d[i][j - 1] + 1;
int three = d[i - 1][j - 1] + temp;
d[i][j] = (one = one < two ? one : two) < three ? one : three;
}
}
return d[n][m];
}
// get the similarity ratio of two strings
public float getSimilarityRatio(String source, String target) {
return 1 - (float) edit(source, target)
/ Math.max(source.length(), target.length());
}
//main
public static void main(String[] args) {
SimilarityCalculate sc = new SimilarityCalculate();
String source = "中国";
String target = "中文";
System.out.println("Distance = " + sc.edit(source, target) +
"\tsimilarityRatio = " + sc.getSimilarityRatio(source, target));
source = "SUNNY";
target = "hgjdSUN";
System.out.println("Distance = " + sc.edit(source, target) +
"\tsimilarityRatio = " + sc.getSimilarityRatio(source, target));
}
}
Result
Distance = 1 similarityRatio = 0.5
Distance = 6 similarityRatio = 0.14285713
分享到:
相关推荐
`Levenshtein`库还支持对大型数据集进行批量处理,通过使用`distance_matrix()`函数可以一次性计算多个字符串对之间的距离。这在处理大量文本数据时非常有用。 总的来说,`Levenshtein`库是Python中一个强大的工具...
Aiming at the characteristics of Naxi language, a method is proposed for Naxi sentence similarity calculation. First, according to the characteristics of Naxi language that verbs set back, and nouns ...
除了`distance()`函数,`python-Levenshtein`还提供了其他有用的方法,如`ratio()`和`shortest_distance()`。`ratio()`返回两个字符串的相似度,值域在0到1之间,1表示完全相同。而`shortest_distance()`则返回所有...
- **Hybrid Word Similarity Calculation (HWSC) 方法**:这是一种混合词相似度计算方法,结合了HowNet(汉语知识库)和TongYiCi CiLin(同义词词林)两种资源。 - **HowNet**:提供了丰富的语义信息,包括词汇的...
在实际使用中,Levenshtein库主要通过`import Levenshtein`导入,然后可以使用其提供的函数,如`distance()`来计算两个字符串的编辑距离,或者使用`ratio()`来获取两个字符串的相似度比例。 例如: ```python ...
Sara Cohen在其2013年发表于SIGMOD的文章中,探讨了如何使用树编辑距离(Tree Edit Distance)来解决大规模树集合中的子树相似性搜索问题。 首先,文章定义了树编辑距离。在比较树结构时,编辑距离是指将一棵树转换...
推荐系统是互联网技术发展的一个重要分支,它通过智能分析用户行为和偏好,为用户主动提供个性化的信息和服务,极大提升了用户体验。在众多推荐系统技术中,协同过滤(Collaborative Filtering, CF)算法因其出色的...
5strComparer.similarity('A purple cow', 'A red cow');0.5833333333333333但是可以更改为对单词进行操作: var wordComparer = new Levenshtein({compare: 'words'});wordComparer.distance('A
Python中的`Levenshtein`库提供了多种计算Levenshtein距离的方法,如`distance`用于计算两个字符串的距离,`ratio`返回两个字符串的相似度(介于0和1之间),以及`editops`返回实现从一个字符串转换到另一个字符串的...
First, we propose an axiomatic definition of entropy for IVFS based on distance which is consistent with the axiomatic definition of entropy of a fuzzy set introduced by De Luca, Termini and Liu....
"Similarity.jar" 提供了三种经典的方法,方便开发者直接使用。下面将详细解释这些知识点: 1. **文本比对**:文本比对是指通过计算两个文本之间的相似度来确定它们的关联程度。在信息检索、自然语言处理、抄袭检测...
1. 各种字符串距离度量算法的实现,如Levenshtein距离、Jaccard相似度、Jaro-Winkler距离等。 2. 余弦相似度计算,可能包括对预处理后的词频向量进行处理的方法,如TF-IDF(词频-逆文档频率)转换。 3. 本体相关的...
from Levenshtein import distance, ratio, partial_ratio, similarity ``` 这些函数可以计算两个字符串之间的距离和相似度: - `distance(a, b)`:返回字符串a和b之间的编辑距离。 - `ratio(a, b)`:返回字符...
当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表... 下载 使用Maven: <groupId>info.debatty <artifactId>java-...
《Similarity V1.8.4 beta:音乐文件相似度检测工具详解》 在数字化的音乐世界里,我们经常遇到一个问题:如何有效地管理和查找重复或相似的音乐文件。"Similarity V1.8.4 beta"就是为此目的设计的一款强大工具,它...
4. 计算两字符串的相似度百分比:`similarity = (len(str1) - distance) / len(str1) * 100` 在实际应用中,`Levenshtein`库不仅可以用于比较单词,还可以用于比较整个句子、段落甚至文件,帮助识别文本的相似性。...
WordNet Similarity是自然语言处理领域中一个重要的工具,它主要用来衡量两个词语在语义上的相似程度。WordNet是一个大型英语词汇数据库,由多个层级的词汇网络组成,每个节点代表一个词汇,节点间通过各种关系...
2. **编辑距离(Levenshtein Distance)**:编辑距离是通过计算将一个字符串转换为另一个字符串所需的最少单字符编辑操作数来衡量两个字符串的相似度。这种算法主要用于比较短文本的相似性,如拼写检查。 3. **余弦...
WordNet::Similarity是CPAN(Comprehensive Perl Archive Network)社区提供的一款用于计算词汇语义相似度的程序包。在自然语言处理(NLP)领域,理解词语之间的语义关系对于许多任务至关重要,如信息检索、文本分类...