複数のファイルから数百万件のレコードのファジーマッチングを行う必要があるユースケースがあります。そのための2つのアルゴリズムを特定しました:Jaro-WinklerおよびLevenshtein編集距離。
両方を調査し始めたとき、私は両者の正確な違いを理解できませんでした。 Levenshteinは2つの文字列間の編集数を提供し、Jaro-Winklerは0.0〜1.0の一致スコアを提供するようです。アルゴリズムが理解できませんでした。どちらかのアルゴリズムを使用する必要があるため、アルゴリズムのパフォーマンスに関して正確な違いを知る必要があります。
レーベンシュタインは、ある文字列を別の文字列に変換するために必要な編集(挿入、削除、または置換)の数をカウントします。 Damerau-Levenshteinは、転置も単一の編集と見なす修正版です。出力は編集の整数数ですが、これを正規化して式により類似度の値を与えることができます
1 - (edit distance / length of the larger of the two strings)
Jaroアルゴリズムは、共通の文字の尺度であり、距離の長い文字列の長さの半分以下であり、転置を考慮しています。ウィンクラーは、このアルゴリズムを修正して、文字列の先頭付近の違いが文字列の末尾付近の違いよりも重要であるという考えをサポートしました。 JaroとJaro-Winklerは、単語や名前のような小さな文字列を比較するのに適しています。
どちらを使用するかは、パフォーマンスだけの問題ではありません。比較する文字列の性質に適した方法を選択することが重要です。ただし、一般に、各文字列は他のすべての文字列と比較する必要があり、データセット内の数百万の文字列と比較するため、非常に多くの比較を行うため、前述のアルゴリズムはどちらも高価になります。これは、各文字列の音声エンコードを計算し、同じエンコードを共有する文字列を単純にグループ化するようなものよりもはるかに高価です。
これらのアルゴリズムおよびインターネット上の他のファジー文字列照合アルゴリズムに関する詳細な情報が豊富にあります。これはあなたにスタートを与えます:
その論文によると、私が言及した4つのJaroおよびLevenshteinアルゴリズムの速度は、最も速いものから最も遅いものまでです。
最も遅い時間は、最も速い時間の2〜3倍です。もちろん、これらの時間は文字列の長さと実装に依存し、使用されていない可能性のあるこれらのアルゴリズムを最適化する方法があります。