編集距離
概要
編集距離 (edit distance) は 2 つの文字列間で一方の文字列を他方の文字列と一致させるために必要な最小の操作回数である。これは 2 つの文字列が互いにどれだけ異なるかを定量化している。文字列の類似性を評価するために自然言語処理の分野で広く使用されている。
Table of Contents
レーベンシュタイン距離
レーベンシュタイン距離 (Levenshtein distance) は 1965 年にソビエトの数学者ウラジミール・レーベンシュタインによって定義された編集距離の一種である。編集距離の中でも最も一般的なメトリクスであり、そのため編集距離という言葉と同義に使用されることがしばしばある。
レーベンシュタイン距離は挿入、削除、置換の 3 つの操作を行うことができる。例として
- replace
to - replace
to - insert
as
より一般的には、2 つの文字列
例えば
または のケースでは、 は 回の挿入または 回の削除操作によって と一致させることができるのは明白である。
, となる では:-
: に対し となる挿入操作 1 回 + とする削除操作 1 回 = 2 回 -
: に対し となる削除操作 1 回 + とする挿入操作 1 回 = 2 回 -
: に対し となる置換操作 1 回 = 1 回
-
function levenshteinDistance(a, b) {
const n = a.length;
const m = b.length;
if (n === 0) return m;
if (m === 0) return n;
// 2次元配列の作成と max(i, j) if min(i, j) == 0 の初期化
const lev = new Array(m + 1);
for(let j = 0; j <= m; j++) {
lev[j] = new Array(n + 1);
lev[j][0] = j;
}
for(let i = 1; i <= n; i++) {
lev[0][i] = i;
}
for (let j = 1; j <= m; j++) {
for (let i = 1; i <= n; i++) {
const cost = a.charAt(i - 1) === b.charAt(j - 1) ? 0 : 1;
lev[j][i] = Math.min(
lev[j - 1][i] + 1, // 挿入操作
lev[j][i - 1] + 1, // 削除操作
lev[j - 1][i - 1] + cost // 置換操作
);
}
}
return lev[m][n];
}