2015-09-13 2 views
1

J'utilise la bibliothèque Dedupe pour faire correspondre les enregistrements de personne les uns avec les autres. Mes données incluent le nom, la date de naissance, l'adresse, le numéro de téléphone et d'autres informations d'identification personnelle.Définition de règles explicites pour la correspondance des enregistrements à l'aide de la bibliothèque Python Dedupe

Voici ma question: Je veux toujours faire correspondre deux enregistrements avec 100% de confiance s'ils ont un nom et un numéro de téléphone correspondant (par exemple).

Voici un exemple d'une partie de mon code:

fields = [ 
    {'field' : 'LAST_NM', 'variable name' : 'last_nm', 'type': 'String'}, 
    {'field' : 'FRST_NM', 'variable name' : 'frst_nm', 'type': 'String'}, 
    {'field' : 'FULL_NM', 'variable name' : 'full_nm', 'type': 'Name'}, 
    {'field' : 'BRTH_DT', 'variable name' : 'brth_dt', 'type': 'String'}, 
    {'field' : 'SEX_CD', 'type': 'Exact'}, 
    {'field' : 'FULL_US_ADDRESS', 'variable name' : 'us_address', 'type': 'Address'}, 
    {'field' : 'APT_NUM', 'type': 'Exact'}, 
    {'field' : 'CITY', 'type': 'ShortString'}, 
    {'field' : 'STATE', 'type': 'ShortString'}, 
    {'field' : 'ZIP_CD', 'type': 'ShortString'}, 
    {'field' : 'HOME_PHONE', 'variable name' : 'home_phone', 'type': 'Exact'}, 
    {'type': 'Interaction', 'interaction variables' : ['full_nm', 'home_phone']}, 

Dans la bibliothèque de Dedupe, est-il un moyen pour moi de faire correspondre explicitement deux ou plusieurs champs? Selon les docs, "Un champ d'interaction multiplie les valeurs des variables multiples." (https://dedupe.readthedocs.org/en/latest/Variable-definition.html#interaction). Je veux appliquer une règle stricte qui correspond à 100% de confiance - ne pas simplement multiplier les valeurs des variables. La raison pour laquelle je demande est que j'ai trouvé que Dedupe manque occasionnellement des matches sur ces deux critères (probablement parce que je ne m'entraîne pas assez longtemps, mais je veux juste coder dur ces matchs dans mon script).

Des suggestions?

Répondre

1

Définissez tous les champs que vous souhaitez correspondre exactement à taper « exacte » - par exemple:

{'field' : 'FULL_NM', 'variable name' : 'full_nm', 'type': 'Exact'}, 
+0

Merci, @barny. Pour clarifier, je veux que Dedupe travaille sa magie en plus des quelques conditions où les matchs sont faits automatiquement. Si je comprends Dedupe, la probabilité de correspondre à deux lignes est une combinaison des probabilités dans tous les champs. Par exemple, si je mets HOME_PHONE sur "Exact", deux enregistrements avec le même numéro de téléphone peuvent ne pas toujours correspondre si le nom et la date de naissance sont significativement différents. Je ne pense pas que le simple fait de changer FULL_NM en 'Exact' va créer une règle où tous les enregistrements avec le nom et le numéro de téléphone correspondent, car les autres champs peuvent être très différents. – blahblahblah

+0

Vous avez déjà l'interaction configurée pour le téléphone à domicile et le nom complet - et le téléphone est déjà configuré pour être exact, donc l'ajout d'un nom complet devrait faire l'affaire. Donner un exemple de ce que la déduplication ne parvient pas à repérer - manque-t-il toujours la même combinaison? – barny

+0

avez-vous essayé un jeu de règles initial avec juste le nom et le numéro de téléphone, tous les deux réglés sur exact, et probablement une interaction référençant les deux? Si vous faites des correspondances exactes, vous n'avez pas vraiment besoin de la déduplication - vous pouvez pré-traiter pour trouver ces enregistrements et les retirer du traitement de déduplication ultérieur. – barny

2

Dedupe ne possède pas cette fonctionnalité et ne sera probablement jamais (je suis l'un des principaux auteurs). Si c'est vraiment une règle que les correspondances exactes sur ces champs signifient que les enregistrements sont co-référents, vous pouvez écrire du code pour les faire correspondre explicitement avant d'envoyer le reste des enregistrements dans Dedupe.

exact_matches = defaultdict(list) 
for record_id, record in records.items(): 
    match_key = (record['name'], record['phone']) 
    exact_matches[match_key].append(record_id) 

partially_deduplicated = [] 
exact_lookup = {} 
for match_group in exact_matches.values(): 
    head_id = match_group.pop() 
    partially_deduplicated.append((head_id, records[head_id])) 
    for dupe_id in match_group : 
     exact_lookup[dupe_id] = head_id