编辑距离算法

  • 前言
  • 原理
    • 公式
    • 例子
  • 实现
  • 后记

前言

比较两个字符串的相似度,通常我们会使用编辑距离算法来实现。
下面是常用字符串相似度计算的方法:
字符串相似度的几种度量方法

原理

最小编辑距离的原理是: 比较两个字符串,记录一个字符串通过移除,替换,添加操作转换到指定字符串的次数,来确定两个字符串直接的相似度。

公式

(操作次数)/ Math.max(str.length, str.length)  = 相似度

例子

字符串1: bsada
字符串2: asqa

我们想把字符串2 变成字符串1 那么步骤如下:
bsada -> asada -> asda -> asqa 这里要经过3步操作,所以相似度就是 3/5 = 0.6
当然你也可以这样操作
bsada -> asada -> asqda -> asqd -> asqa 如果这样子做的话要经过4步操作。

所以此算法的核心就是求最小的操作次数,其实可以用矩阵来表示:

b s a d a
0 1 2 3 4 5
a 1 1 2 2 3 4
s 2 2 1 2 3 4
q 3 3 2 2 3 4
a 4 4 3 2 3 3

通过表格分析我们能发现:最小距离的规则如下:

  • 如果两字符相等则取左上角的数
  • 如果两字符不相等则取上,左,左上角的最小数加一

