2つの文字列間のパーセンテージの違い

2つの文字列間のパーセンテージの違い

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"

これはavsまたはb100を提供しますが、vsまたはbc50を提供します。空の文字列を自分と比較しようとすると、ゼロ除算エラーが発生します。abacababcd

これはコマンド引数の最大長(最新のLinuxシステムでは128KiB)に制限されていますが、必要に応じて他の方法(ファイルから文字列を読み取るなど)で文字列を取得してこの問題を解決できます。

考慮すべきもう1つの指標は次のとおりです。ダメラウ - ルベンシュタイン通りText::Levenshtein::Damerauモジュールからperl)。これは、連続文字の転置が(abvsのようにba)2の代わりに1として計算されることを除いて、Levenshteinの距離と同じです。

これはおおよそのマッチング(たとえば、最大距離2内で同じであることを確認する)zshに使用される距離です。[[ abcd = (#a2)acbe ]]abcdacbe

おすすめ記事