6 पॉइंट द्वारा GN⁺ 2024-02-08 | 1 टिप्पणियां | WhatsApp पर शेयर करें

Python से बना 80-लाइन का सर्च इंजन

  • पिछले सितंबर में Wallapop में search data scientist के रूप में शामिल होने के बाद, लेखक Solr नामक open source search engine के साथ काम कर रहे हैं.
  • सर्च इंजन के बुनियादी सिद्धांतों को समझने के लिए उन्होंने Python का उपयोग करके शुरू से एक सर्च इंजन बनाने का फैसला किया.
  • लक्ष्य "छोटी वेबसाइटों की discoverability crisis" को हल करना है, यानी उन छोटी वेबसाइटों को फिर से खोजने योग्य बनाना जिन्हें Google जैसे सर्च इंजन से ढूँढा नहीं जा सकता.
  • यह लेख Python का उपयोग करके सर्च इंजन बनाने की प्रक्रिया बताता है, और लिखा गया पूरा कोड GitHub के microsearch repository में देखा जा सकता है.
  • बनाया गया सर्च इंजन production-ready नहीं है, बल्कि यह एक उपयोगी toy example है जो दिखाता है कि सर्च इंजन अंदर से कैसे काम करते हैं.

microsearch

  • इसमें microsearch के घटकों को देखा गया है और यह समझा गया है कि हर हिस्से को कैसे बनाया गया: (1) crawler, (2) inverted index, (3) ranking, (4) interface.

crawler

  • सर्च इंजन बनाने का पहला कदम है खोजने के लिए डेटा इकट्ठा करना.
  • "local Google" बनाने के इरादे से लेखक ने जिन ब्लॉगों को follow किया, उनके डेटा का उपयोग करके सर्च इंजन बनाया.
  • crawling में चुनी गई ब्लॉग सूची की सभी पोस्ट डाउनलोड करना और उन्हें व्यवस्थित करना शामिल है.
  • इसे तेज़ बनाने के लिए asyncio Python library का उपयोग किया गया, जिससे crawling time 20 मिनट से घटकर 20 सेकंड रह गया.
  • 642 RSS feeds का उपयोग किया गया, जिनमें लगभग 100 अक्सर पढ़े जाने वाले ब्लॉग थे और बाकी 500 surprisetalk blog project से लिए गए.

inverted index

  • inverted index एक data structure है जो keywords को documents से map करता है, ताकि यह आसानी से पता चल सके कि कोई खास शब्द किन documents में आता है.
  • जब उपयोगकर्ता कोई query खोजता है, तो query के keywords से मेल खाने वाले सभी documents को पाने के लिए inverted index का उपयोग किया जाता है.
  • inverted index का logic SearchEngine नाम की class के भीतर परिभाषित है, और इसे दो dictionaries को initialize करके लागू किया गया है.

ranking

  • किसी दी गई query के लिए matching documents का set मिल जाने के बाद, उन्हें sort करने का तरीका चाहिए.
  • सबसे प्रसिद्ध ranking method Google का PageRank है, लेकिन BM25 जैसे अन्य विकल्प भी हैं जो content के आधार पर documents को rank करते हैं.
  • SearchEngine class के छूटे हुए हिस्सों को लागू किया गया है, जिसमें BM25 score की गणना का तरीका भी शामिल है.

interface

  • सर्च इंजन बना लेने के बाद उसे किसी न किसी रूप में सार्वजनिक करना जरूरी है.
  • इसके लिए एक FastAPI app बनाया गया, जो सर्च इंजन को expose करने वाले endpoints देता है और search चलाने के लिए एक साधारण webpage render करता है.
  • output को आसानी से पढ़ने योग्य बनाने के लिए केवल top N URLs चुनने का फैसला किया गया.

छूटी हुई विशेषताएँ

  • जो पाठक अक्सर सर्च इंजन के साथ काम करते हैं, वे आसानी से देख सकते हैं कि इस implementation में कई features गायब हैं.
  • query operators, n-gram indexing, query या document expansion, और crawling व indexing को एक साथ चलाने जैसी क्षमताएँ शामिल नहीं हैं.

निष्कर्ष

  • इस प्रोजेक्ट को करते हुए लेखक को Solr के अंदरूनी कामकाज की बेहतर समझ मिली और asynchronous code लिखने के फायदे सीखने को मिले.
  • व्यक्तिगत सर्च इंजन बनाने के अगले कदम के रूप में लेखक इसमें semantic search feature जोड़ने की योजना बना रहे हैं.

