2

重複を比較したい 2 つのテーブルがあります。これらのテーブルは、名前、市区町村、都道府県などの基本的な会社情報フィールドにすぎません。私が確認できる唯一の一般的なフィールドは名前列ですが、名前は正確ではありません。LIKE ステートメントを使用して 2 つの比較を実行する方法はありますか? また、どなたでも追加の提案をお待ちしております。

ありがとう。

4

4 に答える 4

3

より洗練された SOUNDEX タイプのアルゴリズムであるDouble Metaphoneアルゴリズムを使用してマッチングを試みます。

これはMySQL の実装です。

于 2009-09-18T04:40:48.447 に答える
2

この種のファジーマッチングを行うデータクレンジング製品を販売することで生計を立てている企業があります。LIKEしたがって、単純な (または非常に複雑な)ステートメントでこれを解決できる可能性は低いと思われます。

必要なのは、2 つの文字列を比較し、類似性のスコア (同一を意味する 100% のスコア) を返すことができるものです。Jaro-Winkler アルゴリズムのようなもの。代替アルゴリズムには、Metaphone (または Double Metaphone) およびSoundex(). Soundex()は最も粗雑な解決策です。

別の解決策は、専門のテキスト索引を使用することです。このアプローチの優れた点は、シソーラスを指定して、無関係な違いを解決する同義語を指定できることです (INC = INCORPORATED、CO = COMPANY など)。

Oracle と SQL Server にはそのようなツールが含まれていますが、MySQL には詳しくありません。

于 2009-09-18T04:41:07.027 に答える
1

SOUNDEX()はある程度役立ちます。しかし、それは完璧には程遠いです。

string1 と string2 の綴りが異なっていても、soundex(string1) は soundex(string2) と等しいと想定されます。しかし、私が言ったように、それは完璧には程遠いです.

私の知る限り、これを完全に行う既存のアルゴリズムはありません。

于 2009-09-18T04:39:35.190 に答える
0

まあ、100% 保証された正しい方法はありません。ただし、すべての「乱雑な」列をより標準的な形式に変換することで、おそらくある程度の進歩を遂げることができます。たとえば、すべてを大文字にし、先頭と末尾のスペースをトリミングし、行に最大 1 つのスペースが表示されるようにします。また、フォームの名前を「SMITH, JOHN」から「JOHN SMITH」に変更する (またはその逆 - フォームを選択してそのまま使用する) こともできます。もちろん、レコードのコピーを作成する必要があります。オリジナルを変更しないでください。さらに情報を破棄して実験することもできます (例: "JOHN SMITH" -> "J SMITH")。これにより、偽陽性と偽陰性のバランスが変わることがわかります。

おそらく、レコードの各ペアに類似性スコアを割り当てるアプローチを取るでしょう。たとえば、正規化された名前、住所、および電子メール アドレスが正確に一致する場合、1000 のスコアを割り当てます。それ以外の場合は、 1000 からレーベンシュタイン距離(の倍数) を引き、それを使用します。さまざまな種類の違いの相対的な重要性を試して決定することにより、独自のスコアリング スキームを考え出す必要があります (たとえば、電話番号の数字の違いは、2 人の名前の 1 文字の違いよりもおそらく重要です)。次に、実験的にスコアを確立して、それを超えると自信を持ってレコードのペアに「重複」ステータスを割り当てることができ、それを超えると手動チェックが必要になるスコアを下げることができます。そのスコアから、2 つのレコードは重複していないと自信を持って言えます。

ここでの現実的な目標は、実行する必要がある手動の重複除去作業の量を減らすことです。 すべての重複が何らかの自動コピー プロセスによって生成されたものでない限り、完全に削除することはできません。

于 2009-09-18T04:42:47.783 に答える