6 puan yazan GN⁺ 2024-02-08 | 1 yorum | WhatsApp'ta paylaş

Python ile yapılmış 80 satırlık arama motoru

  • Geçen eylülde Wallapop'ta arama veri bilimcisi olarak çalışmaya başlayarak Solr adlı açık kaynaklı arama motoruyla ilgilenmeye başladı.
  • Arama motorlarının temel prensiplerini anlamak için Python kullanarak sıfırdan bir arama motoru yapmaya karar verdi.
  • Amaç, "küçük ölçekli web sitelerinin keşfedilebilirlik krizi"ni çözmek; Google gibi arama motorlarıyla bulunamayan küçük web sitelerini yeniden görünür kılmak.
  • Bu yazı, Python kullanarak bir arama motoru oluşturma sürecini anlatıyor; yazılan tüm kodlar GitHub'daki microsearch deposunda görülebilir.
  • Uygulanan arama motoru, üretime hazır bir sistem değil; arama motorlarının içeride nasıl çalıştığını gösteren, kullanılabilir bir oyuncak örnek.

microsearch

  • microsearch'ü oluşturan bileşenler ve bunların nasıl yapıldığı inceleniyor: (1) crawler, (2) inverted index, (3) ranking, (4) interface.

Crawler

  • Bir arama motoru yapmanın ilk adımı, aranacak veriyi elde etmektir.
  • "Yerel Google" yapmak amacıyla, takip ettiği blogların verilerini kullanarak arama motorunu kurdu.
  • Crawling, belirli bir blog listesindeki tüm gönderileri indirip düzenleme sürecini içeriyor.
  • Daha hızlı olması için Python'un asyncio kütüphanesi kullanılarak crawling süresi 20 dakikadan 20 saniyeye indirildi.
  • 642 RSS feed kullanıldı; bunların yaklaşık 100'ü sık okunan bloglar, kalan 500'ü ise surprisetalk blog projesinden alındı.

Inverted index

  • Inverted index, anahtar kelimeleri belgelere eşleyen bir veri yapısıdır ve belirli bir kelimenin geçtiği belgeleri kolayca bulmayı sağlar.
  • Kullanıcı bir sorgu aradığında, sorgudaki anahtar kelimelerle eşleşen tüm belgeler inverted index kullanılarak bulunur.
  • Inverted index mantığı SearchEngine adlı sınıf içinde tanımlanmış ve iki sözlük başlatılarak uygulanmıştır.

Ranking

  • Verilen bir sorgu için eşleşen belge kümesi elde edildiğinde, bunları sıralamanın bir yolu gerekir.
  • En bilinen sıralama yöntemi Google'ın PageRank'idir, ancak BM25 gibi içeriğe dayalı başka sıralama seçenekleri de vardır.
  • SearchEngine sınıfının eksik bölümleri, BM25 puanının nasıl hesaplandığı da dahil olmak üzere tamamlandı.

Interface

  • Arama motorunu kurduktan sonra, bunu bir şekilde yayımlamak istiyor.
  • FastAPI uygulaması kurarak arama motorunu sunan bir endpoint sağlıyor ve arama yapılabilen basit bir web sayfası render ediyor.
  • Çıktının kolay okunabilmesi için yalnızca en üstteki N URL'yi seçmeye karar verdi.

Eksik özellikler

  • Arama motorlarıyla sık çalışan okurlar, uygulamada birçok özelliğin eksik olduğunu fark edebilir.
  • Sorgu operatörleri, n-gram indexing, sorgu veya belge genişletme, crawling ve indexing'i aynı anda yapma gibi özellikler eksik.

Sonuç

  • Bu proje sırasında Solr'ın iç işleyişini daha iyi anlamaya başladı ve asenkron kod yazmanın ne kadar etkileyici olduğunu öğrendi.
  • Kişisel arama motoru yapımında bir sonraki adım olarak, arama motoruna semantic search özelliği eklemeyi planlıyor.