实现

    /*** 字符串相似度比较* 这里为了使空间使用率较高,* 请把字符串较短的放到str1参数** @param str1 字符串1* @param str2 字符串2* @return 相似度*/public static BigDecimal getLevenshteinDistance(String str1, String str2) {char[] char1 = str1.toCharArray();char[] char2 = str2.toCharArray();int[] distance = new int[str1.length() + 1];int[] nextDistance = new int[distance.length];distance[0] = 0;//distance 初始化for (int i = 1; i < distance.length; i++) distance[i] = i;//这里不全量构造矩阵,节省空间for (int i = 0; i < char2.length; i++) {nextDistance[0] = i + 1;for (int j = 0; j < char1.length; j++) {int val;if(char2[i] == char1[j]) { //如果两个值相等,就取左上角元素val = distance[j];} else { //两值不相等时,取左上角,上面,左面元素的最小值 + 1int slash = distance[j] + 1;int left = distance[j + 1] + 1;val = Math.min(slash, left);val = Math.min(val, nextDistance[j] + 1);}nextDistance[j + 1] = val;}System.arraycopy(nextDistance, 0, distance, 0, distance.length);}return BigDecimal.valueOf(1d).subtract(BigDecimal.valueOf((double) nextDistance[nextDistance.length - 1]/Math.max(str1.length(), str2.length())));}

后记

编辑距离算法确实在一定程度上可以检测出两个字符串的相似度,但是对于不关心字符顺序的匹配可能并不合适,比如abcd -> dcba 经过此算法计算的结果是0

字符串相似度算法(编辑距离算法)相关推荐

  1. 字符串相似度之编辑距离算法

    字符串编辑距离: 是一种字符串之间相似度计算的方法.给定两个字符串S.T,将S转换成T所需要的删除,插入,替换操作的数量就叫做S到T的编辑路径.而最短的编辑路径就叫做字符串S和T的编辑距离. 举个例子 ...

  2. 【python】字符串相似度:编辑距离算法

    编辑距离算法 即MED(Minimum Edit Distance)算法,由俄罗斯的 Vladimir Levenshtein 在1965年提出,故又称Levenshtein距离. 所谓编辑距离,指的 ...

  3. 字符串相似度匹配算法python_算法字符串相似度得分/哈希

    有趣的问题.我在这一领域的经验有限,但由于Levenshtein距离满足三角形不等式,我认为必须有一种方法来计算到原点的某种绝对距离,以便在不与整个数据库中的所有条目进行直接比较的情况下找到彼此邻近的 ...

  4. python 字符串相似度判断详解

    1. 背景介绍 最近项目中要用到两个字符串相似度的求解算法,来矫正ocr文本识别的结果,进而提高识别的准确率,通过矫正(相当于模糊查询),识别准确率从65%上升到90%.其结果还是令人兴奋的,因此写博 ...

  5. java实现编辑距离算法(levenshtein distance),计算字符串或者是文本之间的相似度【附代码】

    编辑距离算法其实就是,在规定的编辑操作(替换字符串.插入字符串.删除字符串)中,经过几步可以把一个字符串变成另一个字符串,而这个所需的步数就是你的编辑距离. 测试样例: str1 = abc str2 ...

  6. Java获取相同字符串算法题,数据结构与算法专题——第四题 字符串相似度

    这篇我们看看 最长公共子序列 的另一个版本,求字符串相似度(编辑距离),我也说过了,这是一个非常实用的算法,在DNA对比,网页聚类等方面都有用武之地. 一:概念 对于两个字符串 A 和 B,通过基本的 ...

  7. 数据结构与算法专题——第四题 字符串相似度

    这篇我们看看 最长公共子序列 的另一个版本,求字符串相似度(编辑距离),我也说过了,这是一个非常实用的算法,在DNA对比,网页聚类等方面都有用武之地. 一:概念 对于两个字符串 A 和 B,通过基本的 ...

  8. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...

    1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的.而最长公共子序列则并不要求连续. 2.最长公共子串 其实这是一个序贯决策问题 ...

  9. 字符串相似度计算工具和算法

    一.fuzzywuzzy 介绍:JavaWuzzy是Java版的FuzzyWuzzy,用于计算字符串之间的匹配度. FuzzySearch.ratio(String s1, String s2) 全匹 ...

最新文章

  1. Graphviz样例之无向图
  2. 第k大 or 第k小 or 中位数
  3. 中国力量占领KDD:包揽“大数据领域世界杯”全部冠亚军,北航拿下最佳学生论文奖...
  4. h5 img js 点击图片放大_5分钟学会h5生成图片海报!
  5. Hadoop Writable机制
  6. parameter localparam define的区别
  7. IIs管理服务一直启动失败的原因之一
  8. 峰Redis学习(8)Redis 持久化AOF方式
  9. linux 备份mysql并上传_Linux 网站目录和MySQL备份并上传FTP
  10. java 作业 老师与教员信息 类与对象
  11. TextScanner:旷视新作文字识别新突破,确保字符阅读顺序
  12. Adobe Photoshop/Adobe Dreamwear/您此时无法使用此产品。您必须问题解决办法FLEXnet Licensing Service服务
  13. 安卓手机软件开发_你想拿高薪吗?想成为手机软件开发工程师吗?圆你5g梦想!...
  14. es6 filter方法_[ 翻译 ] ES6中数组去重的三种方法
  15. 山体滑坡动画用什么软件制作_做施工动画是用什么软件来做
  16. 《如何让你爱的人爱上你》第一部分:第一印象
  17. 网络流量分析netflow
  18. matlab给定振形用图表示,基于 MATLAB 的简谐振动合成图形的动态演示
  19. 服务器文档分类,服务器的分类
  20. sql语句中的子查询

热门文章

  1. shopee,lazada,etsy店群如何高效安全的管理
  2. 养老机构智能视频监控解决方案,用新技术助力养老院智慧监管
  3. Unity学习(C#)——this和base、抽象类
  4. “嫦娥四号”首拍月球背面照 香港理大助研发相机系统
  5. Mobox企业网盘支持对象存储帮助用户推进私有云
  6. c语言割线法解非线性方程,求解非线性方程组的割线法.pdf
  7. while读取文件 Shell中while循环的陷阱, 变量实效, 无法赋值变量
  8. 世导邢郁:互联网将变成一个云计算中心
  9. window 10 电脑创建共享文件夹
  10. 标签制作软件如何批量制作DotCode码