Java实现两字符串相似度算法
1、编辑距离
编辑距离:是衡量两个字符串之间差异的度量,它表示将一个字符串转换为另一个字符串所需的最少编辑操作次数(插入、删除、替换)。
2、相似度
计算方法可以有多种,其中一种常见的方法是将编辑距离归一化为0到1之间的范围(归一化编辑距离(Normalized Edit Distance)),将编辑距离除以较长字符串的长度。这样可以将相似度表示为一个百分比,其中0表示完全不相似,1表示完全相似。
请注意,这种归一化方法并不是唯一的,也不适用于所有情况。在实际应用中,你可以根据具体需求选择适合的相似度计算方法。例如,Jaro-Winkler相似度算法和Cosine相似度算法等都是常用的字符串相似度计算方法,它们不一定使用编辑距离作为基础。
3、相似度分类、测试
- 归一化编辑距离(Normalized Edit Distance)
- Jaro-Winkler相似度
- 余弦相似度(Cosine Similarity)
3.1、归一化编辑距离(Normalized Edit Distance)
解释:常用的,将编辑距离归一化为0到1之间的范围
使用、测试
String str1 = "h1e2l3l4o";
String str2 = "ddddhello";
//归一化编辑距离
@Test
void contextLoads() {
// commons-text 包:根据编辑距离计算:相似度
int editDistance = LevenshteinDistance.getDefaultInstance().apply(str1, str2);
double similarity = 1 - ((double) editDistance / Math.max(str1.length(), str2.length()));
System.out.println("commons-text 包:Edit Distance: " + editDistance);
System.out.println("commons-text 包:Similarity: " + similarity);
}
- 结果

3.1.1、数据库Oracle/DM实现的归一化编辑距离
-- oracle/dm实现的归一化编辑距离
SELECT UTL_MATCH.edit_distance_similarity ('h1e2l3l4o', 'ddddhello') AS similarity
- 结果

3.2、Jaro-Winkler相似度
解释:我也看不懂,自行取用:https://www.jianshu.com/p/a4af202cb702
使用、测试
String str1 = "h1e2l3l4o";
String str2 = "ddddhello";
//Jaro-Winkler相似度
@Test
public void test03()throws Exception{
JaroWinklerSimilarity js = new JaroWinklerSimilarity();
System.out.println("Jaro-Winkler相似度: " + js.apply(str1, str2));
}
- 结果

3.3、余弦相似度(Cosine Similarity)
- 解释:我也看不懂,自行取用
余弦相似度(Cosine Similarity)是通过计算两个向量之间的夹角来衡量它们的相似度。在这种情况下,我们可以将字符串视为向量,其中每个字符对应一个维度。
对于左边字符串"h1e2l3l4o"和右边字符串"hello",我们可以将它们表示为以下向量:
左边字符串向量:[1, 2, 3, 4, 5]
右边字符串向量:[1, 1, 1, 1, 1]
为了计算余弦相似度,我们需要计算这两个向量的点积和它们的模长。点积表示两个向量之间的相似程度,模长表示向量的长度。
左边字符串向量的模长:sqrt(1^2 + 2^2 + 3^2 + 4^2 + 5^2) = sqrt(55)
右边字符串向量的模长:sqrt(1^2 + 1^2 + 1^2 + 1^2 + 1^2) = sqrt(5)
左边字符串向量和右边字符串向量的点积:11 + 21 + 31 + 41 + 51 = 1 + 2 + 3 + 4 + 5 = 15
根据余弦相似度的公式,余弦相似度可以计算为点积除以两个向量的模长的乘积:
余弦相似度 = 点积 / (左边字符串向量的模长 右边字符串向量的模长)
= 15 / (sqrt(55) sqrt(5))
≈ 0.745
因此,左边字符串"h1e2l3l4o"和右边字符串"hello"的余弦相似度约为0.745。
- 测试、使用
String str1 = "h1e2l3l4o";
String str2 = "ddddhello";
//余弦相似度
@Test
public void test02()throws Exception{
// commons-text 包
// 使用Cosine计算两个字符串的余弦距离
CosineDistance cd = new CosineDistance();
Double apply = cd.apply(str2, str1);
System.out.println("Cosine相似度:" + apply);
}
- 结果:不知道对不对

