גרידת נתונים ממספר מקורות מובילה בהכרח לכפילויות: מוצר מופיע באתר היצרן, בשלושה קטלוגים של מפיצים ובמרקטפלייס. השוואה נאיבית לפי 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() התאמה עמומה
למוצרים ללא 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 Nonedef normalize_sku(raw_sku: str) -> str: # убираем пробелы, дефисы, приводим к верхнему регистру return re.sub(r'[\s\-_/]', '', raw_sku).upper() ממיין מילים לפני ההשוואה—עובד היטב עם שינויים בסדר מילים בכותרות מוצרים.
דמיון וקטורי
לטקסטים בעלי משמעות סמנטית—אמבדינגס באמצעות sentence-transformers ודמיון קוסינוס.
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—
def content_hash(text: str) -> str: normalized = ' '.join(text.lower().split()) # убираем лишние пробелы return hashlib.sha256(normalized.encode()).hexdigest()לחיפוש מחרוזות עמום עם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. תיעוד 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 תווים |
איך לבחור אסטרטגיה?
הבחירה תלויה בנפח הנתונים, בזיכרון הזמין ובדיוק הרצוי. לקטלוגים עד 100k פריטים, pg_trgm מספיק. ל-10+ מיליון רשומות, השתמשו ב-MinHash+LSH עם blocking.ניהול כפילויות
כפילויות שנמצאו אינן מוסרות אוטומטית. המערכת יוצרת קבוצות מועמדים עם ציון התאמה מחושב. ההחלטה הסופית היא אוטומטית (כאשר הציון > 95%) או דרך ממשק בדיקה ידני.
למה להפקיד דדופליקציה בידי אנשי מקצוע?
דדופליקציה שגויה עלולה למחוק רשומות ייחודיות או לפספס כפילויות, מה שמוביל לסתירות בנתונים. הגישה ההנדסית שלנו כוללת ניתוח מבנה הנתונים, בחירת אלגוריתמים אופטימליים והרחבת הפתרון לנפחים שלכם. אחד הפתרונות שלנו לחנות אלקטרונית למוצרי חשמל הפחית כפילויות מ-35% ל-2%, והאיץ את טעינת העמודים ב-40%. יישמנו מעל 30 פרויקטי דדופליקציה, וצברנו מומחיות בתחום זה. צרו קשר להערכה חינמית של הפרויקט שלכם—נציע ארכיטקטורה ולוח זמנים. הזמינו יישום של מערכת דדופליקציה וקבלו ייעוץ ממומחה.
שלבי העבודה
- ניתוח מבנה נתונים ומקורות כפילויות.
- עיצוב ארכיטקטורת דדופליקציה (בחירת רמה ואינדקס).
- יישום אלגוריתם עם בדיקות על הנתונים שלכם.
- ממשק לבדיקה ידנית (אם נדרש).
- תיעוד והדרכת צוות.
לוח זמנים
זמן יישום למערכת דדופליקציה עם מספר רמות: 4–7 ימי עבודה. אם נדרשת סכמה וקטורית או הרחבה למיליוני רשומות, לוח הזמנים מתארך ל-2–3 שבועות. אנו מבטיחים הסרת כפילויות עם דיוק של לפחות 95% על מדגם בדיקה.







