उत्पाद मिलान: डिस्कवरी स्कोरिंग के साथ शब्दार्थ समानता

यह लेख बताता है कि हम शब्दार्थ समानता के साथ एक वैकल्पिक डिस्कवरी स्कोरिंग मॉडल का उपयोग करके खोज क्वेरी क्लस्टरों को उत्पादों, पार्ट्स और लेखों से कैसे मिलाते हैं, जो प्रासंगिकता, ट्रैफ़िक और पेज रैंक को संतुलित करता है।

समस्या: सबसे अच्छा मिलान ढूँढना

जब उपयोगकर्ता "मिनी पीसी" के लिए खोज करते हैं, तो हमें यह निर्धारित करने की आवश्यकता होती है कि कौन सा उत्पाद पृष्ठ उस क्वेरी का सबसे अच्छा प्रतिनिधित्व करता है। हमारे पास हजारों उत्पाद, पार्ट्स और लेख हैं—हमें कौन सा दिखाना चाहिए?

चुनौती कई कारकों को संतुलित करने की है:

  • शब्दार्थ प्रासंगिकता: पृष्ठ क्वेरी के अर्थ से कितनी अच्छी तरह मेल खाता है?

  • क्वेरी ट्रैफ़िक: इस क्वेरी को कितना खोज ट्रैफ़िक मिलता है?

  • पृष्ठ लोकप्रियता: पृष्ठ को पहले से ही कितना ट्रैफ़िक प्राप्त होता है?

एक सरल दृष्टिकोण (शुद्ध शब्दार्थ समानता) "मिनी पीसी" को शून्य ट्रैफ़िक वाले एक अस्पष्ट उत्पाद से मिला सकता है जिसकी समानता पूर्ण है। एक बेहतर दृष्टिकोण तीनों कारकों पर विचार करता है।

दो मिलान मोड

हम दो मिलान मोड का समर्थन करते हैं:

1. बल्क मिलान (मूल)

प्रत्येक क्लस्टर स्वतंत्र रूप से अपना सबसे अच्छा मिलान ढूंढता है। एक ही पृष्ठ से कई क्लस्टर मेल खा सकते हैं:

  • क्लस्टर A: "मिनी पीसी" → उत्पाद X (समानता 0.95)

  • क्लस्टर B: "छोटा कंप्यूटर" → उत्पाद X (समानता 0.93)

  • क्लस्टर C: "कॉम्पैक्ट डेस्कटॉप" → उत्पाद X (समानता 0.91)

यह अतिरेक पैदा करता है लेकिन यह सुनिश्चित करता है कि प्रत्येक क्लस्टर को उसका सबसे अच्छा मिलान मिले।

2. पुनरावृत्त अनन्य रूटिंग (1:1 मैपिंग)

क्लस्टरों को ट्रैफ़िक स्कोर (उच्चतम पहले) के आधार पर संसाधित किया जाता है। एक बार किसी पृष्ठ का दावा कर लेने के बाद, उसे पूल से हटा दिया जाता है:

  • क्लस्टर A (10K ट्रैफ़िक): "मिनी पीसी" → उत्पाद X (दावा किया गया)

  • क्लस्टर B (5K ट्रैफ़िक): "छोटा कंप्यूटर" → उत्पाद Y (X अनुपलब्ध)

  • क्लस्टर C (2K ट्रैफ़िक): "कॉम्पैक्ट डेस्कटॉप" → उत्पाद Z (X, Y अनुपलब्ध)

यह अगले सर्वोत्तम मिलान के लिए स्वचालित फ़ॉलबैक के साथ अद्वितीय क्वेरी पृष्ठ बनाता है।

एल्गोरिदम: शब्दार्थ समानता

चरण 1: एम्बेडिंग लोड करें

हम पूर्व-गणित एम्बेडिंग लोड करते हैं:

  1. क्वेरी क्लस्टर: प्रत्येक क्लस्टर से केंद्र क्वेरी
  2. स्रोत पृष्ठ: उत्पाद, पार्ट्स, लेख (चरण 0 से)

दोनों एक ही all-mpnet-base-v2 मॉडल का उपयोग करते हैं, जो तुलनीय एम्बेडिंग सुनिश्चित करता है।

