Парсинг кількох джерел неминуче призводить до дублів: один товар присутній на сайті виробника, у трьох дистриб'юторських каталогах і на маркетплейсі. Наївне порівняння за URL або назвою працює погано — ми використовуємо більш розумні підходи. Наш досвід показує, що без якісної дедуплікації каталог розростається на 20–40%, а швидкість завантаження сторінок падає через зайві запити. Дублі в каталозі не лише сповільнюють сайт, але й знижують конверсію на 10–15%: відвідувач бачить два однакові товари і сумнівається в надійності магазину. Помилки в залишках, задвоєння замовлень, плутанина з цінами — все це наслідок неочищених даних. Система дедуплікації вирішує ці проблеми, забезпечуючи єдине джерело правди. Наші сертифіковані інженери (5+ років досвіду, 30+ успішних проєктів) гарантують точність не менше 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+LSH швидше за попарне порівняння в 100 разів на масиві з 10 млн записів. Детальніше про MinHash.
- Blocking — спочатку фільтруємо за точними атрибутами (категорія, ціновий діапазон), потім нечітке порівняння тільки всередині блоку. Метод блокування даних зменшує кількість порівнянь у 10–50 разів.
-
Індекси в 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%), або через інтерфейс ручної перевірки.
Що входить у роботу
Пропонуємо рішення під ключ. У вартість входить:
- Документація архітектури та алгоритмів
- Доступ до системи моніторингу та логування
- Навчання команди (2 години онлайн)
- Технічна підтримка 2 тижні після впровадження
- Інтерфейс для ручної верифікації дублів
Чому варто довірити дедуплікацію професіоналам?
Неправильна дедуплікація може видалити унікальні записи або, навпаки, пропустити дублі, що призведе до суперечностей у даних. Інженерний підхід — аналіз структури даних, вибір оптимальних алгоритмів та масштабування рішення під ваші обсяги. Одне з наших рішень для інтернет-магазину електроніки скоротило кількість дублів з 35% до 2%, прискоривши завантаження сторінок на 40%. Ми реалізували понад 30 проєктів з дедуплікації, накопичивши експертизу в цій галузі. Економія для клієнта склала до $5000 на місяць на ручній перевірці та підтримці каталогу. Зв'яжіться з нами для безкоштовної оцінки вашого проєкту — ми запропонуємо архітектуру та терміни. Замовте впровадження системи дедуплікації під ключ та отримайте консультацію спеціаліста.
Етапи роботи
- Аналіз структури даних і джерел дублів.
- Проєктування архітектури дедуплікації (вибір рівнів, індексів).
- Реалізація алгоритмів з тестами на ваших даних.
- Інтерфейс для ручної верифікації (якщо потрібно).
- Документація та навчання команди.
Терміни виконання
Час реалізації системи дедуплікації з кількома рівнями: 4–7 робочих днів. Якщо потрібна векторна схема або масштабування на мільйони записів — термін збільшується до 2–3 тижнів. Оцініть проєкт безкоштовно — зв'яжіться з нами, щоб отримати точний розрахунок. Гарантуємо усунення дублів з точністю не менше 95% на тестовій вибірці.







