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
Hacker News görüşleri
Pandas ile BM25 arama motoru geliştirme
Kod incelemesi:
SearchEnginesınıfık1vebadlı parametrelerin ne anlama geldiği belli değil ve kodda hiç yorum yok._documentsdeğişkeninin anahtar olarak URL'leri, değer olarak da bu URL'lerin içeriğini tuttuğu tahmin ediliyor.Arama motorlarının karmaşıklığı
Kod satırı sayısı hakkında görüş
Koddaki bir ifadeyle ilgili şaka
chunk for chunk in chunks if chunkifadesini görünce bir oduncu şakasını hatırlattığı söyleniyor.Öneri motoru için kod örneği
Parsing kütüphanelerinin performans karşılaştırması
lxml.htmlvelxml.html.cleankütüphanelerininBeautifulSoup'tan çok daha hızlı olabileceği belirtiliyor.Anahtar kelime kullanımı hakkında tavsiye
Eğitici projeler hakkındaki görüş
Python ile büyük ölçekli veri işleme üzerine soru işareti