编辑距离算法(Levenshtein)

编辑距离定义

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。

许可的编辑操作包括:将一个字符替换成另一个字符,插入一个字符,删除一个字符。

例如将eeba转变成abac:

  1. eba(删除第一个e)
  2. aba(将剩下的e替换成a)
  3. abac(在末尾插入c)

所以eeba和abac的编辑距离就是3

俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。

算法

算法就是简单的线性动态规划(最长上升子序列就属于线性动态规划)。

设我们要将s1变成s2

定义状态矩阵edit[len1][len2],len1和len2分别是要比较的字符串s1和字符串s2的长度+1(+1是考虑到动归中,一个串为空的情况)

然后,定义edit[i][j]是s1中前i个字符组成的串,和s2中前j个字符组成的串的编辑距离

具体思想是,对于每个i,j从0开始依次递增,对于每一次j++,由于前j-1个字符跟i的编辑距离已经求出,所以只用考虑新加进来的第j个字符即可

插入操作:在s1的前i个字符后插入一个字符ch,使得ch等于新加入的s2[j]。于是插入字符ch的编辑距离就是edit[i][j-1]+1

删除操作:删除s1[i],以期望s1[i-1]能与s2[j]匹配(如果s1[i-1]前边的几个字符能与s2[j]前边的几个字符有较好的匹配,那么这么做就能得到更好的结果)。另外,对于s1[i-1]之前的字符跟s2[j]匹配的情况,edit[i-1][j]中已经考虑过。于是删除字符ch的编辑距离就是edit[i-1][j]+1

替换操作:期望s1[i]与s2[j]匹配,或者将s1[i]替换成s2[j]后匹配。于是替换操作的编辑距离就是edit[i-1][j-1]+f(i,j)。其中,当s1[i]==s2[j]时,f(i,j)为0;反之为1

于是动态规划公式如下:

  • if i == 0 且 j == 0,edit(i, j) = 0
  • if i == 0 且 j > 0,edit(i, j) = j
  • if i > 0 且j == 0,edit(i, j) = i
  • if 0 < i ≤ 1  且 0 < j ≤ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) },当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) = 1;否则,f(i, j) = 0。

Python实现:

官方扩展包:

python有一个官方扩展包(在pypi里面,即python package index),叫做python-Levenshtein,这个包不仅可以计算编辑距离,还能计算hamming(汉明)距离,Jaro-Winkler距离等,链接如下:

https://pypi.python.org/pypi/python-Levenshtein

下载python-Levenshtein-0.10.2.tar.gz,解压后,cd到解压后的文件夹,执行:

python setup.py build

python setup.py install

即可。

注意:如果没有安装setuptools的话要先安装setuptools,链接如下:

https://pypi.python.org/pypi/setuptools/

下载setuptools 0.6c11即可,解压后,cd到对应目录,执行:

python setup.py build

python setup.py install

即可。

检查是否安装成功:进入python,执行from Levenshtein import *,如果没有报错则安装成功

具体使用方法见如下博文(这边博文下方还有完整的使用文档的连接):

http://www.cnblogs.com/kaituorensheng/archive/2013/05/18/3085653.html

注意:如果采用from Levenshtein import *导入,则调用函数的时候不用加Levenshtein.

例如:直接调用distance(str1, str2)即可计算编辑距离

简单的实现代码:

如果你想要更加轻量级的实现的话,就用下面的代码吧:

