字符串編輯距離(Edit Distance)

1、問題描述
定義
字符串編輯距離(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等機器學習算法中。機器學習

2、字符串編輯的分析函數


代碼以下:學習

// 算法的關鍵是求解 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 矩陣的最後一個元素即爲最終求出的編輯距離
}
---------------------
做者:xhj_enen
來源:CSDN
原文:https://blog.csdn.net/xhj_enen/article/details/88398444
版權聲明:本文爲博主原創文章,轉載請附上博文連接!.net

相關文章
相關標籤/搜索