Chuyển đến nội dung chính

TF-IDF nâng cao: TF / IDF, chuẩn hóa và Cosine

Tóm tắt nội dung
  • 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].

Term Count f(t,d) số lần term xuất hiện Local Weight TF raw binary logarithmic Global Weight IDF N và df(t) classic / smooth Normalize L1 / L2 vector cuối Hình 1. Một vector TF-IDF thực tế có thể được xem như kết quả của ba lựa chọn: TF, IDF và normalization.

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.

wt,d = LocalWeight(t,d) × GlobalWeight(t)

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?

Điểm cần nhớ:

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:

TFraw(t,d) = f(t,d)

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:

TFlog(t,d) = 1 + log(f(t,d)),   nếu f(t,d) > 0

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.

Không có lựa chọn TF tối ưu cho mọi bài toán.

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):

IDF(t) = log(N / 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:

IDFsmooth(t) = log((1 + N) / (1 + df(t))) + 1

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:

v = [v1, v2, ..., vm]

L2 norm được tính bằng:

||v||2 = √(v12 + v22 + ... + vm2)

Vector sau chuẩn hóa là:

v̂ = v / ||v||2

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.

cos(q,d) = (q · d) / (||q||2 ||d||2)

Nếu cả q và d đã được chuẩn hóa L2 thì hai mẫu số đều bằng 1. Khi đó:

cos(q,d) = q · d

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.

Minh họa ma trận term-document với trọng số TF-IDF từ bài báo của Chen và cộng sự

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:

n / l
TF weighting
natural hoặc logarithmic
n / t
IDF weighting
none hoặc inverse document frequency
n / c
Normalization
none hoặc cosine

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.

Sai lầm thường gặp trong Machine Learning:

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.

Cách đọc một pipeline TF-IDF hoàn chỉnh:

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

  1. 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.
  2. 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.
  3. 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.
  4. F. Pedregosa et al., “Scikit-learn: Machine Learning in Python,” Journal of Machine Learning Research, vol. 12, pp. 2825–2830, 2011.
  5. 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.
  6. 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.
© The CS Note · THE CS NOTE

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.

Nguồn gốc: TF-IDF nâng cao: TF / IDF, chuẩn hóa và Cosine

Về trang chủ Về đầu bài

Bài Đăng Phổ Biến

Bài toán tháp Hà nội

Trải nghiệm Tháp Hà Nội Kéo thả đĩa hoặc chạm vào các nút bên dưới để di chuyển. Bạn phải chuyển toàn bộ đĩa sang cột ngoài cùng bên phải (Cột 3) mà không đặt đĩa to lên đĩa nhỏ. Cột 1 Cột 2 Cột 3 Điều khiển & Chế độ Số lượng đĩa 4 Tốc độ máy giải ↪ Undo ↻ Chơi lại 🤖 Máy tự giải Thống kê ván chơi Nước đã đi 0 Thời gian 00:00 Tối thiểu cần 15 Kỷ lục của bạn - Lịch sử và Nguồn gốc Truyền thuyết Bài toán Tháp Hà Nội (hay Tháp Brahma) là một trò chơi xếp hình toán học kinh điển được giới thiệu lần đầu vào năm 1883 bởi nhà toán học người Pháp Édouard L...

Bài toán phân tích cảm xúc trong văn bản

Bài toán phân tích cảm xúc (sentiment analysis) là một bài toán NLP nhằm xác định thái độ hoặc cảm xúc được thể hiện trong văn bản. Ví dụ, từ một đánh giá như “Điện thoại đẹp, chạy nhanh nhưng pin hơi yếu”, hệ thống có thể nhận biết rằng người dùng có cả nhận xét tích cực và tiêu cực. Điểm thú vị của bài toán nằm ở khoảng cách giữa cách con người hiểu ngôn ngữ và cách máy tính xử lý dữ liệu. Một hệ thống phân tích cảm xúc cần biến văn bản tự nhiên thành dữ liệu có cấu trúc, học được các mẫu ngôn ngữ từ dữ liệu huấn luyện và đưa ra dự đoán hợp lý trên những câu chưa từng gặp. 1. Bài toán phân tích cảm xúc bắt đầu từ đâu? Hãy tưởng tượng một cửa hàng trực tuyến có hàng nghìn đánh giá mỗi ngày. Con người có thể đọc từng đánh giá để biết khách hàng hài lòng hay không, nhưng việc này nhanh chóng trở nên tốn thời gian khi dữ liệu tăng lên. NLP có thể biến bài toán đó thành một bài toán phân loại. Với mỗi văn bản, hệ thống nhận vào một chuỗi ký...

KAN cho phân đoạn khối u não với bộ BraTS 2020

Kolmogorov-Arnold Network (KAN) mở ra một hướng khác với MLP truyền thống: thay vì chỉ học các trọng số vô hướng trên mỗi kết nối, KAN có thể học những hàm phi tuyến một biến trên các cạnh . Khi đưa ý tưởng này vào kiến trúc encoder-decoder như U-Net, ta có thể sử dụng convolution để giữ cấu trúc không gian của ảnh MRI và dùng KAN để thực hiện các phép biến đổi phi tuyến mạnh hơn trên representation trung gian. Một bài toán phù hợp để nghiên cứu hướng này là phân đoạn u thần kinh đệm trên BraTS 2020 . Dataset cung cấp MRI đa mô thức và yêu cầu xác định các vùng Whole Tumor (WT), Tumor Core (TC) và Enhancing Tumor (ET). Đây là bài toán 3D có sự mất cân bằng voxel lớn, hình dạng khối u rất đa dạng và ranh giới giữa các mô bệnh lý không đơn giản. Lưu ý học thuật quan trọng: U-KAN gốc được công bố cho nhiều benchmark phân đoạn ảnh y tế nhưng không báo cáo kết quả BraTS 2020. Một công trình sau đó đã mở rộng U-KAN sang 3D MRI brain tumor segmentation , nhưng đánh giá trên BraTS 2...

Tách từ trong tiếng Việt Word Segmentation

Tách từ tiếng Việt là bài toán xác định ranh giới giữa các từ trong một chuỗi văn bản. Khó khăn nằm ở chỗ khoảng trắng trong tiếng Việt thường phân cách các âm tiết , nhưng một từ hoàn chỉnh có thể gồm nhiều âm tiết như “sinh viên” , “đại học” , “công nghệ” hay “tự nhiên” . Tách từ đúng giúp các hệ thống NLP dựa trên từ biểu diễn văn bản hợp lý hơn, đặc biệt trong tìm kiếm, TF-IDF, phân loại văn bản, gán nhãn từ loại và một số mô hình ngôn ngữ tiếng Việt. Tuy nhiên, với các Transformer sử dụng tokenizer dưới mức từ như subword hoặc SentencePiece, tách từ thủ công không phải lúc nào cũng là bước bắt buộc . Việc có cần tách từ trước hay không phụ thuộc vào mô hình và pipeline cụ thể. Tóm tắt nội dung Khoảng trắng trong tiếng Việt không phải lúc nào cũng là ranh giới từ ; nhiều từ gồm hai hoặc nhiều âm tiết. Word segmentation và tokenization có liên quan nhưng không hoàn toàn đồng nghĩa. Ba hướng chính gồm dựa trên từ điển, mô hình thống kê và mô hình học sâu . Tron...

KAN là gì? Mạng Kolmogorov-Arnold khác MLP thế nào?

Kolmogorov-Arnold Network (KAN) là một kiến trúc mạng nơ-ron trong đó mỗi cạnh không chỉ chứa một trọng số vô hướng mà mang một hàm một biến có thể học được . Đây là khác biệt cốt lõi so với Multi-Layer Perceptron (MLP), nơi các cạnh chủ yếu thực hiện phép nhân với trọng số còn hàm kích hoạt thường được áp dụng tại các node. KAN được lấy cảm hứng từ định lý biểu diễn Kolmogorov-Arnold và đặc biệt đáng chú ý trong các bài toán xấp xỉ hàm, mô hình hóa khoa học và symbolic regression. Tuy nhiên, KAN không nên được hiểu là kiến trúc đã thay thế MLP trong mọi bài toán Deep Learning; khả năng biểu diễn, chi phí tính toán và mức độ phù hợp của hai kiến trúc khác nhau theo từng nhiệm vụ. Tóm tắt nội dung MLP học chủ yếu trọng số trên các cạnh , còn KAN đặt hàm một biến học được trên từng cạnh . Một KAN layer cộng kết quả của nhiều hàm cạnh để tạo activation của node tiếp theo. KAN gốc sử dụng B-spline để tham số hóa các hàm phi tuyến trên cạnh. KAN có lợi thế đáng chú ý về trực...