字符串编辑距离(Edit Distance)

一、问题描述

定义

字符串编辑距离(Edit Distance),是俄罗斯科学家 Vladimir Levenshtein 在 1965 年提出的概念,又称 Levenshtein 距离,是指两个字符串之间,由一个转变成另一个所需的最少编辑操作次数。许可的编辑操作包括:

  • 将一个字符替换成另一个字符
  • 插入一个字符
  • 删除一个字符

应用

1. DNA分析:
基因学的一个主要主题就是比较DNA序列并尝试找出这两个序列的公共部分。如果两个DNA序列有类似的公共子序列,那么这两个序列很可能是同源的,在比对两个序列时,不仅要考虑完全匹配的字符,还要考虑一个序列中的空格或间隙和不匹配,这两方面都可能意味着突变(mutation)。在序列比对时,需要找到最优的比对(最优比对大致是指要将匹配的数量最大化,将空格和不匹配的数量最小化)。如果要更正式些,可以确定一个分数,为匹配的字符添加分数,为空格和不匹配的字符减去分数。
2. 拼写纠错(Spell Correction)&拼写检查(Spell Checker):
将每个词与词典中的词条比较,英文单词往往需要做词干提取等规范化处理,如果一个词在词典中不存在,就被认为是一个错误,然后提出 N 个最可能是要输入的词——拼写建议。常用的提示单词的算法就是列出词典中与原词具有最小编辑距离的词条。
3. 命名实体抽取(Named Entity Extraction)&实体共指(Entity Coreference):
由于实体的命名往往是没有规律的,如品牌名,且可能存在多种变形,拼写形式,如“IBM”和“IBM Inc”,这样导致基于词典完全匹配的命名实体识别方法召回率较低,为此,我们可以使用编辑距离由完全匹配泛化到模糊匹配。
4. 字符串核函数(String Kernel):
最小编辑距离作为字符串之间的相似度计算函数,用于SVM等机器学习算法中。

二、字符串编辑的分析

在这里插入图片描述
在这里插入图片描述
代码如下:

// 算法的关键是求解 dp 矩阵,该矩阵即为生物信息学中所提到过的打分矩阵
// dp 矩阵的维度为 (srclength+1) * (targetLength+1),
// 推演时可以将 ‘0’+pSource 分别排在每一行开头,‘0’+pTarget 分别排在每一列上头
int editDistance(char *pSource, char *pTarget)
{
	int srcLength = strlen(pSource);
	int targetLength = strlen(pTarget);
	int dp[srcLength + 1][targetLength + 1];
	for (int i = 0; i <= srcLength; ++i){
		dp[i][0] = i;        // 这一步表示由一个空串变成pSource的编辑距离
	}
	for (int j = 0; j <= targetLength; ++j){
		dp[0][j] = j;
	}
	for (int i = 1; i <= srcLength; ++i){
		for (int j = 1; j <= targetLength; ++j){
			if (pSource[i - 1] == pTarget[j - 1]){
				dp[i][j] = dp[i - 1][j - 1];    // 表示当前两个字符串最后的两个元素相等的情况
			}
			else{   
			// 表示当前两个字符串最后两个元素不相等的情况,
			// 编辑距离为上述三种编辑距离中最小值加1
				dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]) + 1;
			}
		}
	}
	return dp[srcLength][targetLength];  // dp 矩阵的最后一个元素即为最终求出的编辑距离
}

猜你喜欢

转载自blog.csdn.net/xhj_enen/article/details/88398444