概述
什么是 莱文斯坦距离算法 (Levenshtein Distance Algorithm) ?
Levenshtein Distance,莱文斯坦距离,通常被称为编辑距离(Edit Distance)。该算法的概念是俄罗斯科学家弗拉基米尔·莱文斯坦(Levenshtein · Vladimir)于1965年提出。
它是用来计算两个字串之间,通过替换、插入、删除等操作将字符串str1转换成str2所需要操作的最少次数。
也存在其他编辑距离的定义方式:例如 Damerau-Levenshtein 距离就是一种莱文斯坦距离的变种,但允许以单一操作交换相邻的两个字符(称为字符转置),如 AB→BA 的距离是 1(交换)而非 2(先删除再插入、或者两次替换); LCS(最长公共子序列)距离只允许删除、加入字元; Jaro 距离只允许字符转置; 汉明距离只允许取代字元。
例子:
kitten和sitting的莱文斯坦距离是3。将kitten变为sitting的最小处理方式如下:
- kitten →sitten(将k改为s)
- sitten → sittin(将e改为i)
- sittin → sitting(最后加入g)
公式定义
动态规划方法
通常使用动态规划方法(Dynamic Programming Approach)去计算莱文斯坦距离
的值,步骤大致如下:
- 初始化一个
莱文斯坦距离
矩阵(m,n),n和n分别是两个字符串的长度。 - 矩阵可以从左上角到右下角进行填充。
- 每个水平或垂直跳转分别对应于一个插入或一个删除。
- 通常定义每一个操作的成本为1。
- 对角线跳转的成本:如果两个字符串不匹配是1, 匹配则是0。每个格子取代价的最小值。
- 按照上面的规则计算,最终最右下角的数字就是这两个字符串的
莱文斯坦距离
比如, 计算 “HONDA” 和 “HYUNDAI” 的莱文斯坦距离:
使用场景
- 字符串模糊匹配/按相似度排序
- 单词修正,拼写检查, OCR文字识别后的修正
- 基于翻译记忆的自然语言翻译辅助软件
- 文章内容查重, 抄袭检测
- DNA分析
在PHP中的实现
php从4.0.1开始提供了levenshtein
函数:
levenshtein( string $str1, string $str2) : int
该算法的复杂度是 O(m*n),其中 n 和 m 分别是str1 和str2的长度 (当和算法复杂度为O(max(n,m)**3) 的similar_text()相比时,此函数还是相当不错的,尽管仍然很耗时)。
此函数返回两个字符串参数之间的编辑距离,如果其中一个字符串参数长度大于限制的255个字符时,返回-1。
但是如果我想用此函数来实现计算两个字符串之间的相似度, 还是需要做很多额外的工作
未完待续..... To Be Continued
参考文档:
https://www.cnblogs.com/throwable/p/12445082.html
https://www.cuelogic.com/blog/the-levenshtein-algorithm
最后
以上就是无奈苗条为你收集整理的莱文斯坦距离(编辑距离)算法 (Levenshtein Distance Algorithm)什么是 莱文斯坦距离算法 (Levenshtein Distance Algorithm) ?公式定义动态规划方法使用场景在PHP中的实现的全部内容,希望文章能够帮你解决莱文斯坦距离(编辑距离)算法 (Levenshtein Distance Algorithm)什么是 莱文斯坦距离算法 (Levenshtein Distance Algorithm) ?公式定义动态规划方法使用场景在PHP中的实现所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复