6 poin oleh GN⁺ 2024-02-08 | 1 komentar | Bagikan ke WhatsApp

Mesin pencari 80 baris yang dibuat dengan Python

  • September lalu, penulis bergabung sebagai data scientist pencarian di Wallapop dan bekerja dengan mesin pencari open source bernama Solr.
  • Untuk memahami prinsip dasar mesin pencari, penulis memutuskan membuat mesin pencari dari nol menggunakan Python.
  • Tujuannya adalah menyelesaikan "krisis keterlihatan situs web kecil", yaitu mengembalikan kejayaan situs-situs kecil yang tidak dapat ditemukan dengan mesin pencari seperti Google.
  • Tulisan ini memandu proses membuat mesin pencari dengan Python, dan semua kode yang ditulis dapat dilihat di repositori GitHub microsearch.
  • Mesin pencari yang diimplementasikan bukan mesin pencari siap produksi, melainkan contoh mainan yang tetap bisa digunakan untuk menunjukkan cara kerja internal mesin pencari.

microsearch

  • Tulisan ini membahas komponen-komponen yang menyusun microsearch dan mengeksplorasi bagaimana masing-masing dibuat: (1) crawler, (2) inverted index, (3) ranking, (4) antarmuka.

Crawler

  • Langkah pertama untuk membuat mesin pencari adalah memperoleh data yang akan dicari.
  • Dengan tujuan membuat "Google lokal", penulis membangun mesin pencari menggunakan data dari blog-blog yang diikuti.
  • Proses crawling mencakup mengunduh dan merapikan semua posting dari daftar blog tertentu.
  • Agar lebih cepat, penulis menggunakan library Python asyncio untuk memangkas waktu crawling dari 20 menit menjadi 20 detik.
  • Sebanyak 642 feed RSS digunakan; sekitar 100 di antaranya adalah blog yang sering dibaca, dan 500 sisanya diambil dari proyek blog surprisetalk.

Inverted index

  • Inverted index adalah struktur data yang memetakan kata kunci ke dokumen, sehingga memudahkan pencarian dokumen tempat kata tertentu muncul.
  • Saat pengguna menjalankan kueri, inverted index digunakan untuk mengambil semua dokumen yang cocok dengan kata kunci dalam kueri.
  • Logika inverted index didefinisikan di dalam kelas bernama SearchEngine, dan diimplementasikan dengan menginisialisasi dua dictionary.

Ranking

  • Setelah ada sekumpulan dokumen yang cocok untuk kueri tertentu, diperlukan cara untuk mengurutkannya.
  • Metode ranking yang paling terkenal adalah PageRank milik Google, tetapi ada juga opsi lain seperti BM25 yang memberi peringkat dokumen berdasarkan isi.
  • Penulis mengimplementasikan bagian yang sebelumnya belum ada di kelas SearchEngine, termasuk cara menghitung skor BM25.

Antarmuka

  • Setelah membangun mesin pencari, penulis ingin memublikasikannya dalam suatu bentuk.
  • Penulis membangun aplikasi FastAPI untuk menyediakan endpoint yang mengekspos mesin pencari, sekaligus merender halaman web sederhana untuk melakukan pencarian.
  • Agar hasil mudah dibaca, diputuskan untuk hanya memilih N URL teratas.

Fitur yang belum ada

  • Pembaca yang sering bekerja dengan mesin pencari mungkin akan segera menyadari bahwa banyak fitur belum diimplementasikan.
  • Yang belum ada antara lain operator kueri, pengindeksan n-gram, perluasan kueri atau dokumen, serta kemampuan melakukan crawling dan indexing secara bersamaan.

Kesimpulan

  • Melalui proyek ini, penulis jadi lebih memahami cara kerja internal Solr dan mempelajari kehebatan menulis kode asinkron.
  • Sebagai langkah berikutnya untuk membuat mesin pencari pribadi, penulis berencana mengimplementasikan fitur semantic search pada mesin pencari tersebut.

