加权编辑距离

时间:2016-03-06 17:11:21

标签: matrix dynamic-programming levenshtein-distance edit-distance

我想实现基本编辑距离算法的修改。也就是说,加权编辑距离。 (上下文:尝试创建搜索引擎时出现拼写错误)

例如,用 a 代替 s 的成本会比用 s 代替 p EM>

使用DP的算法需要简单的改变,即

d[i, j] := minimum(d[i-1, j] + 1,                         // deletion
                         d[i, j-1] + 1,                   // insertion
                         d[i-1, j-1] + substitutionCost)  // substitution

我看了,但是我无法在任何地方找到这样的矩阵,这会给我所有字母对的 substitutionCost 。我的意思是,我希望成本基于键盘上字母之间的距离。还没有人明确定义这样的矩阵吗?

1 个答案:

答案 0 :(得分:0)

我编写了一个应该可行的c ++代码,我也假设键是对称放置的:

#include<bits/stdc++.h>

using namespace std;

string s[3];
int mat[35][35];

int main() {
    s[0] = "qwertyuiop";
    s[1] = "asdfghjkl;";
    s[2] = "zxcvbnm,./";

    for(int i = 0;i < 10;i++){
        for(int j = 0;j < 3;j++){
            for(int k = 0;k < 10;k++){
                for(int l = 0;l < 3;l++){
                    if(j == 1 && i > 8) continue;if(l == 1 && k > 8) continue;
                    if(j == 2 && i > 6) continue;if(l == 2 && k > 6) continue;
                    int st1 = s[j][i] - 'a';
                    int st2 = s[l][k] - 'a';
                    mat[st1][st2] = abs(j-l) + abs(i-k);
                }
            }
        }
    }
    for(int i = 0;i < 26;i++){
        for(int j = 0;j < 26;j++){
            cout << (char)(i+'a') << " " << (char)(j+'a') << " " << mat[i][j] << endl;
        }
    }

return 0;
}

指向Ideone上的输出链接:http://ideone.com/xq7kKp

此处mat[i][j]包含密钥之间的距离。