चरण 2: समानता की गणना करें

प्रत्येक क्लस्टर के लिए, हम सभी स्रोत पृष्ठों के लिए कोसाइन समानता की गणना करते हैं:

similarities = util.cos_sim(cluster_embedding, source_embeddings)[0]

यह प्रत्येक स्रोत पृष्ठ के लिए एक समानता स्कोर (0.0 से 1.0) उत्पन्न करता है।

चरण 3: डिस्कवरी स्कोरिंग लागू करें (वैकल्पिक)

यदि डिस्कवरी स्कोरिंग सक्षम है, तो हम तीन कारकों को जोड़ते हैं:

50:30:20 डिस्कवरी स्कोरिंग मॉडल:

discovery_score = (similarity * 0.5) + (query_score * 0.3) + (page_rank * 0.2)

जहाँ:

  • समानता (50%): शब्दार्थ प्रासंगिकता (कोसाइन समानता)

  • क्वेरी स्कोर (30%): सामान्यीकृत क्वेरी ट्रैफ़िक (इंप्रेशन + क्लिक)

  • पेज रैंक (20%): सामान्यीकृत पृष्ठ ट्रैफ़िक (लघुगणकीय पैमाना)

यह प्रासंगिकता को ट्रैफ़िक की संभावना के साथ संतुलित करता है।

चरण 4: स्कोर सामान्यीकृत करें

संयोजन से पहले, हम प्रत्येक घटक को [0, 1] तक सामान्यीकृत करते हैं:

क्वेरी स्कोर सामान्यीकरण:

max_query_score = max(cluster.total_score for cluster in clusters)
norm_query_score = query_score / max_query_score

पेज रैंक सामान्यीकरण (लघुगणकीय, उच्च-ट्रैफ़िक पृष्ठों को हावी होने से रोकने के लिए):

max_page_rank = max(traffic_index.values())
norm_page_rank = log1p(page_rank) / log1p(max_page_rank)

लघुगणकीय स्केलिंग होम पेज (उच्चतम ट्रैफ़िक) को सभी मिलानों पर हावी होने से रोकती है।

चरण 5: चेसिस बूस्ट लागू करें (केवल उत्पाद)

उत्पाद मिलान के लिए, हम चेसिस प्रकार के आधार पर स्कोर बढ़ाते हैं:

  • ट्रेओ चेसिस: +10% (नवीनतम, सबसे लोकप्रिय)

  • एस-चेसिस: +5% (कॉम्पैक्ट, उच्च मांग)

  • एच-चेसिस: कोई बूस्ट नहीं (पुराना, कम लोकप्रिय)

if matched_type == "product":
    sku = matched_key.replace("/p/", "")
    chassis_prefix = sku.split("-")[0]
    if chassis_prefix.startswith("Treo"):
        similarity *= 1.10
    elif chassis_prefix.startswith("S"):
        similarity *= 1.05

यह सुनिश्चित करता है कि जब समानता करीब हो तो नए उत्पादों को प्राथमिकता दी जाए।

चरण 6: सर्वोत्तम मिलान चुनें

बल्क मिलान:

best_idx = similarities.argmax()
if similarities[best_idx] >= threshold:
    matches.append(cluster → source_pages[best_idx])

अनन्य रूटिंग:

# ट्रैफ़िक के आधार पर क्लस्टरों को क्रमबद्ध करें (उच्चतम पहले)
sorted_clusters = sorted(clusters, key=lambda c: c.total_score, reverse=True)

# ... (कार्यान्वयन विवरण छोड़ा गया)

विन्यास योग्य थ्रेसहोल्ड

मिलान थ्रेसहोल्ड यह निर्धारित करता है कि मिलान कितना सख्त है:

  • 0.80 (डिफ़ॉल्ट): मध्यम सख्ती, अधिकांश क्लस्टर मेल खाते हैं

  • 0.85: अधिक सख्त, कम लेकिन उच्च-गुणवत्ता वाले मिलान

  • 0.75: अधिक उदार, अधिक क्लस्टर मेल खाते हैं

थ्रेसहोल्ड को कॉन्फ़िग फ़ाइल के माध्यम से कोड परिवर्तन के बिना समायोजित किया जा सकता है।

