2015-09-13 5 views
1

Я использую библиотеку Dedupe для сопоставления записей людей друг с другом. Мои данные включают имя, дату рождения, адрес, номер телефона и другую личную информацию.Настройка явных правил для сопоставления записей с использованием библиотеки Dedupe Python

Вот мой вопрос: я всегда хочу сопоставить две записи со 100% уверенностью, если у них есть соответствующее имя и номер телефона (например).

Вот пример некоторых из моего кода:

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']}, 

В библиотеке DeDupe, есть ли способ для меня, чтобы явно соответствовать двум или более полей? Согласно документам: «Поле взаимодействия умножает значения нескольких переменных». (https://dedupe.readthedocs.org/en/latest/Variable-definition.html#interaction). Я хочу реализовать строгое правило, которое соответствует 100% -ной уверенности, а не просто умножению значений переменных. Причина, по которой я спрашиваю, заключается в том, что я обнаружил, что иногда Dedupe пропускает некоторые совпадения по этим двум критериям (скорее всего, это результат того, что я недостаточно долго тренировался, но, несмотря на это, я просто хочу записать эти совпадения в свой сценарий).

Любые предложения?

ответ

1

Установите все поля, которые вы хотите, чтобы соответствовать точно к типу «точному» - например:

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

Спасибо, @barny. Чтобы уточнить, я хочу, чтобы Dedupe работал над своей магией в дополнение к нескольким условиям, когда матчи автоматически создаются. Если я понимаю Dedupe, вероятность совпадения двух строк - это комбинация вероятностей во всех полях. Например, если я установил HOME_PHONE в «Exact», две записи с тем же номером телефона могут не совпадать, если имя и дата рождения значительно отличаются. Я не думаю, что просто изменение FULL_NM на «Exact» создаст правило, в котором все записи с совпадением имени и номера телефона будут совпадать, потому что другие поля могут быть разными. – blahblahblah

+0

У вас уже есть взаимодействие, настроенное для домашнего телефона и полного имени, - и телефон уже настроен так, что добавление полного имени, точное совпадение должно сделать трюк. Приведите пример того, что депутация не находит - всегда ли у нее такая же комбинация? – barny

+0

Вы пробовали исходный набор правил полей с указанием только имени и номера телефона, оба установлены на точное и, возможно, взаимодействие, ссылающееся на них обоих? Если вы выполняете точные совпадения, вам действительно не нужна дедушка - вы можете предварительно обработать, чтобы найти эту запись и удалить ее из последующей обработки дедуплирования. – barny

2

Dedupe не имеет эту функцию, и, вероятно, никогда не буду (я один из основных авторов). Если это действительно правило, точное совпадение в этих полях означает, что записи являются со-референтами, вы можете написать код, чтобы явно сопоставить их, прежде чем отправлять остальные записи в 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