Trong các bài toán xử lý ngôn ngữ tự nhiên (NLP), việc xử lý dữ liệu văn bản đầu vào là bước cực kỳ quan trọng. Mô hình học máy không thể xử lý trực tiếp văn bản, mà cần biến chúng thành dạng số học. Một trong những kỹ thuật truyền thống và hiệu quả nhất để làm điều đó là TF-IDF (Term Frequency – Inverse Document Frequency).
TF-IDF không chỉ giúp chuyển đổi văn bản thành vector, mà còn làm nổi bật các từ quan trọng trong tài liệu, từ đó tăng khả năng phân biệt giữa các văn bản. Bài viết này sẽ hướng dẫn bạn từ lý thuyết đến thực hành cách sử dụng TF-IDF bằng Python, đặc biệt với thư viện scikit-learn.
Nếu bạn từng đọc qua Tạo đồ án học máy phân loại email spam, hay So sánh CNN và RNN: Ứng dụng trong xử lý ảnh và chuỗi dữ liệu, thì TF-IDF chính là bước tiền xử lý nền tảng trong các pipeline xử lý text.
TF-IDF là gì?
TF-IDF là kỹ thuật biểu diễn văn bản dưới dạng vector có trọng số, phản ánh mức độ quan trọng của một từ trong một văn bản so với toàn bộ tập tài liệu.
- TF (Term Frequency): Tần suất xuất hiện của từ trong văn bản.
- IDF (Inverse Document Frequency): Độ hiếm của từ trên toàn bộ tập dữ liệu. Càng ít xuất hiện trong nhiều tài liệu, IDF càng cao.
TF-IDF = TF × IDF. Nhờ đó, những từ phổ biến nhưng không đặc biệt (như “là”, “của”, “và”) sẽ bị giảm trọng số.
Khi nào nên dùng TF-IDF?
TF-IDF phù hợp cho các bài toán:
- Phân loại văn bản (spam, phân loại chủ đề…)
- Tìm kiếm thông tin (search engine)
- Gợi ý nội dung tương đồng (recommendation)
- Trích xuất đặc trưng text cho các mô hình học máy cổ điển
TF-IDF thường được dùng với các thuật toán như Logistic Regression, Naive Bayes, hoặc SVM. Với các mô hình deep learning hiện đại như BERT, TF-IDF không còn phổ biến nhưng vẫn rất hữu ích để kiểm thử nhanh.
Cài đặt và chuẩn bị dữ liệu mẫu
Trong ví dụ sau, ta sẽ sử dụng TfidfVectorizer từ thư viện scikit-learn để chuyển danh sách câu văn bản thành ma trận TF-IDF. Cài đặt thư viện nếu bạn chưa có:
pip install scikit-learn
Chuẩn bị dữ liệu text mẫu:
corpus = [
"Học máy là lĩnh vực thú vị",
"Xử lý ngôn ngữ tự nhiên giúp máy hiểu văn bản",
"TF-IDF là phương pháp truyền thống trong NLP",
"Mô hình học sâu yêu cầu dữ liệu lớn",
"Dữ liệu văn bản cần được vector hóa"
]
Chuyển text thành vector bằng TF-IDF
Trước khi chạy mã, bạn cần hiểu rõ hai điểm. Một là TF-IDF hoạt động tốt khi văn bản đã được chuẩn hóa như: viết thường, loại bỏ dấu câu, từ dừng. Hai là TF-IDF không giữ thông tin về thứ tự từ, nên không dùng tốt trong mô hình yêu cầu ngữ cảnh phức tạp như LSTM.
Trong bước sau, ta sẽ sử dụng TfidfVectorizer để chuyển văn bản thành ma trận thưa dạng (sparse matrix), sau đó in ra ma trận TF-IDF và từ điển.
from sklearn.feature_extraction.text import TfidfVectorizer
# Khởi tạo vectorizer
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
# Hiển thị từ điển
print("Từ vựng:")
print(vectorizer.get_feature_names_out())
# Hiển thị ma trận TF-IDF
print("\nMa trận TF-IDF:")
print(X.toarray())
Kết quả là một ma trận số học, trong đó mỗi hàng tương ứng với một văn bản, mỗi cột là một từ. Giá trị trong ô thể hiện trọng số TF-IDF của từ đó trong văn bản tương ứng.
Ưu và nhược điểm của TF-IDF
| Ưu điểm | Nhược điểm |
|---|---|
| Dễ hiểu, dễ triển khai | Không hiểu ngữ cảnh hay thứ tự từ |
| Có thể kết hợp với mô hình ML cổ điển | Không xử lý tốt từ mới, từ đồng nghĩa |
| Hiệu quả với dữ liệu nhỏ | Không học được biểu diễn ngữ nghĩa sâu |
Vì thế, TF-IDF rất phù hợp cho các mô hình đơn giản hoặc bước đầu khám phá dữ liệu.
Kết luận
TF-IDF là công cụ cổ điển nhưng cực kỳ hữu ích trong tiền xử lý văn bản cho các mô hình học máy. Dù không mạnh như các mô hình biểu diễn từ hiện đại (word2vec, BERT), TF-IDF lại đơn giản, dễ triển khai và mang lại kết quả rất tốt trong nhiều bài toán phân loại, tìm kiếm.
Nếu bạn đang xây dựng pipeline phân loại email, tìm kiếm văn bản, hoặc muốn phân tích ý kiến khách hàng, TF-IDF là lựa chọn nhanh chóng để thử nghiệm. Bạn cũng có thể kết hợp TF-IDF với thuật toán Naive Bayes hoặc SVM để xây dựng hệ thống phân loại hiệu quả.

