`

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

阅读更多
在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录。

据百度百科介绍:

编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数,如果它们的距离越大,说明它们越是不同。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

  例如将kitten一字转成sitting:

  sitten (k→s)

  sittin (e→i)

  sitting (→g)

  俄罗斯科学家Vladimir Levenshtein在1965年提出这个概念。因此也叫Levenshtein Distance。

例如

如果str1="ivan",str2="ivan",那么经过计算后等于 0。没有经过转换。相似度=1-0/Math.Max(str1.length,str2.length)=1
如果str1="ivan1",str2="ivan2",那么经过计算后等于1。str1的"1"转换"2",转换了一个字符,所以距离是1,相似度=1-1/Math.Max(str1.length,str2.length)=0.8
应用
  DNA分析

  拼字检查

  语音辨识

  抄袭侦测

感谢大石头在评论中给出一个很好的关于此方法应用的连接 补充在此:

小规模的字符串近似搜索,需求类似于搜索引擎中输入关键字,出现类似的结果列表,文章连接:【算法】字符串近似搜索

算法过程

str1或str2的长度为0返回另一个字符串的长度。 if(str1.length==0) return str2.length; if(str2.length==0) return str1.length;
初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。
扫描两字符串(n*m级的),如果:str1[i] == str2[j],用temp记录它,为0。否则temp记为1。然后在矩阵d[i,j]赋于d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp三者的最小值。
扫描完后,返回矩阵的最后一个值d[n][m]即是它们的距离。
计算相似度公式:1-它们的距离/两个字符串长度的最大值。


为了直观表现,我将两个字符串分别写到行和列中,实际计算中不需要。我们用字符串“ivan1”和“ivan2”举例来看看矩阵中值的状况:

1、第一行和第一列的值从0开始增长

i v a n 1
0 1 2 3 4 5
i 1
v 2
a 3
n 4
2 5

2、i列值的产生 Matrix[i - 1, j] + 1 ; Matrix[i, j - 1] + 1   ;    Matrix[i - 1, j - 1] + t

i v a n 1
0+t=0 1+1=2 2 3 4 5
i 1+1=2 取三者最小值=0
v 2 依次类推:1
a 3 2
n 4 3
2 5 4


3、V列值的产生

       i v a n 1
0 1 2
i 1 0 1
v 2 1 0
a 3 2 1
n 4 3 2
2 5 4 3


依次类推直到矩阵全部生成

i v a n 1
0 1 2 3 4 5
i 1 0 1 2 3 4
v 2 1 0 1 2 3
a 3 2 1 0 1 2
n 4 3 2 1 0 1
2 5 4 3 2 1 1


最后得到它们的距离=1

相似度:1-1/Math.Max(“ivan1”.length,“ivan2”.length) =0.8

public class LevenshteinDistance
    {
        /// <summary>
        /// 取最小的一位数
        /// </summary>
        /// <param name="first"></param>
        /// <param name="second"></param>
        /// <param name="third"></param>
        /// <returns></returns>
        private int LowerOfThree(int first, int second, int third)
        {
            int min = Math.Min(first, second);
            return Math.Min(min, third);
        }

        private int Levenshtein_Distance(string str1, string str2)
        {
            int[,] Matrix;
            int n = str1.Length;
            int m = str2.Length;

            int temp = 0;
            char ch1;
            char ch2;
            int i = 0;
            int j = 0;
            if (n == 0)
            {
                return m;
            }
            if (m == 0)
            {

                return n;
            }
            Matrix = new int[n + 1, m + 1];

            for (i = 0; i <= n; i++)
            {
                //初始化第一列
                Matrix[i, 0] = i;
            }

            for (j = 0; j <= m; j++)
            {
                //初始化第一行
                Matrix[0, j] = j;
            }

            for (i = 1; i <= n; i++)
            {
                ch1 = str1[i - 1];
                for (j = 1; j <= m; j++)
                {
                    ch2 = str2[j - 1];
                    if (ch1.Equals(ch2))
                    {
                        temp = 0;
                    }
                    else
                    {
                        temp = 1;
                    }
                    Matrix[i, j] = LowerOfThree(Matrix[i - 1, j] + 1, Matrix[i, j - 1] + 1, Matrix[i - 1, j - 1] + temp);
                }
            }
 	   for (i = 0; i <= n; i++)
            {
                for (j = 0; j <= m; j++)
                {
                    Console.Write(" {0} ", Matrix[i, j]);
                }
                Console.WriteLine("");
            }
      
            return Matrix[n, m];
        }

        /// <summary>
        /// 计算字符串相似度
        /// </summary>
        /// <param name="str1"></param>
        /// <param name="str2"></param>
        /// <returns></returns>
        public decimal LevenshteinDistancePercent(string str1, string str2)
        {
            //int maxLenth = str1.Length > str2.Length ? str1.Length : str2.Length;
            int val = Levenshtein_Distance(str1, str2);
            return 1 - (decimal)val / Math.Max(str1.Length, str2.Length);
        }
    }


调用:
static void Main(string[] args)
        {
            string str1 = "ivan1";
            string str2 = "ivan2";
            Console.WriteLine("字符串1 {0}", str1);

            Console.WriteLine("字符串2 {0}", str2);

            Console.WriteLine("相似度 {0} %", new LevenshteinDistance().LevenshteinDistancePercent(str1, str2) * 100);          
            Console.ReadLine();
        }

1
<strong>结果</strong>




转自: http://www.cnblogs.com/ivanyb/archive/2011/11/25/2263356.html
花下眠工作室: http://huaxiamian.cc
  • 大小: 5.2 KB
分享到:
评论

相关推荐

    字符串相似度算法 levenshtein distance 编辑距离算法

    **字符串相似度算法——Levenshtein Distance(编辑距离)** 在信息技术和计算机科学领域,字符串相似度计算是一个重要的概念,特别是在文本处理、搜索引擎优化、数据校验和生物信息学等多个场景中。Levenshtein ...

    C#,字符串相似度的莱文斯坦距离(Levenshtein Distance)算法与源代码

    C#,字符串相似度的莱文斯坦距离(Levenshtein Distance)算法与源代码 莱文斯坦距离(Levenshtein Distance)用于衡量两个字符串之间的相似度。 莱文斯坦距离以俄国科学家(Vladimir I. Levenshtein)命名,他于...

    两个字符串的相似度算法实现——编辑距离之Levenshtein距离

    两个字符串的相似度算法实现——编辑距离之Levenshtein距离

    Python-Levenshtein快速计算编辑距离以及字符串的相似度

    除了编辑距离外,Levenshtein库还提供了其他有用的功能,如`ratio`函数,它能计算两个字符串的相似度,返回值范围在0到1之间,值越接近1表示相似度越高: ```python from Levenshtein import ratio ratio('kitten',...

    字符串相似度算法

    在IT领域,字符串相似度算法是一种非常重要的工具,特别是在数据挖掘、信息检索、文本分类以及自然语言处理等应用中。这个小例子旨在介绍如何通过计算字符串间的相似度来进行模糊匹配。我们将探讨几种常见的字符串...

    c#字符串相似度源码 编辑距离 余弦相似性 SimHash

    本文将详细解析C#编程语言中实现的四种字符串相似度计算方法:编辑距离(Levenshtein Distance)、余弦相似性(Cosine Similarity)以及SimHash算法。 首先,编辑距离是一种衡量两个字符串之间差异的度量,它表示由...

    mysql 计算字符串相似度

    1. **使用更高效的算法**:例如,采用编辑距离算法(Levenshtein 距离)或 Jaccard 相似度等更复杂的相似度计算方法。 2. **利用 MySQL 的内置函数**:例如,尝试使用 `UNHEX()` 和 `HEX()` 函数来处理多字节字符。 ...

    Delphi计算字符串的相似度

    总之,Delphi提供了丰富的工具和功能来处理字符串相似度计算,开发者可以根据具体需求选择合适的算法并进行实现。在实际项目中,理解和运用这些算法可以帮助我们更好地理解和比较文本数据,提升应用程序的功能和用户...

    字符串的相似度 编辑距离 java实现

    字符串相似度计算之编辑距离 编辑距离(Edit Distance)是计算两个字符串之间的相似度的算法,它定义了从原串(s)转换到目标串(t)所需要的最少的插入、删除和替换的数目。在自然语言处理(NLP)中应用非常广泛,...

    LD的两字符串相似度计算.zip

    Levenshtein Distance(简称LD),又称编辑距离,是衡量两个字符串相似度的一种方法。这个概念由俄国科学家Vladimir Levenshtein在1965年提出,因此得名。 编辑距离定义了将一个字符串转换成另一个字符串所需的最少...

    使用最短编辑距离算法判断两个字符串的相似度

    总之,最短编辑距离算法是计算字符串相似度的一种基础且重要的方法,它在文本处理领域有着广泛的应用。理解和掌握这一算法,对于开发相关的软件功能,如自动纠错、搜索引擎优化等,都是非常有益的。

    计算字符串相似度(支持中英文,编辑距离算法,余弦,繁体转简体)

    在IT领域,字符串相似度计算是一项重要的技术,广泛应用于文本分析、信息检索、自然语言处理等多个方面。本项目提供了一个简单易用的demo,支持中英文字符串的相似度比较,采用了编辑距离算法和余弦相似度这两种经典...

    Java字符串相似度:各种字符串相似度和距离算法的实现:Levenshtein,Jaro-winkler,n-Gram,Q-Gram,Jaccard索引,最长公共子序列编辑距离,余弦相似度..

    当前实现了十二种算法(包括Levenshtein编辑距离和同级,Jaro-Winkler,最长公共子序列,余弦相似性等)。 查看下面的摘要表以获取完整列表... 下载 使用Maven: &lt;groupId&gt;info.debatty &lt;artifactId&gt;java-...

    字符串相似度比较

    本文将深入探讨字符串相似度比较的概念、常用算法以及在JavaScript中的实现,同时关注潜在的性能和内存管理问题。 字符串相似度比较旨在量化两个或多个字符串之间的相似程度,通常以百分比形式表示。这种比较不仅...

    字符串相似度比较T-2021-7-1.rar

    总的来说,字符串相似度比较是信息技术中的基础工具,深入理解和灵活运用这些算法能帮助我们解决多种实际问题。通过“字符串相似度比较T-2021-7-1.rar”中的内容,我们可以系统学习这一领域的知识,提升处理文本数据...

    Oracle字符相似度函数

    - **EDITDISTANCE()**:编辑距离(Levenshtein距离)函数,计算将一个字符串转换为另一个字符串所需的最少单字符编辑(插入、删除或替换)次数。返回值是具体的编辑距离,数值越小表示越接近。 在实际应用中,...

    编辑长求字符串相似度Delphi源代码

    首先,我们需要了解几种常见的字符串相似度算法: 1. **Levenshtein距离**:这个算法衡量的是通过插入、删除或替换操作将一个字符串转换成另一个字符串所需的最少步骤数。在Delphi中,你可以创建一个动态数组来存储...

    字符串识别,相似度匹配

    4. **编辑距离(Edit Distance)**:包括Levenshtein距离,还有其他变种如Hamming距离,用于衡量字符串间的最小转换步数。 5. **最长公共子序列(Longest Common Subsequence, LCS)**:找出两个字符串中无需调整...

    最小编辑距离(字符串相似度)java版

    总之,最小编辑距离算法是计算字符串相似度的一种有效方法,通过动态规划实现,具有较高的效率和广泛的应用价值。在Java编程中,`EditDistance.java`文件所包含的实现可以帮助开发者在各种需要字符串比较的场景下...

Global site tag (gtag.js) - Google Analytics