"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 :
- Vous avez besoin d'un mélange de stratégies. Aucun algorithme unique ne résoudra votre problème.
- 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.
- 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.
- Utilisez un texte Oracle (ou similaire) pour créer un thésaurus de surnoms et de variantes.
- Oracle 11g a introduit une fonctionnalité de recherche de nom spécifique dans Oracle Text. En savoir plus.
- Créez une table de noms canoniques pour la notation et liez-y les enregistrements de données réels.
- 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.
- 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 ?
- 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).