- TF-IDF là một họ các phương pháp gán trọng số, không phải một công thức duy nhất. TF, IDF và bước chuẩn hóa đều có nhiều biến thể.
- Logarithmic TF làm giảm ảnh hưởng của việc một từ bị lặp quá nhiều; smooth IDF giúp công thức ổn định hơn trong triển khai thực tế.
- Chuẩn hóa L2 loại bớt ảnh hưởng của độ lớn vector và có quan hệ trực tiếp với cosine similarity.
- Hiểu các biến thể này giúp giải thích vì sao kết quả từ TfidfVectorizer thường không giống hoàn toàn phép tính TF-IDF thủ công.
Ở mức cơ bản, TF-IDF được mô tả bằng công thức TF × IDF. Tuy nhiên, khi triển khai một hệ thống NLP hoặc Information Retrieval thực tế, câu hỏi quan trọng hơn là: TF nào, IDF nào và có chuẩn hóa vector hay không?
Đây là điểm khiến nhiều người gặp tình huống tính TF-IDF bằng tay ra một kết quả nhưng chạy scikit-learn lại nhận được giá trị khác. Sự khác biệt thường không phải lỗi, mà đến từ cách định nghĩa term frequency, smoothing, cộng hằng số vào IDF và bước chuẩn hóa cuối cùng. Các nghiên cứu cổ điển về term weighting cũng xem TF-IDF như một họ các chiến lược trọng số thay vì một biểu thức duy nhất [1], [2].
1. Vì sao TF-IDF không có một công thức duy nhất?
Hãy xem trọng số của một term t trong tài liệu d dưới dạng ba giai đoạn. Đầu tiên, hệ thống đánh giá term đó ở phạm vi tài liệu hiện tại. Tiếp theo, nó đánh giá term ở phạm vi toàn corpus. Cuối cùng, vector có thể được chuẩn hóa để giảm ảnh hưởng của độ lớn tài liệu.
Trong TF-IDF quen thuộc, LocalWeight là một biến thể của TF và GlobalWeight thường là một biến thể của IDF. Sau đó toàn bộ vector tài liệu có thể được chia cho một norm. Chính ba lựa chọn này tạo ra nhiều cấu hình TF-IDF khác nhau.
Salton và Buckley đã hệ thống hóa nhiều chiến lược term weighting và cho thấy việc lựa chọn trọng số cục bộ, trọng số toàn cục và normalization là những thành phần quan trọng của mô hình không gian vector [1]. Do đó, câu hỏi “công thức TF-IDF chính xác là gì?” thường cần được thay bằng câu hỏi cụ thể hơn: implementation này đang sử dụng biến thể nào?
Hai hệ thống đều nói rằng chúng sử dụng TF-IDF nhưng vẫn có thể sinh ra các vector khác nhau. So sánh kết quả chỉ có ý nghĩa khi TF, IDF, smoothing và normalization được xác định rõ.
2. Raw TF và Log TF: lặp một từ 100 lần có thực sự tốt gấp 100 lần?
Dạng đơn giản nhất của term frequency sử dụng trực tiếp số lần term xuất hiện:
Nếu từ “transformer” xuất hiện 10 lần trong một tài liệu, TF bằng 10. Nếu xuất hiện 100 lần, TF bằng 100. Điều đó đồng nghĩa với việc raw TF xem lần xuất hiện thứ 100 có mức đóng góp tuyến tính giống lần đầu tiên.
Trong nhiều tình huống, giả định này quá mạnh. Việc một thuật ngữ xuất hiện từ 1 lần lên 5 lần có thể cung cấp tín hiệu đáng kể rằng tài liệu thực sự liên quan đến thuật ngữ đó. Nhưng tăng từ 50 lên 100 lần không nhất thiết làm tài liệu liên quan gấp đôi.
Một giải pháp phổ biến là logarithmic TF, hay sublinear TF:
Khi term không xuất hiện, trọng số bằng 0. Khi tần suất tăng, trọng số vẫn tăng nhưng tốc độ tăng chậm dần. Đây là cách kiểm soát hiện tượng một term lặp quá nhiều chi phối toàn bộ vector [1].
| f(t,d) | Raw TF | 1 + ln(TF) | Ý nghĩa |
|---|---|---|---|
| 1 | 1 | 1.000 | Term vừa xuất hiện |
| 5 | 5 | 2.609 | Tín hiệu tăng rõ nhưng không gấp 5 lần |
| 10 | 10 | 3.303 | Ảnh hưởng bắt đầu bão hòa |
| 100 | 100 | 5.605 | Không còn lớn hơn 100 lần so với TF=1 |
Một biến thể cực đoan hơn là binary TF: chỉ quan tâm term có xuất hiện hay không. Khi đó mọi giá trị dương đều được chuyển thành 1. Cách này có thể hữu ích với văn bản rất ngắn hoặc khi sự hiện diện của từ quan trọng hơn số lần lặp, nhưng nó loại bỏ hoàn toàn thông tin về tần suất.
Raw TF đơn giản và trực tiếp. Log TF thường hợp lý hơn khi tài liệu dài hoặc tần suất từ có độ lệch lớn. Binary TF phù hợp khi chỉ cần biết term xuất hiện hay không. Lựa chọn nên được đánh giá trên validation set thay vì dựa hoàn toàn vào trực giác.
3. IDF cổ điển và Smooth IDF khác nhau như thế nào?
IDF cổ điển sử dụng tổng số tài liệu N và document frequency df(t):
Nếu term xuất hiện trong mọi tài liệu thì df(t)=N và IDF bằng 0. Điều này có ý nghĩa trực quan: một term có mặt ở mọi nơi không giúp phân biệt tài liệu.
Tuy nhiên, các thư viện phần mềm thường điều chỉnh công thức để cải thiện hành vi số học hoặc tránh những trường hợp biên. Chẳng hạn, cấu hình mặc định của TfidfVectorizer trong scikit-learn sử dụng smooth IDF có dạng:
Có hai khác biệt đáng chú ý. Thứ nhất, 1 được cộng vào tử số và mẫu số. Thứ hai, toàn bộ biểu thức được cộng thêm 1. Vì vậy, term xuất hiện trong tất cả tài liệu vẫn nhận IDF bằng 1 thay vì 0.
Điều này giải thích một lỗi suy luận phổ biến: lấy công thức log(N/df) tính thủ công rồi kỳ vọng các giá trị trong vectorizer.idf_ phải giống hệt. Hai phép tính đang sử dụng hai định nghĩa khác nhau.
| Biến thể | Công thức | Đặc điểm |
|---|---|---|
| Classic IDF | log(N / df) | Term xuất hiện ở mọi tài liệu có IDF = 0 |
| Smooth IDF | log((N+1)/(df+1)) + 1 | Ổn định hơn và là mặc định phổ biến trong scikit-learn |
Ở góc độ lý thuyết, IDF không đơn thuần là một “mẹo” giảm trọng số stopword. Robertson phân tích sâu cơ sở của IDF trong mô hình truy hồi xác suất và chỉ ra rằng việc liên hệ IDF với xác suất cần xác định rõ không gian sự kiện đang xét [2]. Các công trình sau đó cũng tiếp tục nghiên cứu cách giải thích TF-IDF dưới góc độ xác suất [3].
4. Chuẩn hóa L2 và mối quan hệ với Cosine Similarity
Sau khi nhân TF với IDF, ta có một vector trọng số. Tuy nhiên, hai tài liệu có cùng cấu trúc từ vựng nhưng một tài liệu dài hơn nhiều có thể tạo ra vector có độ lớn lớn hơn. Chuẩn hóa được dùng để tách phần nào hướng của vector khỏi độ lớn tuyệt đối.
Với vector TF-IDF:
L2 norm được tính bằng:
Vector sau chuẩn hóa là:
Sau bước này, L2 norm của vector bằng 1. Đây cũng là lý do TF-IDF thường được kết hợp tự nhiên với cosine similarity.
Nếu cả q và d đã được chuẩn hóa L2 thì hai mẫu số đều bằng 1. Khi đó:
Nói cách khác, với các vector đã L2-normalize, tính cosine similarity có thể rút gọn thành tích vô hướng. Đây là một tính chất rất hữu ích trong truy hồi văn bản vì ta thường phải so sánh một query với số lượng lớn tài liệu.
Hình 2. Minh họa ma trận term–document có áp dụng trọng số TF-IDF. Các term phổ biến nhận trọng số thấp hơn, trong khi những term hiếm và có tính phân biệt nhận trọng số cao hơn. Nguồn: Chen et al., Frontiers in Physiology, 2013, Figure 1 [5]. Bài báo được phát hành theo giấy phép Creative Commons Attribution.
5. SMART notation: cách đọc một cấu hình term weighting
Trong Information Retrieval cổ điển, các biến thể term weighting thường được mô tả bằng SMART notation. Một cấu hình gồm ba ký tự đại diện cho ba quyết định:
Ví dụ, ltc biểu thị logarithmic TF, IDF và cosine normalization. Còn ntc dùng natural TF, IDF và cosine normalization. Đây là một cách viết rất gọn để mô tả cấu hình thay vì chỉ nói chung chung rằng hệ thống dùng TF-IDF.
Các thư viện hiện đại có thể thay đổi chi tiết của công thức, chẳng hạn thêm smoothing hoặc cộng hằng số vào IDF. Vì vậy SMART notation hữu ích để hiểu cấu trúc của weighting scheme, nhưng khi tái lập một thí nghiệm vẫn phải kiểm tra công thức cụ thể của implementation.
6. Kiểm tra các biến thể TF-IDF bằng Python
Ví dụ dưới đây cố ý lặp từ transformer nhiều lần để quan sát khác biệt giữa raw TF và sublinear TF.
from sklearn.feature_extraction.text import TfidfVectorizer
docs = [ "transformer attention NLP", "transformer transformer transformer transformer attention", "CNN image classification"
]
# Raw term frequency, không normalize để dễ quan sát
raw = TfidfVectorizer(
norm=None,
smooth_idf=True,
sublinear_tf=False
)
# Logarithmic term frequency
log_tf = TfidfVectorizer(
norm=None,
smooth_idf=True,
sublinear_tf=True
)
X_raw = raw.fit_transform(docs)
X_log = log_tf.fit_transform(docs)
term_id = raw.vocabulary_["transformer"]
print("Raw TF-IDF:", X_raw[:, term_id].toarray().ravel()) print("Log TF-IDF:", X_log[:, term_id].toarray().ravel())
Ở tài liệu thứ hai, “transformer” xuất hiện bốn lần. Với raw TF, thành phần TF được nhân trực tiếp với 4. Khi sublinear_tf=True, tần suất 4 được thay bằng 1 + ln(4), nên việc lặp từ vẫn làm tăng trọng số nhưng không tăng tuyến tính.
Tiếp theo, ta có thể xây một hệ thống truy hồi mini: fit TF-IDF trên các tài liệu, biến query sang cùng không gian vector rồi xếp hạng bằng cosine similarity.
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
documents = [ "transformer sử dụng attention trong NLP", "CNN được sử dụng trong xử lý ảnh", "attention là thành phần quan trọng của transformer"
]
vectorizer = TfidfVectorizer(
sublinear_tf=True,
smooth_idf=True,
norm="l2"
)
X = vectorizer.fit_transform(documents)
query = ["transformer attention"]
q = vectorizer.transform(query)
scores = cosine_similarity(q, X).ravel()
ranking = scores.argsort()[::-1]
for idx in ranking: print(round(scores[idx], 3), documents[idx])
Các tài liệu chứa “transformer” và “attention” sẽ có độ tương đồng cao hơn tài liệu chỉ nói về CNN. Quan trọng hơn, query được transform bằng vectorizer đã fit trên corpus; ta không fit một vectorizer mới cho query.
Không nên gọi fit_transform() riêng trên train, validation và test. Vocabulary và IDF phải được học từ train. Sau đó chỉ gọi transform() cho validation và test. Fit IDF trên test đồng nghĩa với việc đưa thông tin về phân bố của test set vào pipeline huấn luyện.
7. Chọn cấu hình TF-IDF như thế nào trong thực tế?
Không nên thay đổi mọi tham số chỉ vì chúng tồn tại. Một baseline tốt thường bắt đầu bằng cấu hình đơn giản, sau đó thay đổi từng yếu tố và đánh giá bằng metric phù hợp.
| Tình huống | Cấu hình nên thử | Lý do |
|---|---|---|
| Baseline phân loại văn bản | smooth IDF + L2 | Đơn giản, ổn định và hoạt động tốt với mô hình tuyến tính |
| Tài liệu dài, term lặp nhiều | sublinear TF | Giảm sự thống trị của những term có tần suất rất cao |
| Văn bản rất ngắn | thử binary TF | Sự xuất hiện đôi khi quan trọng hơn số lần lặp |
| Truy hồi bằng cosine | L2 normalization | Vector đơn vị giúp cosine tương ứng với dot product |
| Vocabulary quá lớn | min_df, max_df, max_features | Loại term quá hiếm hoặc quá phổ biến và giảm số chiều |
| Cụm từ mang ý nghĩa riêng | ngram_range=(1,2) | Giữ thêm bigram như “machine learning” hoặc “học máy” |
Với tiếng Việt, lựa chọn tokenizer còn quan trọng không kém công thức TF-IDF. Nếu “học máy” bị tách thành hai feature độc lập là “học” và “máy”, vector có thể mang ý nghĩa khác đáng kể so với việc sử dụng token “học_máy”. Vì thế một pipeline nghiêm túc cần xem tokenization, vocabulary construction và weighting là các bước liên kết với nhau.
TF-IDF cũng tạo ra ma trận có số chiều rất lớn nhưng thưa. Không nên chuyển sparse matrix sang dense bằng toarray() trên corpus lớn chỉ để thuận tiện thao tác, vì chi phí bộ nhớ có thể tăng mạnh. Các mô hình như Logistic Regression, Linear SVM và nhiều thuật toán trong scikit-learn có thể làm việc trực tiếp với sparse matrix [4].
Cuối cùng, tối ưu TF-IDF không nên trở thành việc thử ngẫu nhiên hàng chục công thức. Hãy bắt đầu bằng một baseline rõ ràng, thay đổi một yếu tố tại một thời điểm và đánh giá bằng cùng train/validation split. Với bài toán phân loại có thể dùng F1 hoặc accuracy tùy dữ liệu; với truy hồi thông tin nên dùng các metric như Precision, Recall, MAP hoặc NDCG phù hợp với mục tiêu hệ thống.
Tokenization → vocabulary → term frequency → TF transformation → document frequency → IDF → TF × IDF → normalization → sparse vector → classifier hoặc similarity function.
Kết luận. TF-IDF không dừng ở phép nhân TF với IDF. Cách biến đổi TF quyết định mức độ ảnh hưởng của từ lặp, công thức IDF quyết định cách đánh giá độ hiếm trên corpus và normalization quyết định cách so sánh các vector có độ lớn khác nhau. Hiểu ba thành phần này giúp sử dụng TF-IDF có kiểm soát thay vì xem TfidfVectorizer như một hộp đen, đồng thời tạo nền tảng để hiểu các mô hình xếp hạng nâng cao hơn như BM25.
Tài liệu tham khảo
- G. Salton and C. Buckley, “Term-weighting approaches in automatic text retrieval,” Information Processing & Management, vol. 24, no. 5, pp. 513–523, 1988, doi: 10.1016/0306-4573(88)90021-0.
- S. E. Robertson, “Understanding inverse document frequency: On theoretical arguments for IDF,” Journal of Documentation, vol. 60, no. 5, pp. 503–520, 2004, doi: 10.1108/00220410410560582.
- L. Havrlant and V. Kreinovich, “A simple probabilistic explanation of term frequency-inverse document frequency (tf-idf) heuristic (and variations motivated by this explanation),” International Journal of General Systems, vol. 46, no. 1, pp. 27–36, 2017, doi: 10.1080/03081079.2017.1291635.
- F. Pedregosa et al., “Scikit-learn: Machine Learning in Python,” Journal of Machine Learning Research, vol. 12, pp. 2825–2830, 2011.
- H. Chen, B. Martin, C. M. Daimon, and S. Maudsley, “Effective use of latent semantic indexing and computational linguistics in biological and biomedical applications,” Frontiers in Physiology, vol. 4, Art. no. 8, 2013, doi: 10.3389/fphys.2013.00008.
- K. Spärck Jones, “A statistical interpretation of term specificity and its application in retrieval,” Journal of Documentation, vol. 28, no. 1, pp. 11–21, 1972, doi: 10.1108/eb026526.
Nội dung gốc thuộc tác giả. Vui lòng không đăng lại toàn văn khi chưa được phép, trừ trường hợp pháp luật hoặc giấy phép áp dụng cho phép. Nội dung của bên thứ ba tuân theo quyền và giấy phép tương ứng.