Как идентифицировать дубликаты записей, используя имя клиента и адрес в SQL, когда они в свободном тексте - PullRequest
0 голосов
/ 10 мая 2018

У меня есть база данных с миллионами клиентских контактов. Однако многие из них дублированы, и я могу попросить какого-нибудь героя отсюда посоветовать, как идентифицировать эти дубликаты, используя Oracle SQL, PL / SQL или Excel.

Ниже приводится структура данных:

Client_Header

id integer (Primary Key)
Client_First_Name (varchar2)
Client_Last_Name (varchar2)
Client_Date_Of_Birth (timestamp)

Client_Address

Client_Id (Foreign Key ref Client_header)
Address_Line1 (varchar2)
Address_Line2 (varhchar2)
Adderss_Line3 (varchar2)
Suburb (Varchar2)
State (varchar2)
Country (varchar2)

Моя задача отличается от Client_Date_Of_Birth, и в этих ключевых полях все поля имеют только свободный текст.

Например, у нас есть клиент, подобный следующему

Surname : Jones

First name : David

Client_Date_Of_Birth: 10/05/1975

Address: Unit 10 Floor 1, 20 Railway Parade, St Peter,  NSW 2044

Однако, поскольку эти поля являются свободным текстом, у меня много проблем с данными, и следующая ссылка (только в формате jpeg) иллюстрирует некоторые из этих проблем

Пример проблем с данными

Примечание:

  1. Кроме этих проблем, иногда мы можем пропустить имя или фамилию клиента (но не оба) тоже
  2. Иногда в одной и той же записи можно найти несколько проблем.
  3. Также иногда адресом может быть просто название школы, торговый центр и т. д.

  4. Система не хранит никаких других идентификаторов, которые могут однозначно идентифицировать клиента.

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

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Несколько лет назад у меня была похожая задача, и я потратил около года, чтобы очистить данные. Что я сделал вкратце:

  1. отправьте адрес на api.addressdoctor.com для проверки и разбейте на отдельные поля (с maps.googleapis.com это также возможно)
  2. используйте список совпадений имени и фамилии для проверки имен (мы использовали namepedia.org). Многое зависит от качества этого списка. Этот список должен основываться на стране рождения или по первому адресу. Из результатов мы сделали вывод о том, какое это имя (имя / фамилия / компания).
  3. с этой улучшенной датой вы должны создать некоторые нормализованные и нечеткие атрибуты. Нормализованные поля из имен и адресов ... как верхний и только с буквенно-цифровым
  4. Элемент списка
  5. В конце я бы немного изменил модель данных, чтобы улучшить качество данных. Я рекомендую вам добавить поля pre-title, post-title, middle-name и post-name. Вы также должны добавить разделенные поля адреса, такие как улица, улица, почтовый индекс, местоположение, долгота, широта и т. Д. Я также изменил бы отношение между Client_Header и Client_Address с дополнительным address_Id в качестве первичного ключа ... но это зависит от требований. И в конце я бы добавил некоторые ограничения, чтобы предотвратить дублирование записей.
  6. В конце концов, это не сложная дедупликация. Сгруппируйте только все нормализованные или нечеткие данные вместе и создайте переменную density_rank. (Я группирую по человеку, по домохозяйству, ...) Сделайте ранжирование по атрибутам (я использовал качество данных, скорость заполнения данных и историю транзакций для значения оценки) Наконец, вы можете выбрать, хотите ли вы просто удалить дубликаты и скопировать соответствующие данные живому клиенту или виртуальное соединение данных через Client_Id в дополнительном поле.
  7. для процессов вставки и обновления вы должны создать функции PL / SQL, которые проверяют, существуют ли нечеткие фамилия (например, имя) + нечеткий адрес. Разделите поля имен и адресов и проверьте их с помощью API адресов и сопоставьте их со ссылкой на имена. Если это запись данных с одним кортежем, покажите наилучшие результаты пользователю и дайте ему решать.
0 голосов
/ 10 мая 2018

Не очень хорошее зрелище, и я боюсь, что у меня нет хороших новостей для вас.

Это распространенная проблема в базах данных, особенно если персонал по вводу данных недостаточно подготовлен. Одна из основных целей обучения вводу данных состоит в том, чтобы сделать проблему понятной и показать способы ее решения. Что-то, чтобы иметь в виду в будущем.

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

Если у вас есть миллионы записей, из которых, возможно, миллион фактически является дубликатами, я бы оценил, что эксперту потребуется полный рабочий день, по крайней мере, два года - и, вероятно, дольше - для решения вашей проблемы: Чтобы сделать это за два года, потребуется зафиксировать 2000 записей в день с перерывом на выходные и две недели отпуска.

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

  1. Измените «Дейв» на «Дэвид» в полях имени и фамилии. (Убедитесь, что на самом деле ни у кого нет фамилии «Дейв».)
  2. Измените все экземпляры «Джонс Дэвид» на «Дэвид Джонс». (Убедитесь, что нет людей по имени «Джонс Дэвид».)
  3. Измените «1 / F» на «Этаж 1».

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

Этот метод ускоряет работу с записями с большим количеством дубликатов. Если у вас есть только несколько дубликатов, быстрее идентифицировать их по одному. Один из способов сделать это быстро - перейти в режим редактирования таблицы, поработать с определенным полем (например, с полем почтового индекса в этом случае) и указать уникальное значение в этом поле, если вы хотите пометить его для удаления. (в этом случае, возможно, один ноль). Затем вы можете периодически удалять все записи с этим значением в поле.

Вам также потребуется отсортировать данные несколькими способами, чтобы найти дубликаты, которые, как вам кажется, вы уже знаете.

Что касается ваших заметок, не пытайтесь определить все способы, которыми данные были испорчены. Как только вы идентифицируете одну запись как копию другой, вам все равно, что с ней не так, вам просто нужно избавиться от нее. Если у вас есть две записи, и каждая содержит данные, которые вы хотите сохранить, а другая отсутствует, вам придется объединить их и удалить одну из них. А затем переходите к следующему, следующему и следующему ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...