文本编辑距离的计算

原创 2016年05月30日 10:41:27


所谓文本的编辑距离,是指从一个文本变成另一个文本所需要的做小操作数。这些操作一般包括字符的插入、删除和替换。

这个概念是俄罗斯科学家在1965年提出来的。


编辑距离的算法可以概括以下:定义一个编辑距离的函数 editText(i,j)表示从从长度为i的字符串变到长度为j的字符串所需要的最小操作数。这个问题可以用动态规划的方法来求解。概括为以下几点:

  •   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 (i >= 1 && j >= 1)  edit(i, j) == min( edit(i - 1, j) + 1, edit(i, j - 1) + 1, edit(i - 1, j-1) + f(i,j) ); 其中当字符串A的第i个字符和字符串B的第j个字符相同时,f(i,j) 为零,否则为一。
具体的计算过程如下图所示。在一个字符串中,每个char是一个单元,底标编号从0开始。而矩阵中的每一个元素,都是一个函数 edit( i, j ),。整个矩阵的第一行和第一列的数值是很容易得到的。然后函数 f(i,j)的数值只需要对比纵向第i个char和横向第j个char是否相同即可。然后递归的向上,动态得到矩阵内的所有值。最后,矩阵的右下角的值即为两个字符串之间的最小编辑距离。需要注意的是,这里的编辑包涵插入、删除和替换。



于是具体的算法实现如下:

        /// 
        /// 计算两个文本的编辑距离
        /// 
        private int edit(string strA, string strB)
        {
            int maxA = strA.Length;
            int maxB = strB.Length;

            //定义编辑矩阵并赋初值
            int[ , ] matrix = new int[maxA + 1,maxB+1];
            for (int i = 0; i < maxA + 1; i++ )
            {
                matrix[i , 0] = i;
            }
            for (int i = 0; i < maxB + 1; i++)
            {
                matrix[0, i] = i;
            }

            //计算矩阵的各个值
            for (int i = 1; i < maxA + 1; i++)
            {
                for (int j = 1; j < maxB + 1; j++)
                {
                    int d;
                    int temp = Math.Min(matrix[i-1,j]+1, matrix[i,j-1]+1);
                    if (strA.Substring(i - 1, 1) == strB.Substring(j - 1, 1))
                    {
                        d = 0;
                    }
                    else
                    {
                        d = 1;
                    }
                    matrix[i , j] = Math.Min(temp, matrix[i - 1,j - 1] + d);
                    Console.Write("{0}\t", matrix[i, j]);
                }
                Console.WriteLine("");
            }

            return matrix[maxA, maxB];
        }

即矩阵右下角的数字为两个字符串的编辑距离,编辑距离越小,两个字符串相似度的程度越高。








版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

编辑距离

1. 编辑距离定义        今天我们来研究一个有趣的算法题,叫做字符串编辑距离。编辑距离研究的问题和最长公共子序列有相似之处,都是比较两个字符串之间的相似性,只是采用的标准不太相同。      ...

利用编辑距离计算文本相似性

文本相似性编辑距离 什么是编辑距离? 看下百度百科的介绍:编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑...

文本相似(汉明距离)

汉明距离《海量数据相似度计算之simhash和海明距离》 介绍了simhash的原理,大家应该感觉到了算法的魅力。但是随着业务的增长 simhash的数据也会暴增,如果一天100w,10天就1000w...
  • www_jun
  • www_jun
  • 2016年09月13日 10:52
  • 1297

文本编辑距离

题目:给定一个字符串word。再给定n个字符串s1, s2, ... sn. 求出s中和word相似度最小的字符串。 注意:两个字符串的相似度是,修改s1或s2的中的任一字符,一次只能改一...
  • K0Kong
  • K0Kong
  • 2015年11月25日 00:07
  • 253

文本相似度计算之--- 编辑距离 && 最长公共子串

问题引入:在自然语言处理ling

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

算法介绍: 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符...

计算两字符串的编辑距离

  • 2014年12月28日 10:28
  • 1.16MB
  • 下载

文本相似度计算的几个距离公式(欧氏距离、余弦相似度、Jaccard距离、编辑距离)

本文主要讲一下文本相似度计算的几个距离公式,主要包括:欧氏距离、余弦相似度、Jaccard距离、编辑距离。 距离计算在文本很多场景下都可以用到,比如:聚类、K近邻、机器学习中的特征、文本相似度等等。...
  • mpk_no1
  • mpk_no1
  • 2017年06月08日 21:57
  • 1145

编辑距离计算函数及测试程序

  • 2012年12月07日 19:18
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:文本编辑距离的计算
举报原因:
原因补充:

(最多只允许输入30个字)