Методы поиска около дубликатов записей - PullRequest
45 голосов
/ 13 июля 2011

Я пытаюсь очистить базу данных, которая за эти годы приобрела много повторяющихся записей с немного другими именами.Например, в таблице компаний есть такие имена, как «Some Company Limited» и «SOME COMPANY LTD!».

Мой план состоял в том, чтобы экспортировать таблицы с ошибками в R, преобразовать имена в нижний регистр, заменить общиесинонимы (например, «limited» -> «ltd»), удаляют не алфавитные символы и затем используют agrep, чтобы увидеть, что выглядит похожим образом.

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

Я очень кратко ознакомился с пакетом tm ( JSS article ) ион кажется очень мощным, но предназначен для анализа больших кусков текста, а не только имен.

У меня есть несколько связанных вопросов:

  1. Подходит ли пакет tmдля такого рода задач?

  2. Есть ли более быстрая альтернатива agrep?(Упомянутая функция использует расстояние редактирования Левенштейна, которое является анекдотически медленным.)

  3. Существуют ли другие подходящие инструменты в R, кроме agrep и tm?

  4. Должен ли я вообще делать это в R, или такого рода вещи должны выполняться непосредственно в базе данных?(Это база данных Access, поэтому я бы предпочел не прикасаться к ней, если это возможно.)

Ответы [ 4 ]

33 голосов
/ 13 июля 2011

Если вы просто делаете небольшие партии, которые относительно хорошо сформированы, то функции compare.linkage() или compare.dedup() в пакете RecordLinkage должны стать отличной отправной точкой. Но если у вас большие партии, вам, возможно, придется еще немного поработать.

Я использую функции jarowinkler(), levenshteinSim() и soundex() в RecordLinkage, чтобы написать свою собственную функцию, использующую мою собственную схему взвешивания (также, как и вы, вы не можете использовать soundex() для большие наборы данных с RecordLinkage).

Если у меня есть два списка имен, которые я хочу сопоставить («ссылка на запись»), то я обычно преобразую оба в нижний регистр и удаляю все знаки препинания. Чтобы позаботиться об «Limited» и «LTD», я обычно создаю еще один вектор первого слова из каждого списка, что позволяет дополнительно взвешивать первое слово. Если я думаю, что один список может содержать аббревиатуры (может быть, ATT или IBM), то я сокращу другой список. Для каждого списка я получаю строку данных со строками, которую я хотел бы сравнить, и которую я пишу как отдельные таблицы в базе данных MySQL.

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

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

9 голосов
/ 14 июля 2011

Может быть Google уточнение может помочь. Возможно, он выглядит более подходящим, если у вас много исключений, и вы еще не знаете их все.

6 голосов
/ 26 сентября 2012

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

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

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

0 голосов
/ 07 апреля 2013

В вашем случае, вероятно, сработает что-то вроде вычисления расстояния редактирования, но если вам нужно найти близкие дубликаты в больших текстовых документах, вы можете попробовать http://www.softcorporation.com/products/neardup/

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