GN⁺ की राय

  • इस लेख का सबसे महत्वपूर्ण बिंदु यह है कि छोटी वेबसाइटों की discoverability सुधारने के लिए कोई व्यक्ति खुद सर्च इंजन बना सकता है.
  • Python और open source libraries का उपयोग करके जटिल क्षमताओं वाले सर्च इंजन को सरल रूप में लागू करने का अनुभव शुरुआती software engineers के लिए भी प्रेरक हो सकता है.
  • asynchronous programming की दक्षता और data structures के महत्व को वास्तविक उदाहरण के जरिए दिखाकर यह लेख तकनीकी insight और व्यावहारिक learning opportunity दोनों देता है.

1 टिप्पणियां

 
GN⁺ 2024-02-08
Hacker News प्रतिक्रियाएँ
  • Pandas का उपयोग करके BM25 search engine बनाना

    • डेवलपर Pandas पर चलने वाला एक तेज़ BM25 search engine बना रहा है.
    • Pandas का उपयोग करने का कारण यह है कि BM25 algorithm के अलावा freshness, popularity जैसे दूसरे factors को भी आसानी से जोड़ा जा सकता है.
    • phrase matching में कई exception cases होते हैं, और यथासंभव कम memory का उपयोग करते हुए positional information को compress करना महत्वपूर्ण है.
  • कोड review: SearchEngine class

    • k1 और b नाम के parameters का मतलब समझ नहीं आता, और कोड में बिल्कुल comments नहीं हैं.
    • _documents में संभवतः URL key के रूप में है, और उस URL की content value के रूप में.
    • कोड अच्छी तरह documented नहीं है, यह खलता है. अगर documentation अच्छी होती, तो यह search engine बनाना सीखने के लिए उपयोगी सामग्री हो सकती थी.
  • search engine की complexity

    • search engine की मुख्य कठिनाई data की मात्रा को संभालने में है.
    • logic खुद अपेक्षा से काफ़ी simple है, और project ने ज़्यादातर गैर-ज़रूरी हिस्सों को हटाकर सफलता पाई है.
    • search engine को बहुत बड़ा बनाने के बजाय data को छोटा करना या signal-to-noise ratio बढ़ाना ज़्यादा महत्वपूर्ण approach है.
  • कोड की lines की संख्या पर राय

    • external dependencies का उपयोग करने की स्थिति में code lines की संख्या पर गर्व करने के अर्थ पर सवाल उठाया गया है.
    • codebase के लिए कोई SI unit तो नहीं है, लेकिन किसी न किसी तरह cognitive load को मापना चाहिए, ऐसा मत है.
  • कोड के expression पर मज़ाक

    • कोड में chunk for chunk in chunks if chunk expression देखकर लकड़हारे से जुड़ा एक मज़ाक याद आता है.
  • recommendation engine code example

    • search engine के साथ उपयोग किए जा सकने वाले Python में लिखे गए 20 lines से कम के recommendation engine code का उदाहरण दिया गया है.
    • session logs में click किए गए URL के आधार पर recommendations बनती हैं.
    • log में डाले गए query और click किए गए URL को मिलाकर उपयोग करने पर spell-check suggestions भी मिल सकते हैं.
  • parsing library performance comparison

    • lxml.html और lxml.html.clean, BeautifulSoup की तुलना में काफ़ी तेज़ हो सकते हैं, ऐसा उल्लेख है.
  • keyword उपयोग पर सलाह

    • English search results की quality बढ़ाने के लिए 1-gram के बजाय 2-gram और 3-gram उपयोग करने की सलाह दी गई है.
    • n-gram context बनाए रखने में मदद करते हैं.
  • शैक्षिक project पर राय

    • project बहुत शानदार और educational है, लेकिन इसे वास्तव में deploy न करने की सलाह दी गई है.
    • कुछ दसियों हज़ार documents संभालने वाले बड़े scale के projects के लिए SQLite का FTS5 ही समाधान बताया गया है.
  • Python के साथ बड़े पैमाने के data processing पर सवाल

    • जिन कामों में बड़े पैमाने के data को तेज़ी से process करना ज़रूरी हो, उनमें Python (एक धीमी भाषा) का उपयोग करना क्या सचमुच अच्छा विचार है, इस पर सवाल उठाया गया है.