Java 计算两个字符串的相似度

问题

许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:
1.修改一个字符(如把“a”替换为“b”)。
2.增加一个字符(如把“abdd”变为“aebdd”)。
3.删除一个字符(如把“travelling”变为“traveling”)。
比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为可以通过增加/减少一个“g“的方式来达到目的。上面的两种方案,都仅需要一次操作。把这个操作所需要的次数定义为两个字符串的距离,给定任意两个字符串,你是否能写出一个算法来计算出它们的距离?

分析与解法

不难看出,两个字符串的距离肯定不超过它们的长度之和(我们可以通过删除操作把两个串都转化为空串)。虽然这个结论对结果没有帮助,但至少可以知道,任意两个字符串的距离都是有限的。
我们还是应该集中考虑如何才能把这个问题转化成规模较小的同样的问题。如果有两个串A=xabcdae和B=xfdfa,它们的第一个字符是相同的,只要 计算A[2,…,7]=abcdae和B[2,…,5]=fdfa的距离就可以了。但是如果两个串的第一个字符不相同,那么可以进行如下的操作(lenA 和lenB分别是A串和B串的长度):
1.删除A串的第一个字符,然后计算A[2,…,lenA]和B[1,…,lenB]的距离。
2.删除B串的第一个字符,然后计算A[1,…,lenA]和B[2,…,lenB]的距离。
3.修改A串的第一个字符为B串的第一个字符,然后计算A[2,…,lenA]和B[2,…,lenB]的距离。
4.修改B串的第一个字符为A串的第一个字符,然后计算A[2,…,lenA]和B[2,…,lenB]的距离。
5.增加B串的第一个字符到A串的第一个字符之前,然后计算A[1,…,lenA]和B[2,…,lenB]的距离。
6.增加A串的第一个字符到B串的第一个字符之前,然后计算A[2,…,lenA]和B[1,…,lenB]的距离。

在这个题目中,我们并不在乎两个字符串变得相等之后的字符串是怎样的。所以,可以将上面6个操作合并为:
1.一步操作之后,再将A[2,…,lenA]和B[1,…,lenB]变成相同字符串。
2.一步操作之后,再将A[1,…,lenA]和B[2,…,lenB]变成相同字符串。
3.一步操作之后,再将A[2,…,lenA]和B[2,…,lenB]变成相同字符串。

这样,很快就可以完成一个递归程序。

代码实现:

 

int calStringDis(string strA, int pABegin,int pAEnd,string strB, int pBBegin,int pBEnd)
{  
    if (pABegin > pAEnd)  
    {  
        if (pBBegin > pBEnd)  
            return 0;   
        else  
            return pBEnd - pBBegin + 1;  
    }  
    if (pBBegin > pBEnd)  
    {  
        if(pABegin > pAEnd)  
            return 0;  
        else  
            return pAEnd - pABegin + 1;  
    }  
    if (strA[pABegin] == strB[pBBegin])  
    {  
        return calStringDis(strA,pABegin+1,pAEnd,strB,pBBegin+1,pBEnd);  
    }  
    else  
    {  
        int t1 = calStringDis(strA,pABegin+1,pAEnd,strB,pBBegin+2,pBEnd);  
        int t2 = calStringDis(strA,pABegin+2,pAEnd,strB,pBBegin+1,pBEnd);  
        int t3 = calStringDis(strA,pABegin+2,pAEnd,strB,pBBegin+2,pBEnd);  
  
        return minValue(t1,t2,t3)+1;  
    }  
}
 

以上解法来自《编程之美》,有什么地方需要改进的呢?问题在于:在递归的过程中,有些数据被重复计算了。

很经典的可使用动态规划方法解决的题目,和计算两字符串的最长公共子序列相似。
设Ai为字符串A(a1a2a3 … am)的前i个字符(即为a1,a2,a3 … ai)
设Bj为字符串B(b1b2b3 … bn)的前j个字符(即为b1,b2,b3 … bj)
设 L(i,j)为使两个字符串和Ai和Bj相等的最小操作次数。
当ai==bj时 显然 L(i,j) = L(i-1,j-1)
当ai!=bj时 
 若将它们修改为相等,则对两个字符串至少还要操作L(i-1,j-1)次
 若删除ai或在bj后添加ai,则对两个字符串至少还要操作L(i-1,j)次
 若删除bj或在ai后添加bj,则对两个字符串至少还要操作L(i,j-1)次
 此时L(i,j) = min( L(i-1,j-1), L(i-1,j), L(i,j-1) ) + 1 
