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
Ý kiến trên Hacker News
Phát triển công cụ tìm kiếm BM25 bằng Pandas
Đánh giá mã: lớp
SearchEnginek1vàb, 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ị.Độ phức tạp của công cụ tìm kiếm
Ý kiến về số dòng mã
Trò đùa về cách diễn đạt trong mã
chunk for chunk in chunks if chunktrong mã, có người nhớ đến một câu đùa về tiều phu.Ví dụ mã cho công cụ gợi ý
So sánh hiệu năng thư viện phân tích cú pháp
lxml.htmlvàlxml.html.cleancó thể nhanh hơnBeautifulSouprất nhiều.Lời khuyên về việc dùng từ khóa
Ý kiến về dự án mang tính giáo dục
Nghi vấn về việc dùng Python cho xử lý dữ liệu quy mô lớn