6 điểm bởi GN⁺ 2024-02-08 | 1 bình luận | Chia sẻ qua WhatsApp

Công cụ tìm kiếm 80 dòng viết bằng Python

  • Vào tháng 9 năm ngoái, tác giả gia nhập Wallapop với vai trò nhà khoa học dữ liệu tìm kiếm và làm việc với Solr, một công cụ tìm kiếm mã nguồn mở.
  • Để hiểu các nguyên lý cơ bản của công cụ tìm kiếm, tác giả quyết định tự xây dựng một công cụ tìm kiếm từ đầu bằng Python.
  • Mục tiêu là giải quyết "khủng hoảng khả năng được tìm thấy của các website nhỏ", tức là giúp những website nhỏ không thể tìm ra bằng các công cụ tìm kiếm như Google trở nên hữu ích trở lại.
  • Bài viết này hướng dẫn quá trình tạo một công cụ tìm kiếm bằng Python, và toàn bộ mã nguồn đã viết có thể xem trong repository microsearch trên GitHub.
  • Công cụ tìm kiếm được triển khai không phải là một công cụ tìm kiếm sẵn sàng cho môi trường production, mà là một ví dụ đồ chơi nhưng có thể sử dụng được để cho thấy bên trong công cụ tìm kiếm hoạt động như thế nào.

microsearch

  • Bài viết xem xét các thành phần cấu thành microsearch và tìm hiểu cách từng phần được tạo ra: (1) crawler, (2) inverted index, (3) xếp hạng, (4) giao diện.

Crawler

  • Bước đầu tiên để tạo một công cụ tìm kiếm là thu thập dữ liệu để tìm kiếm.
  • Với ý tưởng tạo ra một "Google cục bộ", tác giả xây dựng công cụ tìm kiếm bằng dữ liệu từ các blog mà mình theo dõi.
  • Việc crawl bao gồm quá trình tải xuống và sắp xếp toàn bộ bài viết từ một danh sách blog cụ thể.
  • Để tăng tốc, tác giả dùng thư viện Python asyncio để rút ngắn thời gian crawl từ 20 phút xuống còn 20 giây.
  • Tác giả sử dụng 642 RSS feed, trong đó khoảng 100 là các blog thường đọc và 500 còn lại lấy từ dự án blog surprisetalk.

Inverted index

  • Inverted index là một cấu trúc dữ liệu ánh xạ từ từ khóa tới tài liệu, giúp dễ dàng tìm ra những tài liệu mà một từ cụ thể xuất hiện.
  • Khi người dùng tìm kiếm một truy vấn, inverted index được dùng để tìm tất cả tài liệu khớp với các từ khóa trong truy vấn đó.
  • Logic của inverted index được định nghĩa trong một lớp tên là SearchEngine, và được triển khai bằng cách khởi tạo hai dictionary.

Xếp hạng

  • Khi đã có một tập tài liệu khớp với truy vấn cho trước, cần có cách để sắp xếp chúng.
  • Phương pháp xếp hạng nổi tiếng nhất là PageRank của Google, nhưng cũng có các lựa chọn khác như BM25, vốn xếp hạng tài liệu dựa trên nội dung.
  • Bài viết triển khai phần còn thiếu của lớp SearchEngine, bao gồm cả cách tính điểm BM25.

Giao diện

  • Sau khi xây dựng công cụ tìm kiếm, tác giả muốn công khai nó theo một cách nào đó.
  • Tác giả xây dựng một ứng dụng FastAPI để cung cấp endpoint phơi bày công cụ tìm kiếm, đồng thời render một trang web đơn giản để thực hiện tìm kiếm.
  • Để đầu ra dễ đọc hơn, tác giả quyết định chỉ chọn N URL hàng đầu.

Các tính năng còn thiếu

  • Nếu là độc giả thường xuyên làm việc với công cụ tìm kiếm, bạn có thể nhận ra rằng bản triển khai còn thiếu khá nhiều tính năng.
  • Các toán tử truy vấn, lập chỉ mục n-gram, mở rộng truy vấn hoặc tài liệu, hay khả năng crawl và lập chỉ mục đồng thời đều chưa được đưa vào.

Kết luận

  • Trong quá trình thực hiện dự án này, tác giả hiểu rõ hơn về cách Solr hoạt động bên trong và học được sự kỳ diệu của việc viết mã bất đồng bộ.
  • Là bước tiếp theo để tạo ra một công cụ tìm kiếm cá nhân, tác giả dự định sẽ triển khai khả năng tìm kiếm ngữ nghĩa cho công cụ tìm kiếm này.