显然,L(i,0)=i,L(0,j)=j, 再利用上述的递推公式,可以直接计算出L(i,j)值。

代码实现:

int calculateStringDistance(string strA, string strB)
{
  int lenA = (int)strA.length()+1;
  int lenB = (int)strB.length()+1;
  int **c = new int*[lenA];
  for(int i = 0; i < lenA; i++)
    c[i] = new int[lenB];
  // Record the distance of all begin points of each string
  //初始化方式与背包问题有点不同
  for(int i = 0; i < lenA; i++) c[i][0] = i;
  for(int j = 0; j < lenB; j++) c[0][j] = j;
  c[0][0] = 0;
  for(int i = 1; i < lenA; i++)
  {
  for(int j = 1; j < lenB; j++)
  {
    if(strB[j-1] == strA[i-1])
      c[i][j] = c[i-1][j-1];
    else
      c[i][j] = minValue(c[i][j-1], c[i-1][j], c[i-1][j-1]) + 1;
  }
  }
  int ret =  c[lenA-1][lenB-1];
  for(int i = 0; i < lenA; i++)
    delete [] c[i];
  delete []c;

  return ret;
}

 

 


参考:
http://www.cnblogs.com/yujunyong/articles/2004724.html

http://www.cnblogs.com/flyinghearts/archive/2011/03/22/1991988.html

 

 

