E.d値を2つの文字列の長さで割って、レーベンシュタイン編集距離を正規化できるかどうか質問があります。長さが等しくない2つの文字列を比較すると、2つの長さの差もカウントされるため、これを求めています。例:ed( 'has a'、 'has a ball')= 4 and ed( 'has a'、 'has a ball the is round')= 15.文字列の長さを増やすと、編集距離それらが類似していても増加します。したがって、適切な編集距離の値を設定することはできません。
はい、編集距離を正規化することは、文字列間の違いを「同一」から「共通点なし」まで単一のスケールで表す1つの方法です。
考慮すべきいくつかの事柄:
[0, 1]
_の範囲にしたい場合は、距離を、指定された長さの2つの文字列間の可能な最大距離で割る必要があります。つまり、 LCS距離 の場合はlength(str1)+length(str2)
、 レーベンシュタイン距離 の場合はmax(length(str1), length(str2))
です。私は以下をうまく使いました:
len = std::max(s1.length(), s2.length());
// normalize by length, high score wins
fDist = float(len - levenshteinDistance(s1, s2)) / float(len);
次に、最高のスコアを選択しました。 1.0は完全一致を意味します。