Ý kiến của GN⁺

  • Điều quan trọng nhất trong bài này là việc cá nhân hoàn toàn có thể tự tạo một công cụ tìm kiếm để cải thiện khả năng được tìm thấy của các website nhỏ.
  • Trải nghiệm đơn giản hóa và triển khai một công cụ tìm kiếm có chức năng phức tạp bằng Python và các thư viện mã nguồn mở có thể truyền cảm hứng ngay cả cho các kỹ sư phần mềm mới vào nghề.
  • Bằng cách cho thấy hiệu quả của lập trình bất đồng bộ và tầm quan trọng của cấu trúc dữ liệu qua ví dụ thực tế, bài viết mang đến cả góc nhìn kỹ thuật lẫn cơ hội học tập thực tiễn.

1 bình luận

 
GN⁺ 2024-02-08
Ý kiến trên Hacker News
  • Phát triển công cụ tìm kiếm BM25 bằng Pandas

    • Tác giả đang phát triển một công cụ tìm kiếm BM25 chạy trên Pandas.
    • Lý do dùng Pandas là vì ngoài thuật toán BM25, còn có thể dễ dàng kết hợp các yếu tố khác như độ mới và độ phổ biến.
    • Việc khớp cụm từ có rất nhiều trường hợp ngoại lệ, và điều quan trọng là phải nén thông tin vị trí sao cho dùng ít bộ nhớ nhất có thể.
  • Đánh giá mã: lớp SearchEngine

    • Không rõ ý nghĩa của các tham số k1b, và trong mã hoàn toàn không có chú thích.
    • _documents được cho là có URL làm khóa và nội dung của URL đó làm giá trị.
    • Khá tiếc vì mã không được tài liệu hóa tốt. Nếu tài liệu đầy đủ hơn thì nó có thể hữu ích như tài liệu học cách xây dựng công cụ tìm kiếm.
  • Độ phức tạp của công cụ tìm kiếm

    • Khó khăn chính của công cụ tìm kiếm là xử lý khối lượng dữ liệu.
    • Bản thân logic lại đơn giản một cách đáng ngạc nhiên, và dự án này thành công vì đã loại bỏ được hầu hết các phần không cần thiết.
    • Điều quan trọng không phải là làm công cụ tìm kiếm lớn hơn, mà là làm dữ liệu nhỏ hơn hoặc tăng tỷ lệ tín hiệu trên nhiễu.
  • Ý kiến về số dòng mã

    • Có ý kiến đặt câu hỏi về việc khoe số dòng mã trong bối cảnh đang sử dụng các phụ thuộc bên ngoài.
    • Dù không có đơn vị SI cho codebase, vẫn có quan điểm cho rằng cần phải đo lường tải nhận thức theo cách nào đó.
  • Trò đùa về cách diễn đạt trong mã

    • Khi nhìn thấy biểu thức chunk for chunk in chunks if chunk trong mã, có người nhớ đến một câu đùa về tiều phu.
  • Ví dụ mã cho công cụ gợi ý

    • Có cung cấp đoạn mã công cụ gợi ý viết bằng Python dưới 20 dòng có thể dùng cùng với công cụ tìm kiếm.
    • Nó tạo gợi ý dựa trên các URL được nhấp trong nhật ký phiên.
    • Nếu trộn cả truy vấn đã nhập trong log với các URL được nhấp, còn có thể nhận được gợi ý kiểm tra chính tả.
  • So sánh hiệu năng thư viện phân tích cú pháp

    • Có nhắc rằng lxml.htmllxml.html.clean có thể nhanh hơn BeautifulSoup rất nhiều.
  • Lời khuyên về việc dùng từ khóa

    • Để cải thiện chất lượng kết quả tìm kiếm tiếng Anh, có người khuyên nên dùng 2-gram và 3-gram thay vì 1-gram.
    • n-gram giúp duy trì ngữ cảnh.
  • Ý kiến về dự án mang tính giáo dục

    • Dự án rất hay và mang tính giáo dục, nhưng có ý kiến khuyên không nên triển khai thực tế.
    • Với các dự án quy mô lớn hơn xử lý đến hàng chục nghìn tài liệu, lời giải là dùng FTS5 của SQLite.
  • Nghi vấn về việc dùng Python cho xử lý dữ liệu quy mô lớn

    • Có người đặt câu hỏi liệu dùng Python (một ngôn ngữ chậm) cho công việc cần xử lý lượng dữ liệu lớn với tốc độ cao có thực sự là ý hay hay không.