计算文本相似度-java实现 源代码: Computeclass.java: /** * @author Caiyong * @version 1.0 * * */ package pack; import java.text.NumberFormat; import java.util.Locale; public class Computeclass { /* * 计 阅读详情

相关推荐

java算法(1)---余弦相似度计算字符串相似率

功能需求:最近在做通过爬虫技术去爬取各大相关网站的新闻,储存到公司数据中。这里面就有一个技术点,就是如何保证你已爬取的新闻,再有相似的新闻 或者一样的新闻,那就不存储到数据库中。(因为有网站会去引用其它网站新闻,或者把其它网站新闻拿过来稍微改下内容就发布到自己网站中)。 解析方案:最终就是采用余弦相似度算法,来计算两个新闻正文的相似度。现在自己写一篇博客总结下。 一、理论知识 对于余弦相似度算法的理论讲的比较清晰,我们也是按照这个方式来计算相似度的。 1、说重点 ...

Java76476434341的博客 768

基于Java的文本相似度计算

目录1. 前言1.1 开发环境:1.2 初步设想1.3 参考资料2. HanLP2.1 在Java中使用HanLP库2.2 分词函数3. 双文本对比3.1 步骤分解3.2 完整代码 1. 前言 最近在做一个基于SSM的Web项目,其中有一项功能是 对相似文本进行合并 ,其中涉及的相似度阈值可由系统用户指定。在此将实现过程记录下来。 1.1 开发环境: 名称 版本 操作系统 Win10 X64 JDK 1.8.0_144 InteIliJ IDEA 2020.1 Tomcat 9.

m0_56706908的博客 8796

java 计算字符串相似度

java 计算字符串相似度

Java实现计算两个字符串的相似度:杰卡德、编辑距离、余弦相似度......

如果你想要通过余弦相似度比较两个字符串list的相似度,你可以使用SimMetrics提供的余弦相似度对象,然后对两个list中的每个字符串调用compare方法,得到一个相似度分数。一般来说,如果你想要比较两个文本或者语言数据的语义或者主题上的相似度,你可以使用余弦相似度,因为它可以捕捉到词语之间的关联性和共现性。如果你想要比较两个文本或者语言数据的拼写或者结构上的相似度,你可以使用编辑距离,因为它可以捕捉到词语之间的差异和变化。总之,余弦相似度和编辑距离都有各自的优缺点,没有一个绝对好或者坏的方法。

qq_58202163的博客 4600

STM32F407与W5100S的SPI通信实战:从硬件连接到TCP服务器搭建

本文详细介绍了STM32F407微控制器通过SPI接口驱动W5100S以太网模块,并搭建TCP服务器的完整实战过程。内容涵盖硬件连接、SPI驱动配置、网络参数设置及Socket编程,重点解析了SPI通信时序、W5100S寄存器操作和TCP连接管理,为嵌入式网络通信开发提供实用指南。

weixin_29173777的博客 194

告别CAPL编程!用Matlab/Simulink+CANoe实现复杂ECU仿真的5个技巧

本文介绍了如何利用Matlab/Simulink与CANoe进行联合仿真,以替代复杂的CAPL编程,高效实现复杂ECU仿真。文章分享了5个核心技巧,涵盖信号映射、模型编译集成、实时参数调整、性能优化及数据分析,帮助算法工程师构建稳定强大的仿真环境,显著提升开发与测试效率。

rgv234567的博客 296

Java字符串相似度计算库教程

Java字符串相似度计算库教程 1. 项目介绍 Java字符串相似度 是一个强大的Java库,它封装了多种用于评估字符串之间相似度和距离的算法。这个库允许开发者通过不同的方法来比较字符串的相似性,包括但不限于Levenshtein距离、Jaro-Winkler相似度、n-gram、Q-gram、Jaccard指数、最长公共子序列、编辑距离以及余弦相似性等。它是处理文本数据时分析相似度的理想工具,广...

gitblog_00734的博客 1262

Transformer代码(Pytorch实现和详解)!!!

这个是第一版,有些代码如果不对,欢迎在评论指正,后续会慢慢改,我也是刚接触transformer,若有些地方理解不对还请指正。

xml的博客 5613

java计算字符串的相似度

Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名。不会拼读,可以叫它edit distance(编辑距离)。  原理很简单,就是返回将第一个字符串转换(删除、插入、替换)成第二个字符串的编辑次数。次数越少,意味着字符串相似度越高      Levenshtein distance可以用来:  Spe

fyddaben的专栏 1029

使用Hyper-V使用下载下来的macOS安装引导安装macos

然后关闭工具返回安装界面选择第二个reinstall,选择119g那个硬盘。我的资源上传了:macOS Monterey on Hyper-V.7z。设置固件的启动顺序,引导安装盘放到第一位,mac安装110g放第二。选择disk utility格式化那个110g。下载解压的macos引导挂载到虚拟硬盘。其他设置安全禁用,检查禁用,集成都选中。新建一个虚拟硬盘装mac,110g。

viviliving的专栏 3024

LibreNMS实战:5分钟搞定Docker部署与中文配置(附常见问题排查)

本文详细介绍了如何使用Docker在5分钟内快速部署LibreNMS,并完成中文界面优化。从环境准备到容器启动,再到中文语言包安装和系统配置调整,提供了完整的实战指南。同时,文章还包含常见问题排查和性能调优建议,帮助用户高效搭建网络监控系统。

e1f2g的博客 1281

Java 计算两个字符串的相似度 CosineSimilarity实现

最近遇到需要校验字符串的相似度的需求,遂经常调研查询资料发现,类提供可以匹配两个字符串的相似度。沉淀下来,雕琢技术~

阿飞的博客 1398

SLAM工程师面试避坑指南:2025年最新高频考点与实战代码解析

本文为SLAM工程师提供2025年最新面试避坑指南,涵盖高频技术考点如VINS初始化、三维几何处理、多传感器融合架构设计等,并包含实战代码解析。特别针对算法工程师面试中的常见陷阱,提供系统设计框架和代码模板,帮助求职者提升通过率。

metaverse5vr的博客 246

java 计算字符串的相似度_java字符串相似度算法

本文实例讲述了java字符串相似度算法。分享给大家供大家参考。具体实现方法如下:public class Levenshtein {private int compare(String str, String target) {int d[][]; // 矩阵int n = str.length();int m = target.length();int i; // 遍历str的int j; //...

weixin_33816685的博客 942

2023.03.27更新大麦网PC端抢购软件和使用教程

近期发现大麦网页端抢购页面悄然发生变化,之前可以在页面选择票价、档次,并且点击按钮进行购票,现在不行了,新的页面如下图所示。已经安全没有了点击按钮,因此,但是并不代表不能像以前之前那样。

猫敷雪 1万+

EUV光源技术路线深度解析

EUV光刻技术的关键瓶颈在于13.5纳米光源的稳定高效获取。主流技术路线从DPP放电等离子体发展为LPP激光等离子体方案,后者通过激光轰击锡液滴实现更高功率输出。新出现的LDP技术综合激光预热与放电优势,虽功率扩展性有限,但为光源技术提供了有益补充。目前LPP仍是唯一通过量产验证的方案,而LDP可能作为过渡技术应用于特定场景。EUV光源的发展实质是能量转化效率与系统可靠性的持续优化过程,各种技术路线的探索共同推动着这一核心工艺的进步。

硬核科技 557

java计算两个字符串的相似度方法

java计算两个字符串的相似度

NaiveFox的博客 423

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java 实现字符串相似度_java中如何计算两个字符串的相似度?

发现apache提供了现成的解决方案1.Cosine similaritypackage org.apache.commons.text.similarity;import java.util.HashSet;import java.util.Map;import java.util.Set;/*** Measures the Cosine similarity of two vectors of...

weixin_39522408的博客 684

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java字符串相似度计算库常见问题解决方案

Java字符串相似度计算库常见问题解决方案 项目基础介绍 本项目是一个Java库,用于实现几种计算两个字符串之间相似度的算法。这些算法可以返回一个归一化的距离或相似度评分,分数范围为0到1。其中0分代表两个字符串完全不相似,1分代表两个字符串完全相同。本项目主要用于文本分析、自然语言处理等领域,帮助开发者快速实现字符串相似度计算功能。主要编程语言为Java。 新手常见问题及解决步骤 问题1:如何引...

gitblog_00925的博客 422

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java 计算字符串的相似度_Java:计算字符串相似度的度量

这种方法是我程序的瓶颈。 (或者,至少在大部分时间用完了。)其目的是根据字符在两者中出现的方式计算两个字符串之间的相似性,或者在一个字符串中出现或不出现在另一个字符串中。代码是正确的,但我想优化它。您是否看到任何低效率,不良做法或不必要的复杂性?(不要担心Gene类。这里真正关注的是Genes携带的字符串。)public static int simpleScore(Gene g0, Gene g...

weixin_30974667的博客 539

java如何判定abc与abcd相似_java计算字符串的相似度方法实例

java计算字符串的相似度方法实例。《编程之美》,参阅了其中的——计算字符串的相似度许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:1.修改一个字符(如把“a”替换为“b”)。2.增加一个字符(如把“abdd”变为“aebdd”)。3.删除一个字符(如把“travelling”变为“traveli...

weixin_39543647的博客 308

java实现编辑距离算法,计算字符串相似度

这是Levenshtein Distance算法的java实现,另外oracle 10g r2当中好像自带了这样的函数,utl_match包当中 public class LD {  /**       * 计算矢量距离       * Levenshtein Distance(

hjay0715的专栏 3195

Java 计算字符串相似度——Levenshtein

介绍:莱茵斯坦距离 计算相似度 先取两个字符串长度的最大值maxLen,用需要操作数除maxLen,得到相似度。           例如abc和abe 一个操作,长度为3,所以相似度为1/2=0.666 public class CharacterStringAcquaintanceDegree { /** * 莱茵斯坦距离——相似度计算 * * @param 参数1 ...

weixin_44401989的博客 2138

java算法 字符串的相似度计算

private static int compare(String str, String target) { int d[][]; // 矩阵 int n = str.length(); int m = target.length(); int i; // 遍历str的 int j; // 遍历target的 char ch1; // str的 char ch2; // target的 ..

Escaper的博客 352

3个版本的计算字符串的相似度. js C# java

**计算字符串的相似度. javascript版**/** *   * 检查两个字符串的相似度 * 可以用在 DNA分析   拼字检查   语音辨识   抄袭侦测 * @createTime 2012-1-12 */ function SimilarityDegree(str1, str2) { //计算两个字符串的长度。 var l

走错路的程序员 4709

java数组相似度_Java 计算两个字符串的相似度

问题许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程度。我们定义了一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:1.修改一个字符(如把“a”替换为“b”)。2.增加一个字符(如把“abdd”变为“aebdd”)。3.删除一个字符(如把“travelling”变为“traveling”)。比如,对于“abcdefg”和“abcdef”两个字符串来说,我们认为...

weixin_39581719的博客 361
上一篇: Node.js安装和入门 - 2行代码让你能够启动一个Server
下一篇: (Eclipse)设置JVM参数,查看堆大小
iteye_4921
博客等级 码龄8年 25粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值