編集距離の算出

平成26年度 秋期 基本情報技術者試験に出題された「編集距離の算出」のアルゴリズムを MATLAB で作成してみた。

編集距離とは

二つの文字列の差異を測る指標に編集距離がある。

編集距離の概念は,文書比較や検索キーワードの候補の提示などに用いられている。

編集距離とは,1 文字の追加操作又は削除操作を繰り返し適用し,ある文字列を別の文字列に変換するのに必要な最小の操作回数である。

例えば,文字列 “abcabba” を文字列 “cbabac” に変換する場合,下表に示す操作 1 ~ 5 によって変換が完了する。

下表は,最小の操作回数で変換する一例を示しており,編集距離は 5 となる。

操作 No.操作後の文字列操作内容
1bcabba1 文字目の a を削除
2cabba1 文字目の b を削除
3cbabba1 文字目の c の後ろに b を追加
4cbaba5 文字目の b を削除
5cbabac5 文字目の a の後ろに c を追加
表 文字列 “abcabba” を文字列 “cbabac” に変換する場合の例

MATLAB で作成したプログラム

二つの文字列間の編集距離を返す関数を MATLAB で作成した。

引数の仕様は,次のとおりである。

疑似言語において,各配列の添字は,0 から始まっているが,MATLAB では,各配列の添字は,1 から始めている(MATLAB では配列の添字を 0 とすることはできないため)。

引数名/返却値データ型意味
Str1文字列変換元の文字列 “abcabba” が格納されている 1 次元配列
次元は 1 × 7 である
Str1Len整数型変換元の文字列の長さ(1 以上)
長さを返却する関数 length により,Str1 の長さを求めている
Str2文字列変換先の文字列 “cbabac” が格納されている 1 次元配列
次元は 1 × 6 である
Str2Len整数型変換先の文字列の長さ(1 以上)
長さを返却する関数 length により,Str2 の長さを求めている
返却値 D(Str1Len+1,Str2Len+1)
整数型編集距離を返却値として返す
返却値 alpha整数型α の実行回数を返却値として返す
返却値 beta整数型β の実行回数を返却値として返す

作成した MATLAB プログラムを示す。

Str1 = "abcabba";
Str2 = "cbabac";

Str1Len = length(Str1);
Str2Len = length(Str2);

D = zeros(Str1Len + 1, Str2Len + 1);
alpha = 0;
beta = 0;

% Initialize the first row and column
for X = 1:Str1Len + 1
    D(X, 1) = X - 1;
end
for Y = 1:Str2Len + 1
    D(1, Y) = Y - 1;
end

% Fill in the rest of the matrix
for X = 2:Str1Len + 1
    for Y = 2:Str2Len + 1
        if Str1(X - 1) == Str2(Y - 1)
            D(X, Y) = min([D(X - 1, Y - 1), D(X, Y - 1) + 1, D(X - 1, Y) + 1]);
            alpha = alpha + 1;
        else
            D(X, Y) = min([D(X, Y - 1) + 1, D(X - 1, Y) + 1]);
            beta = beta + 1;
        end
    end
end

% Display the results
D(Str1Len + 1, Str2Len + 1)
alpha
beta

上記のコードを実行した結果を示す。

ans = 5
alpha = 14
beta = 28

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です