Gần chục ngày trước, để thực hành môn Python, anh đã viết một đoạn mã tạo ra tất cả các âm tiết tiếng Việt có thể có và đọc được. Nhưng chưa biết để làm gì.
Sau đó vì cũng đang muốn cập nhật danh sách các âm tiết đang được dùng trong thực tế, nên anh lại thực hành tiếp môn Python bằng cách viết một con bót đi cào mấy trang báo điện tử để lấy ngữ liệu. Tất nhiên là trong quá trình lấy thì có lọc sơ sơ bằng regex trước khi ghi nhận, vì lọc kĩ quá thì giảm hiệu năng. Với lại, lấy nhầm còn hơn bỏ sót.
Thế là có thể dùng cái danh sách tất cả các âm tiết kia làm “từ điển” để lọc ra các âm tiết hợp lệ trong bước thống kê cuối cùng. Coi như cái danh sách đó không phải là thứ vô ích.
Kết quả ban đầu
Dù mới chỉ chạy được khoảng 1000 trang nhưng anh cũng đã có thể tìm ra hơn 100 âm tiết có vẻ mới. Tất nhiên, đa số đều là những lối đánh máy hoặc sai chính tả. Những trường hợp còn lại có nhiều tên riêng hoặc từ địa phương cần phải xem xét thêm. Riêng dưới đây là 20 trường hợp có thể đưa luôn vào danh sách chính thức:
chễm, chíp, chợt, diêm, gói, gú, hổn, khát, luyên, miện, phốt, pin, riềng, rẹt, rông, sạc, sấm, trịa, vãn, xịn, xói
Tranh thủ học thêm PostgreSQL
Ban đầu con bót kia chỉ lưu lại các âm tiết (có vẻ) mới và địa chỉ bài viết. Nhưng như thế thì hơi lãng phí nên anh quyết định dùng thêm cơ sở dữ liệu. Vả lại, nếu sau này cần đối chiếu hoặc xử lí thêm dữ liệu thì cũng tiện hơn.
Bao nhiêu năm vốn chỉ biết sơ sơ về PHP và MySQL nên anh phải Google để biết tại sao use database
mà PostgreSQL nó cứ báo sai :v
Với tinh thần là thực hành Python nên anh không dùng các gói chuyên để cào web như Scrapy. Thay vào đó, anh chỉ dùng các thư viện chung phổ biến là requests và BeautySoup4. Tất nhiên, liên quan đến bản địa hoá thì phải có PyICU và để kết nối với PostgreSQL thì anh chọn psycopg2.
Đến máy cũng phải tự học
Vấn đề quan trọng nhất của việc thu thập ngữ liệu trên mạng là xác định nội dung bài viết trong trang web. Trong một trang, ngoài nội dung chính thì có rất nhiều thứ linh tinh từ trình đơn, danh mục bài viết đến quảng cáo. Vì anh cào ở nhiều trang khác nhau, mỗi trang lại có một cấu trúc riêng nên sẽ rất lích kích nếu cứ đến website mới lại phải “Inspect Element” rồi tìm id hoặc class một cách thủ công.
Nhưng ngay cả khi chăm chỉ vào từng website để lấy id và class cần tìm thì vẫn không ổn. Bởi vì bản thân một website cũng không đồng nhất về cấu trúc. Thường là vì họ thỉnh thoảng cũng thay đổi hoặc cập nhật giao diện .
Vì thế cách an toàn là quét tất cả các thành phần và so sánh sự tương đồng về cấu trúc để đoán. Ví dụ như có nhiều thẻ <p>
ở cùng một cấp độ (siblings). Nhưng có những trang như thanhnien.vn lại dùng thẻ <div>
cho các đoạn văn. Cách này chạy trên máy tính có cấu hình bình thường thì cơ bản không vấn đề gì, nhưng khi chạy trên Raspberry Pi 3 thì quá chậm. Có cái Pi 4 đang để ở Paratime Studio mà sợ phạt 2 củ (bằng tiền máy luôn) nên không dám đến lấy.
Thế là anh bảo con bót là ban đầu mày chịu khó quét hết để lấy được một ít dữ liệu mẫu. Có dữ liệu mẫu rồi thì tự khắc sẽ tìm ra (tạm gọi là) “toạ độ” có chứa nội dung bài viết. Biết rồi thì lần sau cứ thế bổ thẳng vào mà lấy, không cần phải đi đoán mò nữa. Tất nhiên, đôi lúc lại gặp phải trang được chuyển đổi từ phiên bản cũ thì toạ độ kia lại sai, khi đó con bót lại phải ì ạch quét tất cả để tìm chứ không được bỏ qua. Và nếu toạ độ kia cứ sai liên tục thì con bót phải biết đường mà tìm toạ độ mới.
Sau vài lần vấp váp thì cuối cùng con bót cũng có vẻ khôn ra. Tuy vậy, do cơ sở dữ liệu ngày một phình ra nên nó cũng ngày càng chậm đi. Nhưng dù sao thì trong quá trình dạy bót thì anh cũng học được thêm được khá nhiều.
Kết bài
Vậy là từ một bài tập thực hành đơn giản, anh đã phức tạp hoá nó lên ở mức độ ngoài tưởng tượng ban đầu. Nhưng ngẫm lại thì nếu dừng lại ở đây thì anh chẳng biết mình làm những cái này để làm gì. Dù không gặp phải lỗi stack overflow nữa nhưng bản thân anh đã lạc vào một vũ trụ khác. Cách duy nhất để có thể thoát khỏi vòng lặp bắt tận này có lẽ là cố sống sót đến khi hết giãn cách và được đi chụp ảnh trở lại.