Opini GN⁺

  • Hal terpenting dari tulisan ini adalah bahwa individu dapat membuat mesin pencari sendiri untuk meningkatkan keterlihatan situs web kecil.
  • Pengalaman menyederhanakan dan mengimplementasikan mesin pencari dengan fitur kompleks menggunakan Python dan library open source dapat menjadi inspirasi bahkan bagi software engineer pemula.
  • Dengan menunjukkan efisiensi pemrograman asinkron dan pentingnya struktur data melalui contoh nyata, tulisan ini menawarkan wawasan teknis sekaligus peluang belajar yang praktis.

1 komentar

 
GN⁺ 2024-02-08
Komentar Hacker News
  • Membangun mesin pencari BM25 dengan Pandas

    • Pengembang sedang membuat mesin pencari BM25 cepat yang berjalan di Pandas.
    • Alasan memakai Pandas adalah karena selain algoritme BM25, faktor lain seperti kebaruan dan popularitas juga bisa digabungkan dengan mudah.
    • Pencocokan frasa memiliki banyak kasus pengecualian, dan penting untuk mengompresi informasi posisi sambil menggunakan memori sesedikit mungkin.
  • Ulasan kode: kelas SearchEngine

    • Tidak jelas arti parameter k1 dan b, dan tidak ada komentar sama sekali di dalam kode.
    • _documents diduga menggunakan URL sebagai kunci, dan isi URL tersebut sebagai nilainya.
    • Dokumentasi kode kurang memadai, yang cukup disayangkan. Jika terdokumentasi dengan baik, ini bisa berguna sebagai materi belajar membangun mesin pencari.
  • Kompleksitas mesin pencari

    • Kesulitan utama mesin pencari adalah menangani jumlah data yang besar.
    • Logikanya sendiri ternyata cukup sederhana, dan proyek ini berhasil karena sebagian besar bagian yang tidak perlu telah dihapus.
    • Pendekatan yang penting bukan memperbesar mesin pencari, melainkan memperkecil data atau meningkatkan rasio sinyal terhadap noise.
  • Pendapat tentang jumlah baris kode

    • Dipertanyakan apa gunanya membanggakan jumlah baris kode saat menggunakan dependensi eksternal.
    • Meski tidak ada satuan SI untuk basis kode, ada pendapat bahwa beban kognitif tetap perlu diukur dengan cara tertentu.
  • Lelucon tentang ekspresi dalam kode

    • Melihat ekspresi chunk for chunk in chunks if chunk di dalam kode membuat orang teringat pada lelucon tentang penebang kayu.
  • Contoh kode mesin rekomendasi

    • Disediakan contoh kode mesin rekomendasi yang bisa dipakai bersama mesin pencari, ditulis dalam Python dengan kurang dari 20 baris.
    • Rekomendasi dibuat berdasarkan URL yang diklik dalam log sesi.
    • Jika kueri yang dimasukkan ke log dicampur dengan URL yang diklik, kita juga bisa mendapatkan saran pemeriksa ejaan.
  • Perbandingan performa library parsing

    • Disebutkan bahwa lxml.html dan lxml.html.clean bisa jauh lebih cepat daripada BeautifulSoup.
  • Saran penggunaan kata kunci

    • Disarankan memakai 2-gram dan 3-gram alih-alih 1-gram untuk meningkatkan kualitas hasil pencarian bahasa Inggris.
    • n-gram membantu mempertahankan konteks.
  • Pendapat tentang proyek edukatif

    • Proyek ini sangat keren dan edukatif, tetapi disarankan untuk tidak benar-benar menerapkannya dalam produksi.
    • Untuk proyek berskala lebih besar yang menangani puluhan ribu dokumen, jawaban yang tepat adalah menggunakan FTS5 milik SQLite.
  • Keraguan tentang pemrosesan data skala besar dengan Python

    • Dipertanyakan apakah benar ide yang baik memakai Python (bahasa yang lambat) untuk pekerjaan yang harus memproses data besar dengan cepat.