GN⁺'un görüşü

  • Bu yazının en önemli noktası, küçük ölçekli web sitelerinin keşfedilebilirliğini artırmak için bireylerin doğrudan kendi arama motorlarını yapabileceğini göstermesi.
  • Python ve açık kaynak kütüphaneler kullanılarak karmaşık işlevlere sahip bir arama motorunun sadeleştirilmiş biçimde uygulanması, başlangıç seviyesindeki yazılım mühendislerine de ilham verebilir.
  • Asenkron programlamanın verimliliğini ve veri yapılarının önemini gerçek bir örnek üzerinden göstererek, bu yazı teknik içgörü ve pratik öğrenme fırsatı sunuyor.

1 yorum

 
GN⁺ 2024-02-08
Hacker News görüşleri
  • Pandas ile BM25 arama motoru geliştirme

    • Geliştirici, Pandas üzerinde çalışan hızlı bir BM25 arama motoru geliştiriyor.
    • Pandas kullanılmasının nedeni, BM25 algoritmasının yanı sıra güncellik, popülerlik gibi diğer unsurların da kolayca birleştirilebilmesi.
    • İfade eşleştirmede çok sayıda istisna durum bulunuyor ve konum bilgisini mümkün olduğunca az bellek kullanarak sıkıştırmak önemli.
  • Kod incelemesi: SearchEngine sınıfı

    • k1 ve b adlı parametrelerin ne anlama geldiği belli değil ve kodda hiç yorum yok.
    • _documents değişkeninin anahtar olarak URL'leri, değer olarak da bu URL'lerin içeriğini tuttuğu tahmin ediliyor.
    • Kodun yeterince belgelenmemiş olması üzücü. İyi belgelenmiş olsaydı, arama motoru kurmayı öğrenmek için faydalı bir kaynak olabilirdi.
  • Arama motorlarının karmaşıklığı

    • Arama motorlarındaki temel zorluk, veri miktarını yönetmek.
    • Mantığın kendisi şaşırtıcı derecede basit ve proje, gereksiz kısımların çoğunu çıkararak bunu başarılı şekilde göstermiş.
    • Arama motorunu büyütmektense veriyi küçültmek ya da sinyal-gürültü oranını artırmak yönündeki yaklaşım önemli.
  • Kod satırı sayısı hakkında görüş

    • Dış bağımlılıkların kullanıldığı bir durumda kod satırı sayısıyla övünmenin ne kadar anlamlı olduğu sorgulanıyor.
    • Kod tabanı için bir SI birimi yok ama bilişsel yükü bir şekilde ölçmek gerektiği görüşü dile getiriliyor.
  • Koddaki bir ifadeyle ilgili şaka

    • Koddaki chunk for chunk in chunks if chunk ifadesini görünce bir oduncu şakasını hatırlattığı söyleniyor.
  • Öneri motoru için kod örneği

    • Arama motoruyla birlikte kullanılabilecek, Python ile yazılmış 20 satırdan kısa bir öneri motoru kodu paylaşılıyor.
    • Oturum günlüklerinde tıklanan URL'lere dayanarak öneriler üretiyor.
    • Günlüklere girilen sorgularla tıklanan URL'leri bir arada kullanırsanız yazım denetimi önerileri de elde edebilirsiniz.
  • Parsing kütüphanelerinin performans karşılaştırması

    • lxml.html ve lxml.html.clean kütüphanelerinin BeautifulSoup'tan çok daha hızlı olabileceği belirtiliyor.
  • Anahtar kelime kullanımı hakkında tavsiye

    • İngilizce arama sonuçlarının kalitesini artırmak için 1-gram yerine 2-gram ve 3-gram kullanılması öneriliyor.
    • n-gram'ler bağlamı korumaya yardımcı oluyor.
  • Eğitici projeler hakkındaki görüş

    • Proje çok hoş ve eğitici bulunuyor, ancak gerçek dağıtıma alınmaması tavsiye ediliyor.
    • On binlerce belgeyi ele alan daha büyük ölçekli projelerde çözümün SQLite'ın FTS5'i olduğu belirtiliyor.
  • Python ile büyük ölçekli veri işleme üzerine soru işareti

    • Büyük veriyi hızlı işlemek gereken işlerde Python gibi yavaş bir dili kullanmanın gerçekten iyi bir fikir olup olmadığı sorgulanıyor.