比較的短いテキスト文字列 (住所、名前などの順序) を持つ大規模なデータベース (潜在的に数百万のレコード) があります。
不正確な重複を削除する戦略を探していますが、あいまい一致が最適な方法のようです。私の問題: 多くの記事と SO の質問は、データベース内のすべてのレコードに対して単一の文字列を照合することを扱っています。データベース全体を一度に重複排除しようとしています。
前者は、線形時間の問題になります (ある値を他の 100 万の値と比較し、毎回何らかの類似度を計算します)。後者は指数時間の問題です (すべてのレコードの値を他のすべてのレコードの値と比較します。100 万レコードの場合、前者のオプションの 1,000,000 回の計算に対して、約 5 x 10^11 回の計算になります)。
私が言及した「ブルートフォース」方法以外のアプローチがあるかどうか疑問に思っています。各レコードの値を比較するための文字列を生成し、類似度がほぼ等しい文字列をグループ化し、これらのグループに対して総当り法を実行することを考えていました。線形時間は達成できませんが、役立つかもしれません。また、これを適切に考えていれば、文字列 A と B の間の潜在的なあいまい一致を見逃す可能性があります。文字列 C (生成されたチェック文字列) との類似性は、互いに非常に類似しているにもかかわらず、非常に異なるためです。
何か案は?
PS私は、時間の複雑さに対して間違った用語を使用した可能性があることを認識しています-それは私が基本的に理解している概念ですが、その場でアルゴリズムを適切なカテゴリにドロップできるほど十分ではありません. 用語を間違って使用した場合は、修正を歓迎しますが、少なくとも私の主張を理解していただければ幸いです.
編集
一部のコメンターは、レコード間のあいまい一致を考慮して、どのレコードを削除するかを選択するための私の戦略は何であるかを尋ねました (つまり、「foo」、「boo」、および「coo」が与えられた場合、重複としてマークされ、削除されます)。ここで自動削除を探しているわけではないことに注意してください。アイデアは、人間によるレビューと評価の目的で、6,000 万以上のレコード データベースで潜在的な重複にフラグを立てることです。おおまかに予測可能/一貫した量である限り、誤検知があっても問題ありません。重複がどの程度蔓延しているかを把握する必要があるだけです。しかし、ファジー マッチング パススルーの実行に 1 か月かかる場合、そもそもこれはオプションではありません。