Каков наилучший способ сравнения данных при импорте в базу данных? - PullRequest
6 голосов
/ 28 июля 2011

У меня есть таблица базы данных MySQL, содержащая информацию о 1000 магазинах. Теперь я буду импортировать больше магазинов путем загрузки таблицы Excel и стараюсь избегать дубликатов.

  • Магазины могут иметь одно и то же имя, но не один и тот же адрес.
  • Магазины могут иметь один и тот же адрес, но не одно и то же имя.

Но вот моя проблема.

  • Магазины могут быть с ошибками
  • Адрес может быть написан с ошибкой

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

Мой план - пройти через каждый ряд и сравнить магазины.

  • Сначала сравните a.name = b.name и a.street = b.street. При совпадении магазин удален.
  • Тогда я сделаю сравнение Левенштейна по названию и улице. Здесь мне, вероятно, придется вручную посмотреть на результаты, чтобы определить, является ли это дубликатом.

Кто-нибудь имел опыт такого сравнения данных?

Обновление
Спасибо за хорошие ответы.

Поля, которые будут использоваться для сравнения:

  • имя
  • почтовый адрес
  • почтовый индекс
  • город
  • Страна

Я думаю что-то вроде этого:

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

Тогда я могу начать более тщательно сравнивать имя и адрес.

Ответы [ 2 ]

4 голосов
/ 28 июля 2011

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

Предположим, например, что данные хорошего качества, и вы ожидаете только опечаток, вы можете сгенерировать условие соответствия на основе, 1) количество слов одинаково?2) последовательность этих слов. 3) Небольшое пороговое значение для допустимой ошибки в расстоянии Левенштейна для каждого слова в имени.

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

3 голосов
/ 28 июля 2011

Чтобы расширить мой комментарий к ответу Шонака, я использовал следующий подход:

Создайте серию «хэшей» каждого имени в порядке приоритета. Например, для группы финансовых компаний в Великобритании я использовал следующее:

  • "Хеш" 1: Точное название компании, например "Сент-Джон и Джеймс 'Financial Investments Ltd.".
  • Хеш-код 2: название компании со всеми не алфавитно-цифровыми символами и разделенными пробелами: "Сент-Джеймс Джеймс Файнэншл Инвестментс Лтд"
  • Хэш 3: общие сокращения расширены, например, От 1-го до «Первого», от «Ltd» до «Limited»: «Saint John James Financial Investments Limited». Я также здесь делал общие орфографические ошибки, например «Независимый» на «Независимый». Ваши обычные орфографические ошибки, очевидно, будут зависеть от ваших исходных данных.
  • Хэш 4: слова «Стоп», например «The», «Limited», удалено: «Сент-Джон Джеймс Финансовые инвестиции».

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

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

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

Глядя на мой код, я также использовал хеш, который был Soundex преобразованием каждого слова после удаления стоп-слов и т. Д., Хотя мои комментарии отмечают, что Метафон было бы лучше (Я использовал SQL Server, поэтому Soundex был встроен ...)

...