给定两个字符串如何判断它们的相似程度?常用的有两种方法:

  • 编辑距离(edit distance)
  • 最长公共子序列(LCS,longest common sequence)

解释两个概念:

  • 编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括:(1)将一个字符替换成另一个字符,(2)插入一个字符,(3)删除一个字符。
  • 相似度,等于“编辑距离+1”的倒数。

一开始,我看到编辑距离的代码时,差点以为就是最长公共子序列。后来才发现两者不太一样。
下面就递推公式进行解释,f[i][j]表示a[0:i]和b[0:j]两个串进行比较所得的结果。
最长公共子序列

  • a[i]==b[j]时,f[i][j]=f[i-1][j-1]+1
  • a[i]!=b[j]时,f[i][j]=max(f[i-1][j],f[i][j-1])

编辑距离

  • a[i]==b[j]时,f[i][j]=f[i-1][j-1]
    意思是,当a[i]==b[j]时,无需进行编辑操作
  • a[i]!=b[j]时,需要进行编辑操作,这是编辑可以从三种操作中进行选择:插入、删除、修改
    细分之,又可得到6种操作:
    在a[i]前面插入b[j],f[i][j]=f[i-1][j]+1
    在b[j]前面插入a[i],f[i][j]=f[i][j-1]+1
    删除a[i],f[i][j]=f[i-1][j]+1
    删除b[j],f[i][j]=f[i][j-1]+1
    修改a[i],使之等于b[j],f[i][j]=f[i-1][j-1]+1
    修改b[j],使之等于a[i],f[i][j]=f[i-1][j-1]+1
    显然,操作虽然是6种,但是结果却只有三种。
    如果选择插入操作,在a[i]前面插入一个字符b[j]。那么a[0:i-1]和b[0:j]字符都相同需要的编辑次数为f[i-1][j],所以f[i][j]=f[i-1][j]+1
    如果选择删除操作,把a[i]这个字符删除,这样一来b[j]就不用跟a[i]进行比较了。那么a[0:i]和b[0:j-1]字符都相同,需要的编辑次数是f[i][j-1],所以f[i][j]=f[i][j-1]+1
    如果选择修改操作,把a[i]改成b[j],那么a[0:i-1]和b[0:j-1]部分比较次数为f[i-1][j-1],所以f[i][j]=f[i-1][j-1]+1
    因为需要编辑次数尽量少,所以f[i][j]会从以上三种可行操作中选择一种花费最少的。
    也就是说,f[i][j]=min(f[i-1][j],f[i][j-1],f[i-1][j-1])+1
    显然,把上述在a中插入改为在b中插入、在a中删除改为在b中删除,所得到的递推式是一样的。

转载于:https://www.cnblogs.com/weiyinfu/p/6539311.html

文本相似性度量---------字符串近似相等相关推荐

  1. 【算法】字符串近似搜索(转)

    来源:.Net.NewLife.需求:假设在某系统存储了许多地址,例如:"北京市海淀区中关村大街1号海龙大厦".用户输入"北京 海龙大厦"即可查询到这条结果.另 ...

  2. R语言︱文本(字符串)处理与正则表达式

    处理文本是每一种计算机语言都应该具备的功能,但不是每一种语言都侧重于处理文本.R语言是统计的语言,处理文本不是它的强项,perl语言这方面的功能比R不知要强多少倍.幸运的是R语言的可扩展能力很强,DN ...

  3. java 文本编辑器替换特殊字符_linux中批量替换文本中字符串--转载

    (一)通过vi编辑器来替换. vi/vim 中可以使用 :s 命令来替换字符串. :s/well/good/ 替换当前行第一个 well 为 good :s/well/good/g 替换当前行所有 w ...

  4. python空行拼接字符串_python基础---文本和字符串操作

    一.文本操作 打开读取文本 (查) lock_file = open('username_lock.txt', 'r+') #r+ 读写 lock_list =lock_file.readlines( ...

  5. R语言:文本(字符串)处理与正则表达式

    处理文本是每一种计算机语言都应该具备的功能,但不是每一种语言都侧重于处理文本.R语言是统计的语言,处理文本不是它的强项,perl语言这方面的功能比R不知要强多少倍.幸运的是R语言的可扩展能力很强,DN ...

  6. 富文本转换字符串 php,php 如何将一个富文本字符串生成word文档?

    问题描述 我现在有一个富文本字符串, 比如$str=" qqq啊啊啊啊啊百度网址 ": 中间我省去了大量的图片base64的编码. 问题出现的环境背景及自己尝试过哪些方法 相关代码 ...

  7. 从富文本(html字符串)中获取图片,js获取富文本中的第一张图片(正则表达式)

    js获取富文本中的第一张图片url正则公式及去除字符串里面的html标签 后台发来一个富文本字符串里面可能包含了0.1.2.3-个图片标签(img),我们的任务是获取这个字符串里面第一张图片的url, ...

  8. 一文教你学会python读取文本及字符串常用操作

    python 读取txt文件 打开支付宝首页搜索'543701491',领取马云的支付宝红包 Python的文本处理是经常碰到的一个问题,Python的txt文件读取中,有三类方法:read().re ...

  9. 前端将后端返回的富文本格式字符串转换成word下载

    需要用到三个库 npm install html-docx-js -S npm install file-saver -S npm install dayjs -S 或 pnpm install ht ...

最新文章

  1. 日志系统的设计与实现_it运维管理系统|综合运维的设计与实现
  2. vs2017运行显示系统找不到指定的文件_windows 平台使用 VS2017 编译 libevent 源码
  3. 【信息抽取】如何使用卷积神经网络进行关系抽取
  4. 收费最低的云存储_百度云:虚拟主机11元/6个月,入门级云服务器60元/年
  5. WinCE下音频频谱显示效果图
  6. [linux]linux IO 5种方式
  7. 网易云音乐自建服务器,自建私有云音乐服务–Subsonic
  8. 三次样条曲线拟合算法c语言,关于三次样条曲线拟合法
  9. java扫码枪键盘_JAVA读取USB扫描枪
  10. java调用平方函数_java中的数学计算函数的总结
  11. 计算机科学与技术双一流排名,计算机科学与技术学科排行榜(大学名单大全2020版)...
  12. 给女朋友道歉的java代码_有关于向女朋友道歉的经典句子
  13. 深度强化学习落地方法论(7)——训练篇
  14. 复旦大学郁喆隽:网络制造出人的“幻象”,深度思考如何可能?
  15. UI设计—软件包装设计
  16. 解决:Flutter 不识别 iPhone 测试机
  17. MacBook进水记
  18. 英雄传说空之轨迹人物介绍
  19. 文件宝局域网传输/播放功能Windows10系统经验贴(感谢文件宝用户@卡卡罗特 和@24K 純情)...
  20. 学Linux的第一天

热门文章

  1. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
  2. 2019-02-25 SQL:cast(itemvalue as decimal(19,4))
  3. AC日记——约瑟夫问题 codevs 1282
  4. Android 中Base64的操作
  5. wince内存配置(转gooogleman的工作日志)
  6. iPhone girl幕后推手浮出 制造者为论坛站长
  7. 【Java从0到架构师】交错的日志系统、SpringBoot 集成日志框架
  8. 【恋上数据结构】动态规划(找零钱、最大连续子序列和、最长上升子序列、最长公共子序列、最长公共子串、0-1背包)
  9. switch一定比if else好用吗
  10. 怎样用一份数据透视表打动老板