莱文斯坦距离(编辑距离)算法 (Levenshtein Distance Algorithm)

什么是 莱文斯坦距离算法 (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的最小处理方式如下:

  1. kitten →sitten(将k改为s)
  2. sitten → sittin(将e改为i)
  3. sittin → sitting(最后加入g)

公式定义

莱文斯坦距离(编辑距离)算法 (Levenshtein Distance Algorithm)_第1张图片

动态规划方法

通常使用动态规划方法(Dynamic Programming Approach)去计算莱文斯坦距离的值,步骤大致如下:

  1. 初始化一个莱文斯坦距离矩阵(m,n),n和n分别是两个字符串的长度。
  2. 矩阵可以从左上角到右下角进行填充。
  3. 每个水平或垂直跳转分别对应于一个插入或一个删除。
  4. 通常定义每一个操作的成本为1。
  5. 对角线跳转的成本:如果两个字符串不匹配是1, 匹配则是0。每个格子取代价的最小值。
  6. 按照上面的规则计算,最终最右下角的数字就是这两个字符串的莱文斯坦距离

比如, 计算 “HONDA” 和 “HYUNDAI” 的莱文斯坦距离:

莱文斯坦距离(编辑距离)算法 (Levenshtein Distance Algorithm)_第2张图片

使用场景

  • 字符串模糊匹配/按相似度排序
  • 单词修正,拼写检查, 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

你可能感兴趣的:(字符串,算法,python,java,机器学习)