TF-IDF
TF-IDF - Tần suất từ nghịch đảo tần suất tài liệu
Trong 4 bài viết về Hà Nội, từ nào giúp bạn nhận ra bài viết NÀO nói về ẩm thực: "Hà Nội", "phở", hay "là"?
Bạn vừa phát hiện nguyên tắc cốt lõi: từ hiếm thì quý! Bây giờ hãy xem TF-IDF tính điểm cho từng từ trong ví dụ thực tế.
Hình minh họa
Phở Hà Nội ngon nổi tiếng
Ẩm thựcBún chả Hà Nội là món ngon
Ẩm thựcHà Nội là thủ đô Việt Nam
Địa lýGrab là ứng dụng gọi xe phổ biến
Công nghệĐiểm TF-IDF (N = 4 tài liệu)
phở và Grab có TF-IDF cao nhất vì chỉ xuất hiện trong 1 tài liệu — rất đặc trưng!
TF-IDF = Tần suất từ (TF) x Nghịch đảo tần suất tài liệu (IDF). Từ xuất hiện nhiều trong 1 tài liệu NHƯNG hiếm trong toàn bộ tập dữ liệu sẽ có điểm cao nhất!
Giống như ở chợ Bến Thành: nếu tất cả quầy đều bán nước → nước không đặc biệt. Nhưng quầy duy nhất bán phở → phở là "đặc sản" của quầy đó!
Kéo thanh trượt bên dưới để hiểu mối quan hệ giữa TF, DF và TF-IDF. Thử tăng DF lên thật cao — chuyện gì xảy ra?
TF
5
IDF = log(N/DF)
2.30
TF-IDF
11.51
Rất quan trọng! Từ này đặc trưng cho tài liệu.
Bạn tìm kiếm 'phở bò Hà Nội' trên Google. Từ nào trong query có trọng số TF-IDF cao nhất khi so sánh giữa các trang web?
Giải thích
TF-IDF (Term Frequency - Inverse Document Frequency) đánh giá mức độ quan trọng của từ bằng cách kết hợp hai yếu tố: tần suất cục bộ (trong tài liệu) và độ hiếm toàn cục (trong tập dữ liệu).
Term Frequency (tần suất từ):
Inverse Document Frequency (nghịch đảo tần suất tài liệu):
Kết hợp:
Google Search: TF-IDF là nền tảng ban đầu của search engine — xếp hạng trang web theo từ khóa tìm kiếm.
Shopee/Tiki: Tìm kiếm sản phẩm dùng TF-IDF để match query với mô tả sản phẩm.
Trích xuất từ khóa: Từ có TF-IDF cao nhất trong tài liệu chính là từ khóa đặc trưng.
from sklearn.feature_extraction.text import TfidfVectorizer
# Đánh giá sản phẩm trên Shopee
reviews = [
"Phở ngon tuyệt vời phở rất ngon",
"Giao hàng nhanh sản phẩm tốt",
"Dở tệ không ngon dịch vụ tệ",
]
tfidf = TfidfVectorizer()
X = tfidf.fit_transform(reviews)
# Từ khóa đặc trưng cho mỗi review
for i, review in enumerate(reviews):
scores = zip(tfidf.get_feature_names_out(), X[i].toarray()[0])
top = sorted(scores, key=lambda x: x[1], reverse=True)[:3]
print(f"Review {i+1}: {[(w, f'{s:.2f}') for w, s in top]}")
# Review 1: [('phở', 0.63), ('ngon', 0.44), ('vời', 0.32)]
# Review 2: [('nhanh', 0.45), ('hàng', 0.45), ('giao', 0.45)]
# Review 3: [('tệ', 0.56), ('dở', 0.33), ('dịch', 0.33)]BoW: Chỉ đếm tần suất → từ phổ biến "là", "và" bị đánh giá cao sai. TF-IDF: Giảm trọng số từ phổ biến → tốt hơn BoW. Word Embeddings: Hiểu ngữ nghĩa → tốt nhất nhưng phức tạp hơn.
- TF-IDF = TF x IDF — kết hợp tần suất cục bộ và độ hiếm toàn cục.
- Từ phổ biến (là, và, của) có IDF thấp → TF-IDF thấp → bị 'phạt'.
- Từ đặc trưng (phở, Grab) có IDF cao → TF-IDF cao → được 'thưởng'.
- Ứng dụng: search engine, trích xuất từ khóa, phân loại văn bản.
- Hạn chế: vẫn không hiểu ngữ nghĩa — Word Embeddings giải quyết điều này.
Kiểm tra hiểu biết
Từ 'là' xuất hiện trong 3/4 tài liệu. TF-IDF của nó sẽ như thế nào?