文本编辑距离的计算

原创 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];
        }

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








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

文本相似(汉明距离)

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

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

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

python实现机器学习中的各种距离计算及文本相似度算法

import numpy as np import math# 依赖包numpy、python-Levenshtein、scipy def Euclidean(vec1, vec2): npv...
  • AlanConstantineLau
  • AlanConstantineLau
  • 2017年04月03日 22:45
  • 4148

文本相识度算法(余弦相似性、简单共有词、编辑距离、SimHash、汉明距离、Jaccard相似性系数、欧几里得距离、曼哈顿距离 )

文本相似度计算在信息检索、数据挖掘、机器翻译、文档复制检测等领域有着广泛的应用。 比如舆论控制,我们假设你开发了一个微博网站,并且已经把世界上骂人的句子都已经收录进了数据库,那么当一个用户发微博...
  • u011630575
  • u011630575
  • 2016年08月09日 19:01
  • 3140

文本对比。文本编辑距离算法

在日常应用中,文本比较是一个比较常见的问题。文本比较算法也是一个老生常谈的话题。   文本比较的核心就是比较两个给定的文本(可以是字节流等)之间的差异。目前,主流的比较文本之间的差异主要有两大类。一...
  • zuokaopuqingnian
  • zuokaopuqingnian
  • 2017年10月25日 17:09
  • 48

文本相似(汉明距离)

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

最短编辑距离问题 : Levenshtein Distance

个人觉得只要你能明白edit数组的含义就可以理解状态转移方程了。/* 可以用来表示字符串的相似度? */ #include using namespace std; int edit[100][10...
  • qq_21063873
  • qq_21063873
  • 2016年10月29日 21:02
  • 224

C++实现两个字符串之间的Levenshtein Distance(编辑距离)

1.什么是Levenshtein Distance Levenshtein Distance,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符...
  • shaojunbo24
  • shaojunbo24
  • 2015年08月04日 11:14
  • 1777

编辑距离及编辑距离算法

编辑距离及编辑距离算法 编辑距离概念描述: 编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一...
  • kingmax54212008
  • kingmax54212008
  • 2015年10月27日 13:45
  • 1125

使用最小编辑距离算法求字符串相似度

未完成....
  • ls386239766
  • ls386239766
  • 2014年09月01日 18:20
  • 2216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:文本编辑距离的计算
举报原因:
原因补充:

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