थ्रेसहोल्ड विश्लेषण मोड

पूर्ण पाइपलाइन चलाने से पहले, हम थ्रेसहोल्ड प्रभाव का विश्लेषण कर सकते हैं:

python 6_match_source_data.py --analyze-threshold

यह समानता रेंज में नमूने उत्पन्न करता है:

  • 0.90-1.00: उत्तम मिलान

  • 0.80-0.90: मजबूत मिलान

  • 0.70-0.80: मध्यम मिलान

  • 0.60-0.70: कमजोर मिलान

  • 0.50-0.60: बहुत कमजोर मिलान

  • 0.40-0.50: खराब मिलान

एक वेब UI इन नमूनों को मैन्युअल समीक्षा के लिए प्रदर्शित करता है। एक थ्रेसहोल्ड चुनने के बाद, पाइपलाइन जारी रखें:

python 6_match_source_data.py --resume-after-threshold

यह UI निर्णय से थ्रेसहोल्ड लोड करता है और मिलान पूरा करता है।

वृद्धिशील एम्बेडिंग

हम क्वेरी और स्रोत पृष्ठों दोनों के लिए एम्बेडिंग कैश करते हैं। जब नया डेटा आता है:

  1. मौजूदा एम्बेडिंग लोड करें
  2. केवल नए आइटम एम्बेड करें
  3. कैश में जोड़ें

यह अपरिवर्तित डेटा को पुनः एम्बेड करने से बचाता है। विवरण के लिए एम्बेडिंग रणनीति देखें।

आउटपुट प्रारूप

मिलान सांख्यिकी और मिलान के साथ एक JSON फ़ाइल उत्पन्न करता है:

{
  "stats": {
    "threshold": 0.80,
# ... (कार्यान्वयन विवरण छोड़ा गया)

मिलान समानता (उच्चतम पहले) के आधार पर क्रमबद्ध होते हैं।

डिस्कवरी स्कोरिंग क्यों?

शुद्ध शब्दार्थ समानता की सीमाएँ हैं:

समस्या 1: अस्पष्ट उत्पाद

  • क्वेरी: "मिनी पीसी" (10K ट्रैफ़िक)

  • सबसे अच्छा मिलान: अस्पष्ट उत्पाद (0.98 समानता, 0 ट्रैफ़िक)

  • बेहतर मिलान: लोकप्रिय उत्पाद (0.95 समानता, 5K ट्रैफ़िक)

समस्या 2: ट्रैफ़िक बेमेल

  • उच्च-ट्रैफ़िक क्वेरी → कम-ट्रैफ़िक पृष्ठ (खोया हुआ अवसर)

  • कम-ट्रैफ़िक क्वेरी → उच्च-ट्रैफ़िक पृष्ठ (अनावश्यक)

डिस्कवरी स्कोरिंग समाधान:

  • प्रासंगिकता (50%) को ट्रैफ़िक की संभावना (30% + 20%) के साथ संतुलित करता है

  • उच्च-ट्रैफ़िक क्वेरी उच्च-ट्रैफ़िक पृष्ठों से मेल खाती हैं

  • कम-ट्रैफ़िक क्वेरी विशिष्ट पृष्ठों से मेल खाती हैं

  • समग्र ट्रैफ़िक वितरण को अधिकतम करता है

प्रदर्शन विशेषताएँ

एक सामान्य सर्वर पर:

  • प्रसंस्करण समय: ~20 मिनट 12.5K क्लस्टर × 5K स्रोत पृष्ठों के लिए

  • मेमोरी उपयोग: ~1 GB (एम्बेडिंग + समानता मैट्रिक्स)

  • सीपीयू उपयोग: समानता गणना के दौरान उच्च

प्रक्रिया सीपीयू-बाउंड है। BLAS त्वरण के साथ NumPy का उपयोग करने से मैट्रिक्स संचालन में काफी तेजी आती है।

SEO पाइपलाइन के साथ एकीकरण

उत्पाद मिलान SEO पाइपलाइन में चरण 6 है:

  1. चरण 0: स्रोत डेटा एम्बेड करें - उत्पाद, पार्ट्स, लेख
  2. चरण 1: क्वेरी लाएँ - GSC, Google Ads, लाइव, Algolia
  3. **चरण