web-dev-qa-db-ja.com

編集距離の正規化

E.d値を2つの文字列の長さで割って、レーベンシュタイン編集距離を正規化できるかどうか質問があります。長さが等しくない2つの文字列を比較すると、2つの長さの差もカウントされるため、これを求めています。例:ed( 'has a'、 'has a ball')= 4 and ed( 'has a'、 'has a ball the is round')= 15.文字列の長さを増やすと、編集距離それらが類似していても増加します。したがって、適切な編集距離の値を設定することはできません。

8
Naufal Khalid

はい、編集距離を正規化することは、文字列間の違いを「同一」から「共通点なし」まで単一のスケールで表す1つの方法です。

考慮すべきいくつかの事柄:

  1. 正規化された距離が文字列間の類似性のより良い尺度であるかどうかは、アプリケーションによって異なります。質問が「この単語がその単語のスペルミスである可能性はどのくらいありますか?」である場合、正規化は進むべき方法です。 「このドキュメントは前回のバージョンからどのくらい変更されましたか?」の場合は、生の編集距離の方が適している可能性があります。
  2. 結果を_[0, 1]_の範囲にしたい場合は、距離を、指定された長さの2つの文字列間の可能な最大距離で割る必要があります。つまり、 LCS距離 の場合はlength(str1)+length(str2)レーベンシュタイン距離 の場合はmax(length(str1), length(str2))です。
  3. 正規化された距離は、 三角不等式 に違反するため、メトリックではありません。
14
Anton

私は以下をうまく使いました:

len = std::max(s1.length(), s2.length());
// normalize by length, high score wins
fDist = float(len - levenshteinDistance(s1, s2)) / float(len);

次に、最高のスコアを選択しました。 1.0は完全一致を意味します。

0
Martin