最近、Wikipediaの疑似コードからDamerau-Levenshtein距離アルゴリズムを実装しました。私はそれが動作します正確にどのように任意の説明を見つけることができなかったとの擬似コードは次のように完全に情報価値がない変数名を使用してDA
、DB
、i1
、そしてj1
左のように私は私の頭を掻きます。
Pythonでの実装は次のとおりです。https://gist.github.com/badocelot/5327337
Pythonの実装は、プログラムをウォークスルーして何が起こっているのかを理解し、変数の名前をよりわかりやすい名前に変更するのに役立ちました。私は、私が参照枠を持っているレーベンシュタイン距離を計算するためのワーグナーフィッシャーアプローチに十分に精通していました。
過度に長くなるおそれがあるので、ここに私がダメラウ=レヴェンシュタインを理解する方法を示します。
ミステリー変数:
DA
(last_row
私のコードでは)は、各要素が表示された最後の行を保持する一種のマップです。私のコードでは、それは実際のPython辞書ですDB
(last_match_col
)は、現在の行の文字がb
一致する最後の列を保持しますa
i1
(last_matching_row
)は、DA
現在の文字の行番号ですb
j1
更新される前のDB
/ の値の単なるコピーlast_match_col
です。私のコードでlast_match_col
は、更新された場所に移動してこの変数を削除しました
転置コスト:
H[i1][j1] + (i-i1-1) + 1 + (j-j1-1)
で現在の文字スワップのコスト計算されてb
の最後の文字とb
であることが知られてa
追加または削除のどちらかとの間のすべての文字を処理すること、(最後の試合を)。
コストの要素:
H[i1][j1]
転置を見つけると以前の作業が無効になるため、基本コストを転置前の計算のポイントに戻します。(i-i1-1)
現在の行と現在の文字に一致する最後の行の間の距離であり、これは必要な削除の数です(j-j1-1)
現在の列と一致する最後の列の間の距離、つまり追加の数- 余分なもの
+ 1
は、転置自体のコストです
この分析が正しくない場合は、どこに問題があるのかを知りたいです。言ったように、アルゴリズムがオンラインでどのように機能するかについての詳細な説明は見つかりませんでした。
改良版?
しかし、それを理解して、転置された文字間の追加と削除の両方のコストを計算することには欠陥があるように思われたことに感銘を受けました。1つの追加と1つの削除は置換に相当し、これはチェックしていません。
それがすべて正しい場合、解決策は簡単です。転置された文字間の文字のコストは、追加と削除のどちらか高くなるはずです。できるだけ多くを置換に変換し、残っている追加または削除を追加します。
したがって、コストは次のようになります。
H[i1][j1] + max((i-i1-1), (j-j1-1)) + 1
これがこのバージョンの私のコードです:https : //gist.github.com/badocelot/5327427
いくつかの簡単なテストから、これは正しいようです。たとえば、 "abcdef"-> "abcfad"は編集距離を2(転置 "d"と "f"、 "e"を "a"に変更)しますが、元のアルゴリズムは距離を3(最後の3つ)にします。文字は置換、または1つの転置+ 1つの追加+ 1つの削除です)。
今、私はこれについて考えた最初の人にはなれません。それで、なぜ私はそれに遭遇しなかったのですか?私は十分に長く検索しなかったのですか?または、これが実際に機能しないようにする微妙な欠陥がありますか?