4、总结
- 上述三种的简单介绍:
- 其他相似度
1. 编辑距离(Edit Distance):衡量两个字符串之间的差异,通过计算插入、删除和替换操作的最小次数来确定相似度。
2. Hamming距离(Hamming Distance):用于比较两个等长字符串之间的差异,计算在相同位置上不同字符的数量。
3. Damerau-Levenshtein距离:类似于编辑距离,但允许交换相邻字符的操作。
4. Jaccard相似度(Jaccard Similarity):用于比较集合之间的相似度,计算两个集合的交集与并集的比值。
5. Sørensen-Dice相似度:类似于Jaccard相似度,但计算两个集合的两倍交集与两个集合的元素总数之和的比值。
6. Smith-Waterman算法:用于比较两个字符串之间的相似性,主要用于序列比对和字符串匹配。
7. Longest Common Subsequence(LCS):计算两个字符串之间最长公共子序列的长度,用于衡量字符串的相似性。
8. N-gram相似度:将字符串分割为连续的N个字符片段,比较两个字符串之间的N-gram的相似性。
9. Cosine相似度(余弦相似度):用于比较两个向量之间的夹角,常用于文本相似度计算。
- 都是使用:Apache Commons Text:1.11.0包
// 实现字符串相似度算法的包
implementation 'org.apache.commons:commons-text:1.11.0'

Java实现两字符串相似度算法的更多相关文章
- 百度面试题 字符串相似度 算法 similar_text 和页面相似度算法
在百度的面试,简直就是花样求虐. 首先在面试官看简历的期间,除了一个自己定义字符串相似度,并且写出求相似度的算法. ...这个确实没听说过,php的similar_text函数也是闻所未闻的.之前看s ...
- 字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)
在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个 ...
- 字符串相似度算法(编辑距离算法 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 ...
- Levenshtein距离【编辑距离算法】字符串相似度算法
指两个字串之间,有一个转成另一个所需的最少编辑操作的次数. 算法过程 str1或str2的长度为0返回另一个字符串的长度. if(str1.length==0) return str2.length; ...
- C#实现字符串相似度算法
字符串的相似性比较应用场合很多,像拼写纠错.文本去重.上下文相似性等. 评价字符串相似度最常见的办法就是: 把一个字符串通过插入.删除或替换这样的编辑操作,变成另外一个字符串,所需要的最少编辑次数,这 ...
- 计算字符串相似度算法——Levenshtein
转自:http://wdhdmx.iteye.com/blog/1343856 0.这个算法实现起来很简单 1.百度百科介绍: Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个 ...
- 字符串相似度算法——Levenshtein Distance算法
Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...
- 字符串相似度算法-LEVENSHTEIN DISTANCE算法
Levenshtein Distance 算法,又叫 Edit Distance 算法,是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一 ...
随机推荐
- Nextcloud允许不被信任的域访问 取消 trusted domains
在服务器部署了Nextcloud,由于测试需要,经常从不同的地址访问,但是每次访问都要把域名添加到受信任域,反反复复修改也挺麻烦,暂时又没找到通配符或者禁用的方法. 不过网上提供了一个替代方法,动态生 ...
- pandas 某列不为空的行
df = df[df['my_col'].notnull()]
- Redis从入门到放弃(6):持久化
1.引言 Redis作为一种高性能的内存数据存储系统,常被用作缓存.会话存储.消息队列等多种应用场景.然而,由于其数据存储在内存中,一旦发生意外或服务器重启,数据就会丢失.为了保障数据的持久性和安全性 ...
- nginx搭建静态文件下载服务器
配置文件大致内容 server { # 监听8001端口 listen 8001; server_name 192.168.0.2; # 指定使用utf8的编码 charset utf-8; # 内容 ...
- MongoDB索引操作和执行计划Explain()详解
一.索引操作 说明,下面的内容举例时,以"dailyTrip"collection为例. 字段内容如下: { "_id" : ObjectId("63 ...
- 《Web安全基础》01. 基础知识
@ 目录 1:概念名词 1.1:域名 1.2:DNS 1.3:网站开发语言 1.4:后门 1.5:Web 1.6:Web 相关安全漏洞 2:数据包 2.1:HTTP 2.2:HTTPS 2.3:请求数 ...
- 《SQL与数据库基础》17. InnoDB引擎
目录 InnoDB引擎 逻辑存储结构 架构 内存结构 磁盘结构 后台线程 事务原理 事务基础 redo log undo log MVCC 基本概念 隐式字段 undo log版本链 readView ...
- (洛谷P4213)杜教筛
https://www.cnblogs.com/Mychael/p/8744633.html #pragma GCC optimize(3, "Ofast", "inli ...
- 后端常用的Linux命令大全,建议收藏
引言 作为一名后端工程师,使用终端是一种常见的做法,也是你应该学习的技能.许多命令和实用程序可以帮助你在使用 Linux 时更有效地完成任务. 基本 Linux 命令 如果你想使用 Linux 操作系 ...
- skynet的timer似乎有问题
skynet.timeout 传进去 number 范围内的数值但是会溢出, 调查发现 skynet.timeout 调用的是 c 的方法: c.intcommand("TIMEOUT&qu ...