(选自边苏涛的博客,http://biansutao.iteye.com/blog/326008

[python] view plain copy

    1. #!/user/bin/env python
    2. # -*- coding: utf-8 -*-
    3. class arithmetic():
    4. def __init__(self):
    5. pass
    6. ‘‘‘‘‘ 【编辑距离算法】 【levenshtein distance】 【字符串相似度算法】 ‘‘‘
    7. def levenshtein(self,first,second):
    8. if len(first) > len(second):
    9. first,second = second,first
    10. if len(first) == 0:
    11. return len(second)
    12. if len(second) == 0:
    13. return len(first)
    14. first_length = len(first) + 1
    15. second_length = len(second) + 1
    16. distance_matrix = [range(second_length) for x in range(first_length)]
    17. #print distance_matrix
    18. for i in range(1,first_length):
    19. for j in range(1,second_length):
    20. deletion = distance_matrix[i-1][j] + 1
    21. insertion = distance_matrix[i][j-1] + 1
    22. substitution = distance_matrix[i-1][j-1]
    23. if first[i-1] != second[j-1]:
    24. substitution += 1
    25. distance_matrix[i][j] = min(insertion,deletion,substitution)
    26. print distance_matrix
    27. return distance_matrix[first_length-1][second_length-1]
    28. if __name__ == "__main__":
    29. arith = arithmetic()
    30. print arith.levenshtein(‘GUMBOsdafsadfdsafsafsadfasfadsfasdfasdfs‘,‘GAMBOL00000000000dfasfasfdafsaf
时间: 2024-10-14 12:35:42

编辑距离算法(Levenshtein)的相关文章

字符串相似度算法(编辑距离算法 Levenshtein Distance)(转)

在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录. 据百度百科介绍: 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 俄罗斯科学家V

java文本相似度计算(Levenshtein Distance算法(中文翻译:编辑距离算法))----代码和详解

算法代码实现: package com.util; public class SimFeatureUtil { private static int min(int one, int two, int three) { int min = one; if (two < min) { min = two; } if (three < min) { min = three; } return min; } public static int ld(String str1, String str2)

Levenshtein distance 编辑距离算法

这几天再看 virtrual-dom,关于两个列表的对比,讲到了 Levenshtein distance 距离,周末抽空做一下总结. Levenshtein Distance 介绍 在信息理论和计算机科学中,Levenshtein 距离是用于测量两个序列之间的差异量(即编辑距离)的度量.两个字符串之间的 Levenshtein 距离定义为将一个字符串转换为另一个字符串所需的最小编辑数,允许的编辑操作是单个字符的插入,删除或替换. 例子 ‘kitten’和’sitten’之间的 Levensht

计算两组标签相似度算法——levenshtein distance 编辑距离算法

标签在数据分析中起到很重要的作用,给用户打标签,给商品打标签,给新闻打标签,好的标签可以为我们后期分析数据时提供很大的便利.有时我们需要计算两个对象之间标签的相似度.目前学习的算法是levenshtein distance 编辑距离算法. 代码示例: //标签相似度 public static double levenshtein(String s1, String s2) { System.out.println("levenshtein str1:"+s1+" str2:

编辑距离算法 (二)摘自网络

/** * 编辑距离算法,首先由俄国科学家Levenshtein提出的,又叫Levenshtein Distance * 主要用来计算从原串(s)转换到目标串(t)所需要的最少的插入,删除和替换的数目, 在NLP中应用比较广泛,同时也常用来计算你对原文所作的改动数 */ public class Levenshtein { private int compare(String str, String target) { int d[][]; // 矩阵 int n = str.length();

编辑距离算法

编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符.俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 算法思想:动态规划经常被用来作为这个问题的解决手段. 首先需要定义这样一个函数——edit(i, j),它表示第一个字符串的

编辑距离及编辑距离算法 (一)摘自http://www.cnblogs.com/biyeymyhjob/archive/2012/09/28/2707343.html

编辑距离及编辑距离算法 编辑距离概念描述: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符. 例如将kitten一字转成sitting: sitten (k→s) sittin (e→i) sitting (→g) 俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念. 问题:找出字符串的编辑距离,即把一个字符串s1最少经过多少步操作变成编程字符串

最短编辑距离算法(字符串比较)

一.编辑距离 1.从字符串a变为字符串b所需要的元操作有3种: 增加一个字符 删除一个字符 变化一个字符 2.编辑距离:从字符串a变为b所需要的最少操作步骤. 二.最短编辑距离(动态规划) 首先定义一个函数--step(i, j),它表示第一个字符串的长度为i的子串到第二个字符串的长度为j的子串的编辑距离. 显然可以有如下动态规划公式: if i == 0 且 j == 0,step(i, j) = 0 if i == 0 且 j > 0,step(i, j) = j if i > 0 且j

最短编辑距离算法

一般情况下,电商在当客户输入一个不存在的商品时,会返回客户一个与客户输入最为接近的商品,并加以提示"您是不是在找XXX?".这其中用到了一种算法,叫做"最短编辑距离算法",能在一大堆已存在的字符串中找到与原字符串最为接近的那个字符串,称之为最短编辑距离. 这种算法是基于动态规划思想,下面是算法的思路描述: 描述: 设A和B是2个字符串.要用最少的字符操作将字符串A转换为字符串B.这里所说的字符操作包括: (1)删除一个字符; (2)插入一个字符: (3)将一个字符改