Используйте библиотеку дедупликации Python для возврата всех совпадений с грязным набором данных

Во-первых, если вы еще не видели библиотеку Dedupe для Python: это здорово. Как и TensorFlow, это отличный способ довести машинное обучение до массы (как я).

Я пытаюсь сделать запись связи имен с одним, большим, грязным набором данных. Я сейчас использую эвристику, и она начинает терпеть неудачу с более сложными наборами данных.

Вопросы:

Есть ли способ выполнить сопоставление одной записи (по одному или партиями) и вернуть все потенциальные совпадения?

Газетные документы говорят, что одна сторона должна быть чистой, без дубликатов. Если имена могут дублироваться, но серийные номера не используются (и серийные номера не используются при сопоставлении), не является ли это дубликатом?

Контекст:

В США имеется 1,6 млн специализированных строительных машин. Существует база данных с типом машины, именами владельцев (до двух, включая компании), серийным номером и информацией об обслуживании, например last_service_date,

Люди часто спрашивают об обслуживании и продажах своих машин (100-250 в день), и я веду учет работ. Проблема заключается в сопоставлении имени на телефоне с машиной (ами), которой они владеют. Мне нужно сопоставить имена, которые у меня есть в формах, с именами в записях о владельце, чтобы узнать больше о машине после ее появления и понять жизненный цикл машин.

Пример данных:

"""
 This is simplified data. We often have two names on the form, and owner names
 come in first_name, last_name format but are often split in strange ways when
 multiple owners have a single machine.
"""
# Incoming Record (100-250+ per day)
{
'raw_name': 'Maria C Hernandez', 'inquire_date': '2017-11-16', 'inquire_type': 'sale'
}

# Ownership Records (1.6M+, with duplicates of NAME but not SERIAL #)
[
{'owner_1': 'HECTOR & MARIANNE HERNANDEZ', 'owner_2': '', 'serial': '3993892k'},
{'owner_1': 'MARIANA HERNANDEZ', 'owner_2': '', 'serial': '8383883hh'},
{'owner_1': 'MARIA HERNANDEZ', 'owner_2': 'TAMMY ULMER', 'serial': '123fdfe'},
{'owner_1': 'JOSE & MARIA HERNANDEZ', 'owner_2': 'MH CORP', 'serial': '223466y4'},
{'owner_1': 'MARIA C HERNANDEZ', 'owner_2': 'HIPOLITO HERNANDEZ', 'serial': '2433ff3345'},
]

Возможно, мне также понадобятся некоторые рекомендации... Для нашей эвристики я по существу разделил поля имен в обоих наборах данных и сравнил их 6 или 7 различными способами. Теперь мы получаем запросы с несколькими именами, которые могут помочь сопоставлению. Возможно, сработает больше эвристики, но этот инструмент кажется идеальным для работы.

2 ответа

Решение

Это хороший пример использования класса Gazetteer. Я не уверен, почему вы думаете, что это не подходит?

(Я основной автор дедупе)

Вы можете использовать строковую метрику для одного за другим анализа. Но проверка каждой записи даже в вычислительном отношении не очень эффективна, так как вы будете делать что-то похожее на полное сканирование. Используя строковую метрику, вы можете комбинировать строки и присваивать им веса. Например: объедините имена и номера телефонов, что также помогает избежать реальных дубликатов (если у вас есть две записи для одного и того же человека), так как комбинация будет уникальной строкой. Либо вы можете сформулировать способы присвоения ему веса, либо позволить дедупликации рассчитать вес, используя "Активное обучение".

Пожалуйста, используйте ниже документацию для деталей.

https://dedupe.io/developers/library/en/latest/Matching-records.html

Другие вопросы по тегам