【问题标题】:Similarity matrix for weighted edit distance加权编辑距离的相似矩阵
【发布时间】:2016-06-20 04:24:39
【问题描述】:

我想对基本编辑距离算法进行修改。即加权编辑距离。 (上下文:尝试创建搜索引擎时出现拼写错误)

例如,将 s 替换为 a 的成本将低于将 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。我的意思是,我希望成本基于键盘上字母之间的距离。还没有人明确定义过这样的矩阵吗?

【问题讨论】:

  • 投票结束为题外话。问题不在于编程部分,而在于“我在哪里可以找到替代成本矩阵?”
  • 对不起!那么我在哪里发布这个问题呢?
  • 我不知道,也许是reddit

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


【解决方案1】:

我编写了一个应该可以工作的 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]包含键之间的距离。

【讨论】: