Phân loại mọi tệp PDF trên Internet
(snats.xyz)- Đây là một thử nghiệm nhằm phân loại khoảng 8,4 triệu tệp PDF của SafeDocs bằng metadata URL thay vì nội dung gốc, để gắn nhãn cho một kho tài liệu lớn với chi phí thực tế hơn
- Thay vì toàn bộ 8TB PDF, dự án sử dụng khoảng 8GB metadata và nhãn do LLM tạo ra, áp dụng cách tiếp cận teacher/student kiểu FineWeb vào bài toán phân loại URL PDF
- Một bộ phân loại học sâu đơn lẻ chỉ đạt 59,14% độ chính xác với
Alibaba-large-gte-1.5, nhưng tổ hợp embedding URL và XGBoost đã tăng lên 85,26% sau khi dò siêu tham số - Các ensemble XGBoost và LinearRegressor dựa trên TF-IDF cũng lần lượt đạt 67,52% và 70,68%, cho thấy các phương pháp NLP truyền thống đơn giản đã vượt mốc baseline học sâu ban đầu
- Bộ dữ liệu nhãn cuối cùng, embedding, thông tin tải dữ liệu gốc và mã nguồn đều được công khai để có thể tái sử dụng cho phân loại PDF hoặc thử nghiệm pipeline dữ liệu cho mô hình VLM/Omni
Kho PDF SafeDocs và mục tiêu phân loại
- Common Crawl là kho lưu trữ web Internet, và khi gặp PDF thì nó không lưu toàn bộ tệp mà chỉ lưu 1MB đầu tiên rồi cắt bỏ phần còn lại
- SafeDocs hoặc
CC-MAIN-2021-31-PDF-UNTRUNCATEDlà một corpus được tạo bằng cách tải lại các PDF trong snapshot Common Crawl thành phiên bản không bị cắt - Bộ dữ liệu này gồm khoảng 8,4 triệu PDF, với tổng dung lượng 8TB khi giải nén
- Mục tiêu là phân loại PDF theo nhãn chủ đề
- Ví dụ: PDF Linear Algebra sẽ vào nhóm Math
- Ví dụ: giáo trình Anatomy sẽ vào nhóm Medicine
Tạo nhãn bằng metadata URL
- Thay vì xử lý trực tiếp toàn bộ 8TB nội dung gốc, dự án dùng metadata của bộ dữ liệu gốc
- Metadata có dung lượng khoảng 8GB văn bản
- Cột chính là
url
- Tên tệp trong URL có thể là manh mối để suy đoán tính chất tài liệu
- Ví dụ:
Introduction_to_Python_Programming_-_WEB.pdf - Tên tệp này cho thấy tài liệu có khả năng liên quan đến giáo dục hoặc kỹ thuật
- Ví dụ:
- Cách gắn nhãn được lấy từ phương pháp của FineWeb
- LLM đóng vai trò teacher tạo nhãn từ văn bản phi cấu trúc
- Một bộ phân loại nhỏ hơn đóng vai trò student được huấn luyện bằng các nhãn đã tạo
- Dùng prompt và Llama-3-70B qua API together để tạo 100.000 nhãn ban đầu
- Do phân bố nhãn mất cân bằng và có nhiều lớp nhỏ, các nhãn có ít hơn 250 mẫu được gộp vào
other - Sau đó lấy tối đa 5.000 mẫu từ mỗi nhãn để cân bằng, tạo ra bộ dữ liệu gắn nhãn gồm tổng cộng 59.000 mẫu
Thử fine-tune mô hình embedding
- Cách tiếp cận đầu tiên là đưa văn bản URL vào mô hình embedding và fine-tune nó cho bài toán phân loại
- FineWeb Edu dùng snowflake-arctic-embed-m, nhưng thí nghiệm này cũng xem xét các mô hình đứng đầu trên Massive Text Embeddings Benchmark
- Các mô hình cỡ khoảng 7B tham số được đánh giá là khó phân loại nhanh 8 triệu PDF, nên tác giả thử các ứng viên nhỏ hơn
Stella_en_400Mgte-large-1.5- Arctic Embed
all-mpnet-basedistillbertflant-t5-smallbert-base-uncased
- Sử dụng Hugging Face để cố định mô hình nền và chỉ huấn luyện embedding cùng classification head, nên có thể chạy ngay cả trên notebook
- Trong cách làm này, mô hình tốt nhất là
Alibaba-large-gte-1.5, với độ chính xác 59,14%
Đẩy hiệu năng bằng XGBoost
- Cách tiếp cận thứ hai là không dùng trực tiếp mô hình embedding làm bộ phân loại, mà tạo embedding URL rồi dùng chúng làm đầu vào cho XGBoost
- Sau khi biến văn bản thành embedding, XGBoost được huấn luyện như trên dữ liệu dạng bảng
- Dự án đã tạo embedding cho toàn bộ liên kết PDF, với dung lượng khoảng 40GB khi giải nén
- Dữ liệu embedding được công khai trên Kaggle
- Thay vì một bộ phân loại lớn duy nhất, tác giả huấn luyện bộ phân loại nhị phân cho từng lớp
- Ý tưởng này lấy từ một Kaggle competition cũ
- Hiệu năng trung bình của mô hình XGBoost dùng embedding như sau
- accuracy: 0.839750
- precision: 0.859758
- recall: 0.819733
- f1: 0.838937
- Cách tiếp cận này cho độ chính xác cao hơn 24,83 điểm phần trăm so với cách học sâu ban đầu
Kết quả với TF-IDF và LinearRegressor
- Cách tiếp cận thứ ba là tạo đặc trưng văn bản bằng TF-IDF mà không dùng embedding học sâu
- TF-IDF là phương pháp gán trọng số cao hơn cho các từ xuất hiện nhiều trong một tài liệu nhưng hiếm trong toàn bộ corpus
- Hiệu năng XGBoost dựa trên TF-IDF như sau
- accuracy: 0.675200
- precision: 0.683185
- recall: 0.646316
- f1: 0.662497
- Dự án cũng thử ensemble LinearRegressor dựa trên TF-IDF
- accuracy: 0.706802
- precision: 0.723558
- recall: 0.663038
- f1: 0.690286
- Cả hai cách đều cho độ chính xác cao hơn baseline học sâu ban đầu là 59,14%
Thử lại học sâu với nhiều nhãn LLM hơn
- Mục tiêu cho bộ phân loại học sâu đơn lẻ được đặt ở mức 70% độ chính xác, nên tác giả tạo thêm nhiều nhãn hơn
- Các nhãn bổ sung gồm 400.000 mẫu được tạo bằng Llama3.1-7B
- Lý do dùng mô hình nhỏ hơn trước là để giảm chi phí suy luận
- Thử nghiệm cho thấy hiệu năng cải thiện khi lượng dữ liệu tăng lên
- Lấy cảm hứng từ bài The Llama 3 Herd of Models của Meta, tác giả thử
roberta-basevàgte-largehiện có gte-largeđạt tối đa 69,22% độ chính xác trên bộ dữ liệu huấn luyện
Hiệu năng cuối cùng theo từng mô hình
- Kết quả thí nghiệm như sau
| Model Name | Accuracy |
|---|---|
| gte-large naïve (59k labels) | 59.14% |
| XGBoost embeddings | 83.97% |
| XGBoost Tf-Idf | 67.52% |
| LinearRegressor Tf-Idf | 70.68% |
| gte-large naïve (400k labels) | 69.22% |
| XGBoost Embeddings HyperParameter Sweep | 85.26% |
- Cuối cùng, mô hình tốt nhất là XGBoost embeddings
- Mô hình XGBoost dùng embedding với dò siêu tham số cho kết quả cao nhất, đạt 85,26% độ chính xác
Phân loại toàn bộ corpus và trực quan hóa
- Mã cuối cùng có cấu trúc đơn giản: nạp embedding vào bộ nhớ rồi thực hiện dự đoán
- Việc dự đoán nhãn cho toàn bộ PDF mất khoảng 1 giờ
- Không dùng GPU vì cấu hình chạy không được thiết lập để tận dụng GPU
- Kết quả dự đoán và embedding được trực quan hóa bằng PCA và UMAP
- PCA hiển thị khoảng 8,5 triệu điểm của toàn bộ bộ dữ liệu trong một ảnh
- UMAP được chạy bằng cách thuê một máy lớn hơn
- Azure
Standard_E48s_v3 - 48 core
- 384GB RAM
- 768GB đĩa
- UMAP đã chạy đến 6,5 triệu điểm; vượt mức đó thì gần như chạm giới hạn bộ nhớ
- Azure
Dữ liệu và mã nguồn được công khai
- Bộ dữ liệu cuối cùng được công khai trên Hugging Face repo
- Nếu chỉ cần embedding, có thể tải từ Kaggle dataset
- Thông tin tải bộ dữ liệu SafeDocs gốc có tại S3 bucket
- Mã phân loại nằm trong đường dẫn classify_metadata của GitHub monorepo
- PDF là định dạng trộn lẫn dữ liệu và hình ảnh, nên có thể sẽ được dùng thường xuyên hơn trong các pipeline huấn luyện mô hình VLM/Omni
1 bình luận
Ý kiến trên Hacker News
Khoảng năm 2009, tôi từng làm một công việc trực quan hóa tương tự trên khoảng 5,7 triệu bài báo nghiên cứu (PDF, kho ngữ liệu không công khai) của các nhà xuất bản khoa học như Elsevier, Springer
Newton, G., A. Callahan & M. Dumontier. 2009. Semantic Journal Mapping for Search Visualization in a Large Scale Article Digital Library. Second Workshop on Very Large Digital Libraries at the European Conference on Digital Libraries (ECDL) 2009. https://lekythos.library.ucy.ac.cy/bitstream/handle/10797/14...
Tôi là tác giả đầu tiên
Nếu benchmark năm 2009 là 13 giờ, tôi tò mò bây giờ tính toán sẽ hoàn tất nhanh đến mức nào
Nếu là thời nay thì có lẽ mọi người sẽ nhét dữ liệu đó vào UMAP
Và cũng tò mò liệu dấu ampersand
&có ý nghĩa khác vớiandkhông, hay chỉ là định dạng trích dẫnMột trong những lợi ích ngày nay ít được bàn đến của embedding là có thể áp dụng gần như nguyên vẹn các kỹ thuật mô hình hóa thống kê hiện có, đồng thời tránh được những tinh tế và cạm bẫy của các bước tiền xử lý NLP phổ biến như stemming
Bài viết này đặc biệt cho thấy rõ vì sao việc dùng ngay LLM embedding làm bước đầu tiên của NLP, nhất là với tài liệu dài, lại thực tế
Tôi là tác giả bài viết. Không ngờ bài này lên đầu HN; cứ hỏi bất cứ điều gì
Tôi đã xem qua code và thấy nhiều thứ lạ; có vẻ vấn đề không nằm ở bản thân Python mà là có nhiều kỹ thuật phân tích tôi chưa biết
Các PDF đã được phân loại sẵn rồi à?
Đây là một bài viết thú vị và nhiều chi tiết. Tuy nhiên, khi huấn luyện nhị phân one-vs-rest, nếu cân bằng lớp rồi dùng xác suất lớn nhất khi suy luận, xác suất có thể không được hiệu chuẩn đúng và gây vấn đề
Tôi tò mò liệu bạn có thực hiện hiệu chuẩn xác suất riêng trước khi lấy
argmaxkhôngNgay từ năm 2006 đã có nhiều bộ torrent sách giáo khoa dung lượng 1TB
Bây giờ chắc kích thước và số lượng còn lớn hơn
Tôi nhớ đến tận năm 2008, việc tìm sách giáo khoa, sách lời giải, các PDF liên quan và tài liệu khác còn dễ hơn nhiều so với 6–8 năm sau đó
Khác biệt lớn nhất là nhiều trang như Chegg bắt đầu hút các tài liệu đó vào rồi bán lại bằng cách này hay cách khác
Phần lớn là tài liệu điện tử và kỹ thuật, lấy từ torrent khoảng 2 năm trước khi tôi muốn thử nghịch GraphQL và tài liệu OSR
Tôi có khoảng 20–40TB PDF (trước khi khử trùng lặp)
8TB đúng là nhiều, nhưng hoàn toàn chưa gần với toàn bộ quy mô PDF trên thế giới
Tôi cũng có một bộ sưu tập ebook, PDF, manga để đọc khá lớn, nhưng khó hình dung một thư viện 20TB lớn đến mức nào
Rõ ràng là có nhiều PDF hơn 8TB rất nhiều. Có lẽ trong đó có nhiều bản trùng, nhưng do có nhiều hình ảnh nên khử trùng lặp chắc không hiệu quả lắm
Bài viết thú vị và vui. Tôi đã thử nghiệm nhiều giải pháp LLM/AI tạo sinh để trích xuất dữ liệu dạng bảng từ PDF, nhưng kết quả kém hơn kỳ vọng
Chúng làm tốt với việc trích xuất chuỗi văn bản hoặc tóm tắt, chẳng hạn trả lời tổng tiền là bao nhiêu hay được in khi nào, nhưng để xuất ổn định ra CSV thì vẫn có khá nhiều sai số
Bạn có thể thử dịch vụ partitioning của Aryn: https://www.aryn.ai/post/announcing-the-aryn-partitioning-se...
Dịch vụ mới ra mắt gần đây, và cũng có ví dụ chuyển dữ liệu bảng trong PDF thành pandas dataframe. Sau đó có thể chuyển sang CSV: https://sycamore.readthedocs.io/en/stable/aryn_cloud/get_sta...
Tuyệt. Ở Airtrain, chúng tôi cũng thấy embedding rất có giá trị trong việc tạo mô hình phân loại
Nếu muốn làm việc với nhiều văn bản và embedding, gần đây chúng tôi đã khử trùng lặp và tạo embedding cho toàn bộ fineweb-edu (cũng được nhắc trong bài), rồi đưa dataset kết quả lên Hugging Face: https://huggingface.co/datasets/airtrain-ai/fineweb-edu-fort...
Ý tưởng rất hay. Dạo này tôi không có nhiều thời gian rảnh, nhưng cách đây không lâu tôi đã nghĩ đến việc làm một dự án tương tự mà cũng khác đôi chút
Tôi muốn tạo một công cụ mã nguồn mở để tải xuống dữ liệu chuỗi thời gian hữu ích cho khoa học xã hội. Ví dụ như chuỗi thời gian của bình luận mạng xã hội về giá thực phẩm
Nhờ LLM, có vẻ đã mở ra nhiều góc nghiên cứu mới mà mọi người vẫn chưa dùng nhiều
Nếu một ngày nào đó làm side project đó, có lẽ tôi sẽ mượn vài ý tưởng hay từ đây
Công việc rất tuyệt. Bạn đã kết hợp nhiều cách tiếp cận, tương tự những gì thư viện quốc gia thỉnh thoảng làm. Tôi cũng từng thử đủ kiểu embedding → classifier hoặc LDA
Tôi tò mò về prompt: https://github.com/snat-s/m/blob/main/classify_metadata/prom...
Cái này chẳng phải về cơ bản giống như prompt yêu cầu phân loại theo loại URL sao?