Эта проблема известна как кластеризация и является частью более крупной проблемы дедупликации (где вы можете решить, какой член кластера является правильным), также известной как < сильный> слияние-чистка.
Однажды я прочитал несколько исследовательских работ именно по этой теме (имена приведены ниже), и в основном авторы использовали скользящее окно ограниченного размера над отсортированным списком строк. Они будут только сравнивать (используя алгоритм изменить расстояние) N * N строк внутри < / strong> окно, тем самым уменьшая вычислительную сложность. Если какие-либо две строки выглядели одинаково, они были объединены в кластер (путем вставки записи в отдельную таблицу кластера).
За первым проходом по списку последовал второй проход, где строки были перевернуты перед сортировкой. Таким образом, строки с разными головками получили еще один шанс приблизиться достаточно близко, чтобы их можно было оценить как часть одного и того же окна. На этом втором проходе, если строка выглядела достаточно близко к двум (или более) строкам в окне, и эти строки уже были частями своих собственных кластеров (найденных на первом проходе), тогда два кластера будут объединены (путем обновления таблицы кластеров), и текущая строка будет добавлена во вновь объединенный кластер. Такой подход к кластеризации известен как алгоритм поиска объединения.
Затем они улучшили алгоритм, заменив окно списком X существенно уникальных прототипов. Каждая новая строка будет сравниваться с каждым из X лучших прототипов. Если строка будет выглядеть достаточно близко к одному из прототипов, она будет добавлена в кластер прототипа. Если бы ни один из прототипов не выглядел достаточно похожим, строка стала бы новым прототипом, выталкивая самый старый прототип из верхнего списка X. (Применялась эвристическая логика, чтобы решить, какая из строк в кластере прототипа должна использоваться в качестве нового прототипа, представляющего весь кластер). Опять же, если бы строка выглядела похожей на несколько прототипов, все их кластеры были бы объединены.
Однажды я реализовал этот алгоритм для дедупликации записей имен / адресов с размерами списков порядка 10-50 миллионов записей, и он работал чертовски быстро (и хорошо находил дубликаты).
В целом для таких проблем, конечно, самая сложная часть - это найти правильное значение порога сходства. Идея состоит в том, чтобы фиксировать все дублирования без слишком большого количества ложных срабатываний. Для данных с разными характеристиками обычно требуются разные пороговые значения. Выбор алгоритма дистанции редактирования также важен, поскольку одни алгоритмы лучше подходят для ошибок оптического распознавания текста, другие - для опечаток, а третьи - для фонетических ошибок (например, при получении имени по телефону).
После реализации алгоритма кластеризации хороший способ проверить его - получить список уникальных выборок и искусственно изменить каждую выборку для получения ее вариаций, сохраняя при этом тот факт, что все вариации произошли от тот же родитель. Затем этот список перемешивается и передается в алгоритм. Сравнение исходной кластеризации с кластеризацией, созданной алгоритмом дедупликации, даст вам оценку эффективности.
Библиография:
Эрнандес М. 1995, Проблема слияния / очистки больших баз данных.
Монж А. 1997, Эффективный домен-независимый алгоритм для обнаружения приблизительно повторяющихся записей в базе данных.
person
Community
schedule
23.10.2009