首页 > 编程语言 >Java实现两字符串相似度算法

Java实现两字符串相似度算法

时间:2023-11-10 11:48:28浏览次数:120  
标签: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);
    }
  • 结果

image

3.1.1、数据库Oracle/DM实现的归一化编辑距离

-- oracle/dm实现的归一化编辑距离
SELECT UTL_MATCH.edit_distance_similarity ('h1e2l3l4o', 'ddddhello') AS similarity 
  • 结果

image

3.2、Jaro-Winkler相似度

    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));
    }
  • 结果

image

3.2.1、oracle/dm实现的:Jaro-Winkler相似度算法

  • 和Java中的一模一样
-- oracle/dm实现的:Jaro-Winkler相似度算法
SELECT UTL_MATCH.JARO_WINKLER_SIMILARITY('h1e2l3l4o', 'ddddhello') AS JaroWinkler相似度;

image

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);
    }
  • 结果:不知道对不对

image

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'

image

标签:Java,距离,余弦,算法,相似,归一化,字符串,向量
From: https://www.cnblogs.com/kakarotto-chen/p/17822394.html

相关文章

  • 工程车识别AI视觉算法方案
    工程车识别AI视觉算法方案https://mp.weixin.qq.com/s/jXXTZCcFNrZUtpzVyQ4wCg工程车识别AI视觉算法方案原创 郭桂珊刘洲 OPENAIStore 2023-10-2514:14 发表于广东收录于合集#智慧交通5个#算法20个#ai20个工程车识别算法主要用于城市道路、建筑工地等有禁止......
  • Java起源
    sun公司诞生sun初始的全名是“斯坦福大学网络”,它崛起于1982年的斯坦福大学校园的几个校友之手。sun公司1986年上市,它曾经在硅谷确立了与微软,惠普,思科一样的江湖地位2009年4月21日,甲骨文以74亿美元收购sunJava的前身1991年sun公司发起了一个绿色计划,由詹姆斯高斯林领导这个计......
  • 【算法题】吃糖问题
    题干:一个人一次可以吃1颗糖,也可以吃2颗糖,也可以同时吃下n颗糖。求这个人吃完n颗糖有多少种方式。functionfindWayEatSugarNumber(n){constwayArr=findWayEatSugar(n);constreturnArr=wayArr.map((ele)=>ele.sort()).map((ele)=>ele.join());......
  • Springboot报错,java.lang.IllegalArgumentException: argument type mismatch
    1、报错信息java.lang.IllegalArgumentException:argumenttypemismatch atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod) atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) atsun.reflect.DelegatingMethodAccessorI......
  • 【数据处理脚本】字符串
    1.检测一个字符串内是否有中文#检测字符串是否含有中文defis_contain_chinese(check_str):forchincheck_str:ifu'\u4e00'<=ch<=u'\u9fff':returnTruereturnFalse 2.去除括号内容以及括号importre line=re.......
  • datax抽取mysql数据到hive报错:javax.net.ssl.SSLException: Connection reset
    datax抽取mysql数据报错:[INFO]2023-11-0912:35:14.090+0000-->2023-11-0920:35:13.492[0-0-0-reader]ERRORReaderRunner-ReaderrunnerReceivedExceptions:com.alibaba.datax.common.exception.DataXException:Code:[DBUtilErrorCode-07],Description:[......
  • 「Java开发指南」如何用MyEclipse搭建Spring MVC应用程序?(二)
    本教程将指导开发者如何生成一个可运行的SpringMVC客户应用程序,该应用程序实现域模型的CRUD应用程序模式。在本教程中,您将学习如何:从数据库表的Scaffold到现有项目部署搭建的应用程序在上文中,我们介绍了如何创建一个Web项目和来自数据库表的Scaffold等,本文将继续介绍如何部......
  • idea在win系统下打包Javafx程序
    1、idea--maven--lifecycle--install(生成jar);2、idea--maven--plugins--javafx--javafx:jlink(生成app.zip,在app目录下的app.bat可以脱离jdk环境运行);3、idea--maven--plugins--javafx---javafx:run(直接运行);4、在idea下终端terminal中直接执行语句即可根据.\target\app\生......
  • 阿里Java一面,难度适中!(下篇)
    上一次因为文章篇幅和个人精力有限的原因,只分享了淘天的前6道题及其答案(点击访问上一篇)。接下来,咱们把其他几道题面试题及答案也分享给大家。1.公司简介淘天集团就是“淘宝”+“天猫”的结合,其集团拥有淘宝、天猫、1688、闲鱼等商业品牌,并通过天猫国际、淘宝直播、天猫超市、......
  • Java_并发编程
    sleep(longn)和wait(longn)的区别1.sleep是Tread方法,而wait是Object的方法。2.sleep不需要强制和synchronized配合使用,但wait需要和synchronized配合使用。3.sleep在睡眠的同时,不会释放对象锁的,但wait在等待的时候会释放对象锁。相同点:1.它们的状态TIMED_WAITING。......