最后
🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。
🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。
🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。
🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
算法原理
在计算文本的相似性时,经常会用到编辑距离。编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。通常来说,编辑距离越小,两个文本的相似性越大。这里的编辑操作主要包括三种:
- 插入:将一个字符插入某个字符串;
- 删除:将字符串中的某个字符删除;
- 替换:将字符串中的某个字符替换为另外一个字符。
下面通过示例来看一下。
将字符串batyu变为beauty,编辑距离是多少呢?这需要经过如下步骤:
1、batyu变为beatyu(插入字符e)
2、beatyu变为beaty(删除字符u)
3、beaty变为beauty(插入字符u)
所以编辑距离为3。
更多Python视频、源码、资料加群531509025免费获取
那么,如何用Python计算编辑距离呢?我们可以从较为简单的情况进行分析。
- 当两个字符串都为空串,那么编辑距离为0;
- 当其中一个字符串为空串时,那么编辑距离为另一个非空字符串的长度;
- 当两个字符串均为非空时(长度分别为 i 和 j ),取以下三种情况最小值即可:
- 1、长度分别为 i-1 和 j 的字符串的编辑距离已知,那么加1即可;
- 2、长度分别为 i 和 j-1 的字符串的编辑距离已知,那么加1即可;
- 3、长度分别为 i-1 和 j-1 的字符串的编辑距离已知,此时考虑两种情况,若第i个字符和第j个字符不同,那么加1即可;如果不同,那么不需要加1。
很明显,上述算法的思想即为动态规划。
求长度为m和n的字符串的编辑距离,首先定义函数——edit(i, j),它表示第一个长度为i的字符串与第二个长度为j的字符串之间的编辑距离。动态规划表达式可以写为:
- if i == 0 且 j == 0,edit(i, j) = 0
- if (i == 0 且 j > 0 )或者 (i > 0 且j == 0),edit(i, j) = i + j
- if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + d(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,d(i, j) = 1;否则,d(i, j) = 0。
最终的编辑距离即为edit(m,n)。上述示例的edit矩阵可以表示如下:
Python代码实现
Talk is cheap. Show me the code. Python代码也是极其简洁的,这也是动态规划的魅力:
扩展
那么,Python功能这么强大,有没有计算编辑距离的包呢?
答案是肯定的,Python中的Levenshtein包可以用来计算编辑距离,安装方法很简单,直接安装即可:
pip install python-Levenshtein
这样我们就可以引入包直接计算编辑距离了:
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!