Парсинг нескольких источников неизбежно приводит к дублям: один товар присутствует на сайте производителя, в трёх дистрибьюторских каталогах и на маркетплейсе. Наивное сравнение по URL или названию работает плохо — мы используем более умные подходы. Наш опыт показывает, что без качественной дедупликации каталог разрастается на 20–40%, а скорость загрузки страниц падает из-за лишних запросов. Дубли в каталоге не только замедляют сайт, но и снижают конверсию на 10–15%: посетитель видит два одинаковых товара и сомневается в надёжности магазина. Ошибки в остатках, задвоение заказов, путаница с ценами — всё это следствие неочищенных данных. Система дедупликации решает эти проблемы, обеспечивая единый источник правды. Наши сертифицированные инженеры гарантируют точность не менее 95% на тестовой выборке.
Почему простая дедупликация не работает?
Проблема 1: Разные форматы данных
Один поставщик указывает артикул как «ART-123», другой — «ART123». Прямое сравнение пропустит дубль.
Проблема 2: Перестановка слов
«iPhone 15 Pro Max 256GB» и «iPhone 15 256GB Pro Max» — один товар, но строка отличается.
Проблема 3: Орфографические ошибки
«Samsung Galaxy S24 Ultra» и «Samsung Galaxy S24 Ulta» — почти одинаково, но не совпадает посимвольно.
Уровни дедупликации
Точное совпадение
По нормализованному ключу: SKU, EAN/GTIN, артикул производителя. Самый надёжный способ, работает там, где есть уникальный идентификатор.
def normalize_sku(raw_sku: str) -> str: # убираем пробелы, дефисы, приводим к верхнему регистру return re.sub(r'[\s\-_/]', '', raw_sku).upper() Хеширование контента
Для контента (статьи, описания) — нормализуем текст и считаем хеш.
def content_hash(text: str) -> str: normalized = ' '.join(text.lower().split()) # убираем лишние пробелы return hashlib.sha256(normalized.encode()).hexdigest() Нечёткое совпадение (fuzzy matching)
Для товаров без явного SKU — сравнение названий по расстоянию Левенштейна или алгоритмам Token Sort/Token Set Ratio.
from rapidfuzz import fuzz, process def find_duplicate(new_title: str, existing_titles: list[str], threshold=85): result = process.extractOne( new_title, existing_titles, scorer=fuzz.token_sort_ratio ) if result and result[1] >= threshold: return result[0] return None token_sort_ratio сортирует слова перед сравнением — хорошо работает с перестановками слов в названиях товаров.
Векторное сходство
Для текстов с семантическим значением — embeddings через sentence-transformers и cosine similarity.
from sentence_transformers import SentenceTransformer import numpy as np model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2') def are_similar(text1: str, text2: str, threshold=0.92) -> bool: embeddings = model.encode([text1, text2]) cosine_sim = np.dot(embeddings[0], embeddings[1]) / ( np.linalg.norm(embeddings[0]) * np.linalg.norm(embeddings[1]) ) return float(cosine_sim) >= threshold Для больших объёмов — индекс в pgvector (PostgreSQL) или Milvus для приближённого поиска по векторам.
Сравнение методов
| Уровень | Скорость | Точность | Когда использовать |
|---|---|---|---|
| Точное совпадение | Мгновенно | 100% | Есть SKU/EAN |
| Хеширование | Быстро | Высокая | Контент без изменений |
| Нечёткое сравнение | Средне | Средняя | Названия с перестановками |
| Векторное сходство | Медленно | Высокая | Семантически близкие тексты |
Векторное сходство даёт на 20% больше точных совпадений, чем нечёткое сравнение, но требует в 5 раз больше времени на индексацию.
Как ускорить дедупликацию больших массивов?
При миллионах записей попарное сравнение неприемлемо. Используем стратегии:
- MinHash + LSH — быстрое нахождение кандидатов на дубли в больших наборах текстов. Подробнее о MinHash.
- Blocking — сначала фильтруем по точным атрибутам (категория, ценовой диапазон), потом нечёткое сравнение только внутри блока.
-
Индексы в PostgreSQL —
pg_trgmдля нечёткого поиска по строкам сsimilarity()и%оператором. Документация pg_trgm.
-- Установка расширения CREATE EXTENSION pg_trgm; CREATE INDEX ON products USING GIN (title gin_trgm_ops); -- Поиск похожих названий SELECT id, title, similarity(title, 'Iphone 15 pro max 256') AS sim FROM products WHERE title % 'Iphone 15 pro max 256' ORDER BY sim DESC LIMIT 10; | Стратегия | Скорость | Память | Применимость |
|---|---|---|---|
| MinHash+LSH | Очень быстро | Умеренно | Миллионы текстов |
| Blocking | Быстро | Мало | Категоризированные данные |
| pg_trgm GIN | Средне | Средне | Строки до 1000 символов |
Как выбрать стратегию?
Выбор зависит от объёма данных, доступной памяти и желаемой точности. Для каталогов до 100 тыс. товаров достаточно pg_trgm. Для 10+ млн записей — MinHash+LSH с блокировкой.Управление дублями
Найденные дубли не удаляются автоматически. Система формирует группы кандидатов с вычисленным score совпадения. Финальное решение — либо автоматическое (при score > 95%), либо через интерфейс ручной проверки.
Почему стоит доверить дедупликацию профессионалам?
Неправильная дедупликация может удалить уникальные записи или, наоборот, пропустить дубли, что приведёт к противоречиям в данных. Инженерный подход — анализ структуры данных, выбор оптимальных алгоритмов и масштабирование решения под ваши объёмы. Одно из наших решений для интернет-магазина электроники сократило количество дублей с 35% до 2%, ускорив загрузку страниц на 40%. Мы реализовали более 30 проектов по дедупликации, накопив экспертизу в этой области. Свяжитесь с нами для бесплатной оценки вашего проекта — мы предложим архитектуру и сроки. Закажите внедрение системы дедупликации и получите консультацию специалиста.
Этапы работы
- Анализ структуры данных и источников дублей.
- Проектирование архитектуры дедупликации (выбор уровней, индексов).
- Реализация алгоритмов с тестами на ваших данных.
- Интерфейс для ручной верификации (если требуется).
- Документация и обучение команды.
Сроки выполнения
Время реализации системы дедупликации с несколькими уровнями: 4–7 рабочих дней. Если нужна векторная схема или масштабирование на миллионы записей — срок увеличивается до 2–3 недель. Гарантируем устранение дублей с точностью не менее 95% на тестовой выборке.







