LINUX.ORG.RU

Поиск дублей

 


0

1

Интересна стратегия подхода к подобной задаче.

Дано: допустим навскидку 50000 rows (может быть сильно больше) в какой-нибудь RDBS в каждом row есть поле с текстом с 2000-6000 символов.

Надо: найти дубли которые будут либо полностью идентичны либо close enough (отличие в слово или несколько символов с подобным же порядком остальных слов), здесь вариаций может быть очень много, НО будем придерживаться более-менее простой модели.

Как бы вы решили эту проблему? очевидно выбирать каждый row и по некому алгоритму типа levenshtein distance сравнивать с 49999 rows будет не очень эффективно и как-то тупо :)

Есть как бы алгоритм шинглов, поидее можно построить некий внешний индекс выбирая в task queue все ячейки раз в день/ночью и потом уже сравнивать намного более короткие версии этих текстов на наличие почти-дублей, но мне всеравно это кажется как-то затратно, может есть идеи получше?

★★★★★

Последнее исправление: umren (всего исправлений: 1)

А ты раздели задачу.
1. Отсортируй строки по некоему критерию m от строки (O(n^2logn), положим).
2. Ищи схожие строки уже в относительно малых наборах - окрестностях O(n^a/m)
В итоге всяк O(n^a/m + n^2logn) лучше, чем просто O(n^(a+1)) при а >1 :) А для левенштейна «а» в районе 3, не так ли?

d_Artagnan ★★
()

В качестве эффективного способа сортировки, упомянутой предыдущим оратором, можно предложить построение индекса слов, содержащихся в этом текстовом поле. Вообще, по предварительным прикидкам, задача похожа на такие, для которых создавался Apache Lucene и всякие прочие SOLRы

AlexM ★★★★★
()

Надо: найти дубли которые будут либо полностью идентичны

ну делим на слова, и составляем индекс: слово->rows. Далее выборка по «слово».

очевидно выбирать каждый row и по некому алгоритму типа levenshtein distance сравнивать с 49999 rows будет не очень эффективно и как-то тупо

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

emulek
()

Ну вот, после быдлокурсеры изо всех так и прут «levenshtein distance» без понимания что это и зачем...

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.