2つの文字列間のパーセンテージの違いを取得する方法やツールがあります(改行なし、ファイルなし)。
たとえば、それぞれ長さが10文字で、1文字だけが異なる2つの文字列がある場合、違いは10%でなければなりません。
文字列の長さはさまざまで、30文字を超えることはほとんどありません。
ベストアンサー1
これ距離を編集2つの文字列の違いを理解するのに便利な指標です。ある文字列から別の文字列に移動するのに必要な挿入、削除、および置換の数を測定します。
abcdef
たとえば、 と を比較するとbcdef
一対一の比較をすれば文字は違うが、一つだけ比較すれば良い。削除一方から他方へ移動する必要があります。
したがって、パーセンテージを距離/最大長に設定できます。
perl -MList::Util=max -MText::LevenshteinXS -le '
($x, $y) = @ARGV
print 100 * distance($x, $y) / max(length $x , length $x)
' -- "$string1" "$string2"
またはawk
:
awk '
function min(x, y) {
return x < y ? x : y
}
function max(x, y) {
return x > y ? x : y
}
function lev(s,t) {
m = length(s)
n = length(t)
for(i=0;i<=m;i++) d[i,0] = i
for(j=0;j<=n;j++) d[0,j] = j
for(i=1;i<=m;i++) {
for(j=1;j<=n;j++) {
c = substr(s,i,1) != substr(t,j,1)
d[i,j] = min(d[i-1,j]+1,min(d[i,j-1]+1,d[i-1,j-1]+c))
}
}
return d[m,n]
}
BEGIN {
print 100 * lev(ARGV[1], ARGV[2]) / max(length(ARGV[1]), length(ARGV[2]))
exit
}' "$string1" "$string2"
これはa
vsまたはb
100を提供しますが、vsまたはbc
50を提供します。空の文字列を自分と比較しようとすると、ゼロ除算エラーが発生します。ab
ac
a
b
abcd
これはコマンド引数の最大長(最新のLinuxシステムでは128KiB)に制限されていますが、必要に応じて他の方法(ファイルから文字列を読み取るなど)で文字列を取得してこの問題を解決できます。
考慮すべきもう1つの指標は次のとおりです。ダメラウ - ルベンシュタイン通り(Text::Levenshtein::Damerau
モジュールからperl
)。これは、連続文字の転置が(ab
vsのようにba
)2の代わりに1として計算されることを除いて、Levenshteinの距離と同じです。
これはおおよそのマッチング(たとえば、最大距離2内で同じであることを確認する)zsh
に使用される距離です。[[ abcd = (#a2)acbe ]]
abcd
acbe