sql >> データベース >  >> RDS >> Oracle

Soundex、Jaro Winkler、およびEdit Distance(UTL_MATCH)を使用したOracleの重複列値の照合

    「データベース内の重複する人物レコードを照合するための信頼できる方法を見つけようとしています。」

    残念ながら、そのようなことはありません。あなたが望むことができるのは、合理的な疑いの要素を持つシステムです。

    SQL> select n1
           , n2
           , soundex(n1) as sdx_n1
           , soundex(n2) as sdx_n2
           , utl_match.edit_distance_similarity(n1, n2) as ed
           , utl_match.jaro_winkler_similarity(n1, n2) as jw   
    from t94
    order by n1, n2
    /
    
    
      2    3    4    5    6    7    8    9  
    N1                   N2                   SDX_ SDX_         ED         JW
    -------------------- -------------------- ---- ---- ---------- ----------
    MARK                 MARKIE               M620 M620         67         93
    MARK                 MARKS                M620 M620         80         96
    MARK                 MARKUS               M620 M622         67         93
    MARKY                MARKIE               M620 M620         67         89
    MARSK                MARKS                M620 M620         60         95
    MARX                 AMRX                 M620 A562         50         91
    MARX                 M4RX                 M620 M620         75         85
    MARX                 MARKS                M620 M620         60         84
    MARX                 MARSK                M620 M620         60         84
    MARX                 MAX                  M620 M200         75         93
    MARX                 MRX                  M620 M620         75         92
    
    11 rows selected.
    
    SQL> SQL> SQL> 
    

    SOUNDEXの大きな利点は、文字列をトークン化することです。これは、インデックスを作成できる何かを提供することを意味します :これは、大量のデータに関しては非常に価値があります。一方、それは古くて粗雑です。 MetaphoneやDoubleMetaphoneなど、新しいアルゴリズムがあります。 Googleを介してそれらのPL/SQL実装を見つけることができるはずです。

    スコアリングの利点は、ある程度のあいまいさを許容することです。したがって、すべての行をwhere name_score >= 90%で見つけることができます。 。圧倒的な欠点は、スコアが相対的であるため、インデックスを作成できないことです。この種の比較は、大量のデータであなたを殺します。

    これが意味することは:

    1. さまざまな戦略が必要です。単一のアルゴリズムで問題を解決することはできません。
    2. データクレンジングは便利です。 MARXとMRXおよびM4RXのスコアを比較します。名前から数字を削除すると、ヒット率が向上します。
    3. 大量の名前をその場で採点することはできません。可能であれば、トークン化と事前スコアリングを使用してください。チャーンがあまりない場合は、キャッシュを使用します。余裕があれば、パーティショニングを使用してください。
    4. Oracle Text(または同様のもの)を使用して、ニックネームとバリアントのシソーラスを作成します。
    5. Oracle 11gは、OracleTextに特定の名前検索機能を導入しました。詳細をご覧ください。
    6. スコアリング用の正規名のテーブルを作成し、実際のデータレコードをそれにリンクします。
    7. 他のデータ値、特に生年月日などのインデックス可能なデータ値を使用して、大量の名前を事前にフィルタリングしたり、提案された一致の信頼性を高めたりします。
    8. 他のデータ値には独自の問題があることに注意してください。誰かが31/01/11に生まれたのは11か月ですか、それとも80歳ですか。
    9. 特にローマ字化された名前を考慮する必要がある場合は、名前に注意が必要です。MoammarKhadaffi(ローマ字)のスペルには400を超える方法があり、Googleでさえどのバリアントが最も標準的です。

    私の経験では、トークン(名、姓)を連結することは混合された祝福です。特定の問題(道路名が住所1行目または住所2行目に表示されるかどうかなど)を解決しますが、他の問題を引き起こします:OLIVER vs OLIVER、GRAHAM vs GRAHAM、OLIVER vs GRAHAM、GRAHAM vs OLIVERのスコアリングに対して、GRAHAMOLIVERとOLIVERGRAHAMのスコアリングを検討してください。

    何をするにしても、誤検知やヒットの失敗に終わります。タイプミスを証明するアルゴリズムはありません(ただし、Jaro WinklerはMARXとAMRXでかなりうまくいきました)。




    1. データコンテキストを使用してサッカーデータの10億行のテーブルを分割する

    2. DateTimeを5、15、30、および60分間隔にグループ化します

    3. MySQLを使用したSpringBootCRUDの例

    4. MariaDBテンポラルテーブルとは何ですか?