как мне нормализовать большой пользовательский набор данных названий компаний?

Вариант использования: пользователь 1 загружает 100 названий компаний (например, Microsoft, Bank of Sierra).

Пользователь 2 загружает 100 названий компаний (например, The Gap, Uservoice, Microsoft, Inc.)

Я хочу, чтобы представление пользователя 1 о Microsoft и представление пользователя 2 о Microsoft сопоставлялось с централизованно поддерживаемой сущностью с уникальным индексом для Microsoft.

Если кто-то загружает имя, которого нет в центральном репозитории, я бы хотел, чтобы оно было введено как есть. Но что тогда произойдет, если эта первая запись будет написана неправильно (например, Vergin Mobile вместо Virgin Mobile?). Как мы можем лучше всего исправить это и сопоставить новые загрузки с тем же индексом?

Технически, должен ли центральный репозиторий быть отдельной базой данных? Должна ли даже созданная пользователем информация находиться в отдельной базе данных от бизнес-транзакций, которые будут происходить с ней?

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


person AFG    schedule 09.01.2009    source источник
comment
Похоже, все, что вам действительно нужно здесь, это проверка орфографии.   -  person Joe Phillips    schedule 09.01.2009
comment
Ну, помимо проверки орфографии, есть и другие соображения. Например, некоторые люди могут написать Gap вместо Gap или еще что-то. Одна из идей состоит в том, чтобы просмотреть предыдущие ответы и, если есть похожие, спросить, имели ли вы в виду Virgin Mobile, если пользователь набрал Vergin Mobile.   -  person A. Rex    schedule 09.01.2009
comment
Я провел некоторые исследования в этой области и нашел недавнюю статью, в которой обсуждается подход к извлечению, обнаружению (посредством кластеризации) и нормализации (посредством расширенного расчета расстояния редактирования) имен организаций. NEMO   -  person fjxx    schedule 12.06.2013


Ответы (5)


FWIW, это не имеет никакого отношения к нормализации базы данных. Это задача очистки данных.

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

  • Заставьте пользователей выбирать названия компаний из списка, а не вводить их. Конечно, это лучше всего подходит для отдельных записей, а не для массовой загрузки.
  • Сравните SOUNDEX введенных названий компаний с SOUNDEX названиями компаний, которые уже есть в базе данных. Это полезно для выявления возможных совпадений, но также может давать ложные срабатывания. Так что вам нужен человек, чтобы просмотреть их.

В конечном счете, вам необходимо спроектировать свое программное обеспечение таким образом, чтобы администратор мог легко «объединять» записи (и обновлять любые ссылки из других таблиц базы данных), когда они обнаруживаются как дубликаты друг друга. Нет элегантного способа сделать это с каскадными внешними ключами, вам просто нужно написать кучу операторов UPDATE.

person Bill Karwin    schedule 09.01.2009
comment
Никогда не говори невозможно. - person bubakazouba; 03.07.2015
comment
@bubakazouba, точка зрения принята. Можно обнаружить все способы искажения входных данных. Однако не возможно исправить все возможные искажения входных данных. - person Bill Karwin; 03.07.2015

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

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

person Thorsten    schedule 09.01.2009

Вы видите, что происходит, когда вы пытаетесь ввести новый вопрос на этом сайте? Все эти предыдущие вопросы, которые могут быть одинаковыми?

Возможно, даже этого будет недостаточно. Здесь недостаточно.

person dkretz    schedule 09.01.2009

Linked in делает это как-то. Тем не менее, они не выполняют пакетную загрузку... По сути, вы хотите установить какой-то калькулятор различий, который вызовет действие на некоторые потенциальные совпадения.

отбрасывание таких слов, как «Inc», «The» и других, является одним правилом, а затем есть сопоставление с образцом или близкое соответствие слов с ошибками.

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

Я согласен, что это не проблема базы данных - это проблема рабочего процесса.

РЕДАКТИРОВАТЬ

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

person Tim    schedule 09.01.2009

company table    
  id
  name

company_synonym table
  company_id
  name

Эта структура схемы решает перечисленные вами проблемы.

person mson    schedule 09.01.2009