Corpus 6.672 than phiền trong bài tổng hợp không mua từ đâu. Nó được thu bằng ba script Python tổng cộng 402 dòng, tất cả đều đọc nguồn công khai: Reddit qua mirror arctic-shift, review Google Play qua google-play-scraper, review App Store qua RSS của iTunes, Hacker News qua Algolia, và Stack Exchange API. Không tài khoản, không proxy, không trình duyệt — chỉ urllib trong thư viện chuẩn, cộng thêm google-play-scraper vì Google Play không có API công khai.
Kết quả thô
- 24.216 item: Reddit 10.500 · Google Play 8.000 · Stack Exchange 3.376 · App Store 1.650 · Hacker News 690.
- Reddit: 15 sub công việc, mỗi sub lấy 100 post và tối đa 200 comment; riêng comment lấy theo cửa sổ 2 tháng × 15 sub = 8.700 comment.
- Google Play: 20 app, 300–700 review mỗi app theo hai kiểu sắp xếp (liên quan nhất và mới nhất).
- App Store: RSS công khai của iTunes, 100–150 review mỗi app theo thứ tự mới nhất (12 trong 20 app có dữ liệu).
- Stack Exchange: 8 tag nghiệp vụ × 2 site × 2 kiểu sắp xếp (theo phiếu và theo ngày tạo).
Giới hạn thật của từng API
- arctic-shift: tham số query= bị trả 400; ghép query với subreddit bị trả 422; sort=top không hỗ trợ cho comment; truy vấn desc không giới hạn thời gian thì timeout. Cách chạy được: lọc theo subreddit + cửa sổ after/before + limit 100, nghỉ 2,5–3 giây giữa các lần gọi.
- RSS của iTunes chỉ trả vài trang đầu và trả về ít review hơn nhiều so với con số hiển thị trên store.
- Đôi khi API không lỗi mà trả rỗng: 14 file kết quả rỗng hoàn toàn, gồm cả những app có hàng trăm nghìn review.
- Stack Exchange có quota theo ngày — chạy quá nhiều lần trong ngày thì bắt đầu bị chặn.
Bốn lỗi đã mắc
- Gán sai id app: id 1232780281 của Notion bị dán nhãn là “confluence”, nên 100 review của Notion nằm trùng trong hai file. Không ảnh hưởng corpus vì bước khử trùng theo 160 ký tự đầu đã bỏ bản sao — nhưng nếu không có bước đó thì đã đếm hai lần.
- Tìm kiếm theo cụm từ trên Reddit không chạy được, nên phần lớn tín hiệu đến từ việc lấy hết bài trong sub rồi lọc sau, chứ không phải từ việc tìm đúng câu người ta nói.
- Không sửa được các query timeout: 6 cửa sổ thời gian đầu tiên trả về 0 item vì cửa sổ quá cũ và dữ liệu mirror không phủ tới, nhưng vẫn tốn thời gian chờ.
- Không ghi lại thời điểm thu cho từng item. Kết quả là không thể trả lời câu “xu hướng này đang tăng hay giảm” trên chính dữ liệu mình vừa thu.
Phần tốn thời gian nhất không phải là viết code lấy dữ liệu mà là phân loại. Bước đó ở bài Phân loại 6.672 than phiền bằng LLM và checklist để không lặp lại các lỗi trên ở bài Checklist 8 điểm.