Oracle
 sql >> Base de données >  >> RDS >> Oracle

Correspondance des valeurs de colonne en double Oracle à l'aide de Soundex, Jaro Winkler et Edit Distance (UTL_MATCH)

"J'essaie de trouver une méthode fiable pour faire correspondre les enregistrements de personnes en double dans la base de données."

Hélas il n'y a rien de tel. Le mieux que vous puissiez espérer est un système avec un élément de doute raisonnable.

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> 

Le gros avantage de SOUNDEX est qu'il tokenise la chaîne. Cela signifie qu'il vous donne quelque chose qui peut être indexé :ceci est incroyablement précieux lorsqu'il s'agit de grandes quantités de données. D'autre part, il est vieux et grossier. Il existe de nouveaux algorithmes, tels que Metaphone et Double Metaphone. Vous devriez pouvoir en trouver des implémentations PL/SQL via Google.

L'avantage de la notation est qu'elle permet un degré de flou; afin que vous puissiez trouver toutes les lignes where name_score >= 90% . L'inconvénient majeur est que les scores sont relatifs et que vous ne pouvez donc pas les indexer. Ce genre de comparaison vous tue avec de gros volumes.

Cela signifie :

  1. Vous avez besoin d'un mélange de stratégies. Aucun algorithme unique ne résoudra votre problème.
  2. Le nettoyage des données est utile. Comparez les scores de MARX, MRX et M4RX :la suppression des numéros des noms améliore le taux de réussite.
  3. Vous ne pouvez pas marquer de gros volumes de noms à la volée. Utilisez la tokenisation et le pré-score si vous le pouvez. Utilisez la mise en cache si vous n'avez pas beaucoup de désabonnement. Utilisez le partitionnement si vous pouvez vous le permettre.
  4. Utilisez un texte Oracle (ou similaire) pour créer un thésaurus de surnoms et de variantes.
  5. Oracle 11g a introduit une fonctionnalité de recherche de nom spécifique dans Oracle Text. En savoir plus.
  6. Créez une table de noms canoniques pour la notation et liez-y les enregistrements de données réels.
  7. Utilisez d'autres valeurs de données, en particulier celles indexables comme la date de naissance, pour préfiltrer de grands volumes de noms ou pour augmenter la confiance dans les correspondances proposées.
  8. Sachez que d'autres valeurs de données comportent leurs propres problèmes :une personne née le 31/01/11 a-t-elle onze mois ou quatre-vingts ans ?
  9. N'oubliez pas que les noms sont délicats, surtout lorsqu'il s'agit de noms qui ont été romanisés :il existe plus de quatre cents façons différentes d'épeler Moammar Khadaffi (en alphabet romain) - et même Google n'arrive pas à se mettre d'accord sur la variante le plus canonique.

D'après mon expérience, la concaténation des jetons (prénom, nom) est une bénédiction mitigée. Cela résout certains problèmes (par exemple, si le nom de la route apparaît dans la ligne d'adresse 1 ou la ligne d'adresse 2) mais en cause d'autres :pensez à marquer GRAHAM OLIVER contre OLIVER GRAHAM contre marquer OLIVER contre OLIVER, GRAHAM contre GRAHAM, OLIVER contre GRAHAM et GRAHAM contre OLIVER .

Quoi que vous fassiez, vous vous retrouverez toujours avec des faux positifs et des résultats manqués. Aucun algorithme n'est à l'épreuve des fautes de frappe (bien que Jaro Winkler ait plutôt bien réussi avec MARX vs AMRX).