ZebroidФорумПубличный разделПредложенияАрхивУскорить поиск дублей

Ускорить поиск дублей

23 марта 2011, 06:29
Зарегистрирован: 26 апреля 2010, 01:51
Для 5000 записей поиск дублей работал всю ночь.

Обработал 12%.

Предлагаю ускорить.



23 марта 2011, 09:10
Зарегистрирован: 10 апреля 2012, 00:00
Отлично, есть предположения как?



23 марта 2011, 17:31
Зарегистрирован: 26 апреля 2010, 01:51
Отлично, есть предположения как?


Может быть есть алгоритмы, которые дают менее точный результат, но при этом работают быстрее чем текущий?

То есть можно сделать light-версию на основе другого алгоритма.

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

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

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



24 марта 2011, 05:00
Зарегистрирован: 10 апреля 2012, 00:00
Может быть есть алгоритмы, которые дают менее точный результат, но при этом работают быстрее чем текущий?


ну есть у меня одно такое предположение, но точность упадет примерно в 3 раза.



24 марта 2011, 07:40
Зарегистрирован: 26 апреля 2010, 01:51
[quote:2glfan37]Может быть есть алгоритмы, которые дают менее точный результат, но при этом работают быстрее чем текущий?


ну есть у меня одно такое предположение, но точность упадет примерно в 3 раза.[/quote:2glfan37]

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



24 марта 2011, 07:48
Зарегистрирован: 10 апреля 2012, 00:00
Для начала посмотрим, что будет после добавления поддержки нескольких ядер процессора.



24 марта 2011, 08:20
Зарегистрирован: 26 апреля 2010, 01:51
Скорость обычно растет в меньшее число раз, чем количество процессоров, потому что часть времени уходит на синхронизацию и не все операции можно распараллелить.

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

Сейчас ориентировочно неделя работы нужна на проект из 5000 записей, будет три с половиной дня.

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

Ощущение что время работы растет по экспоненте в зависимости от числа записей в проекте.



24 марта 2011, 17:29
Зарегистрирован: 10 апреля 2012, 00:00
Сейчас алгоритм примерно такой:

1. Берется первый текст

2. Разбивается по указанному числу шинглов на фразы нужной длины (точнее их хеши)

3. Берутся по очереди все следующие за текущей статьи и аналогично разбиваются на шингы и сверяются хеши

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

Есть замечания к алгоритму?



24 марта 2011, 18:06
Зарегистрирован: 26 апреля 2010, 01:51
Я бы делал через многомерную хеш-функцию и БД.

То есть берем несколько параметров (хеш).

Один раз проходим все тексты.

Потом вводим понятие расстояния между хешами.

С помощью SQL-запроса вытаскиваем все подозрительно похожие пары, к ним применяем более точное сравнение для конкретной пары.



15 апреля 2011, 14:58
Зарегистрирован: 10 апреля 2012, 00:00
Добавил сегодня многоядерность в функцию поиска дублей. На моем 4-ядерном компе, при использовании 3 ядер (одно оставляю для комфортной работы за компьютером во время обработки) скорость поиска дубликатов по сравнению с 1 ядром (как было раньше) выросла на 115%, т.е. больше чем в два раза. Уже не плохое начало :)