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

这篇具有很好参考价值的文章主要介绍了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);
    }
  • 结果

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

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

  • 见:https://www.cnblogs.com/kakarotto-chen/p/17752256.html

  • 测试

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

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

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

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

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

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

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

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

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

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实现两字符串相似度算法文章来源地址https://www.toymoban.com/news/detail-750193.html

到了这里,关于Java实现两字符串相似度算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【dp】不同的子序列 & 两个字符串的删除操作 & 编辑距离

    dp[i][j]:以j-1为结尾的t出现在以i-1为结尾的s子序列的个数 需要开辟m+1行,n+1列的二维数组 为啥状态方程是: s[i] == t[j] 时 dp[i][j] = dp[i-1][j-1] + dp[i-1][j] s[i] != t[j] 时 dp[i][j] = dp[i-1][j] 先看s[i] == t[j] 时,以s = “rara” t = “ra” 为例,当i = 3, j = 1时,s[i] == t[j] 此时分为2种情况:

    2023年04月15日
    浏览(28)
  • LeetCode | C++ 动态规划——583. 两个字符串的删除操作、72. 编辑距离

    583题目链接 做法一: 本题和1143.最长公共子序列基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。 做法二: 本题和115.不同的子

    2024年02月16日
    浏览(38)
  • 面试算法117:相似的字符串

    如果交换字符串X中的两个字符就能得到字符串Y,那么两个字符串X和Y相似。例如,字符串\\\"tars\\\"和\\\"rats\\\"相似(交换下标为0和2的两个字符)、字符串\\\"rats\\\"和\\\"arts\\\"相似(交换下标为0和1的字符),但字符串\\\"star\\\"和\\\"tars\\\"不相似。 输入一个字符串数组,根据字符串的相似性分组,请问

    2024年02月02日
    浏览(25)
  • 代码随想录第五十六天——两个字符串的删除操作,编辑距离

    题目链接:两个字符串的删除操作 两个字符串可以相互删除 版本一: 确定dp数组及下标的含义 dp[i][j] :以i-1为结尾的字符串word1,和以j-1为结尾的字符串word2,想要达到相等,所需要删除元素的最少次数 确定递推公式 (1)当word1[i - 1] 与 word2[j - 1]相同: (2)当word1[i - 1] 与

    2024年02月02日
    浏览(24)
  • 代码随想录打卡第56天|583. 两个字符串的删除操作;72. 编辑距离

    583. 两个字符串的删除操作 关键点1:dp数组的含义 dp[i][j],使得以i-1为结尾word1 和 以j-1为结尾的word2 相同所需的最小步数; 关键点2:递归公式的推导 if(nums1[i-1] == nums2[j-1]),则i和j同时移动,所以为i-1,j-1;dp[i][j] = dp[i-1][j-1];由于不需要进行删除操作,所以不需要加1 如果不相

    2023年04月19日
    浏览(33)
  • Python实现字符串相似度比较

    Python实现字符串相似度比较 在日常的开发中,我们可能需要对不同的字符串进行比较,以判断它们之间的相似程度。例如,在搜索引擎、拼写检查和数据清洗等任务中,字符串相似度比较是一项非常重要的技术。本文将介绍如何使用Python实现字符串相似度比较。 概述 字符串

    2024年02月06日
    浏览(30)
  • 使用Java实现高效的字符串匹配算法

    摘要:字符串匹配是计算机领域中的一个重要问题,有着广泛的应用场景。在本篇博客文章中,我们将介绍几种高效的字符串匹配算法,并给出使用Java语言实现的代码示例,希望能对读者理解和应用这些算法有所帮助。 一、KMP算法 KMP算法(Knuth-Morris-Pratt算法)是一种经典的

    2024年02月16日
    浏览(26)
  • Java算法题 给一个字符串表达式,实现一个基本计算器,返回计算结果

    题目: 考点:栈 解题思路: 使用 2 个栈,一个 stack_nums 用来保存计算过程的操作数,一个 stack_symbol 用来保存运算符。 在HashMap中,指定加减优先级为1,乘除优先级为2 循环遍历字符串s, 操作符入栈: 若当前字符为\\\'+\\\', \\\'-\\\', \\\'*\\\', \\\'/\\\', \\\'(\\\' 时,压入运算符栈 stack_symbol, 操作数入

    2024年02月07日
    浏览(35)
  • Java中使用JTS实现WKT字符串读取转换线、查找LineString的list中距离最近的线、LineString做缓冲区扩展并计算点在缓冲区内的方位角

    Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等): Java中使用JTS对空间几何计算(读取WKT、距离、点在面内、长度、面积、相交等)_jts-core_霸道流氓气质的博客-CSDN博客 Java+GeoTools实现WKT数据根据EPSG编码进行坐标系转换: Java+GeoTools实现WKT数据根据

    2024年02月09日
    浏览(30)
  • Python 中的字符串匹配识别文本中的相似性

    更多Python学习内容:ipengtao.com 字符串匹配是自然语言处理(NLP)和文本处理中的一个重要任务,它可以识别文本之间的相似性、找到相同或相似的模式,以及进行文本分类和信息检索等应用。本文将深入探讨Python中的字符串匹配技术,包括基本的字符串比较方法、正则表达式

    2024年01月18日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包