tf-idf và chuyện hạ trọng số từ phổ biến
tf-idf và chuyện hạ trọng số từ phổ biến
Đếm từ thì ai cũng đếm được, nhưng đếm xong thì từ nào cũng có mặt lại thành từ quan trọng nhất. tf-idf sửa chỗ đó bằng một phép nhân, và phép nhân ấy có tới mấy biến thể.
Muốn máy làm việc với văn bản thì trước hết phải biến văn bản thành số. Cách thô sơ nhất là đếm: mỗi từ một chiều, giá trị là số lần từ đó xuất hiện trong tài liệu. Đó là tf, viết tắt của term frequency. Vấn đề lộ ra ngay: trong một kho tài liệu về đào tạo thì từ sinh, viên, học xuất hiện dày đặc ở khắp nơi, nên chúng luôn đứng đầu bảng đếm, trong khi chúng chẳng nói được tài liệu nào khác tài liệu nào.
Cách chữa là hỏi thêm một câu: từ này có mặt ở bao nhiêu tài liệu trong kho. Con số đó là df, document frequency, và nó đếm theo tài liệu chứ không theo lần xuất hiện, nên một từ lặp mười lần trong một tài liệu vẫn chỉ tính df bằng 1. Từ df ta lấy nghịch đảo rồi lấy log để được idf, và trọng số cuối là tf-idf = tf * idf. Từ nào vừa xuất hiện nhiều trong tài liệu này vừa hiếm gặp ở tài liệu khác thì được điểm cao.
N = 4tf = số lần xuất hiệnidf = log(N/df)không chuẩn hoá L2log cơ số e| Từ | tf | df | idf | tf-idf | độ lớn |
|---|---|---|---|---|---|
| python | 2 | 1 | 1.3863 | 2.7726 | |
| dễ | 1 | 1 | 1.3863 | 1.3863 | |
| lập | 1 | 1 | 1.3863 | 1.3863 | |
| rất | 1 | 1 | 1.3863 | 1.3863 | |
| trình | 1 | 2 | 0.6931 | 0.6931 | |
| và | 1 | 2 | 0.6931 | 0.6931 | |
| họcmọi tài liệu | 2 | 4 | log(4/4) = 0 | 0.0000 | |
| sinhmọi tài liệu | 1 | 4 | log(4/4) = 0 | 0.0000 | |
| viênmọi tài liệu | 1 | 4 | log(4/4) = 0 | 0.0000 |
df = 4, tức xuất hiện ở mọi tài liệu, nên idf = log(4/4) = 0 và tf-idf bị dập về đúng 0: học, sinh, viên. Chú ý từ học xuất hiện 2 lần trong tài liệu này: tf cao vẫn không cứu nổi vì đem nhân với 0. Đổi sang biến thể trơn để thấy chúng sống lại.Con số đáng nhìn nhất trong bảng
Ở cấu hình mặc định, ba từ sinh, viên, học có mặt trong cả bốn tài liệu, nên df = 4 bằng đúng N. Thay vào công thức: idf = log(4/4) = log(1) = 0. Nhân bất cứ tf nào với 0 cũng ra 0, nên ba từ đó bị dập sạch, hàng của chúng gạch ngang và thanh ngang biến mất.
Hãy nhìn kỹ tài liệu 1: từ học xuất hiện 2 lần, từ python cũng xuất hiện 2 lần. Cùng một tf nhưng python có df = 1 nên idf = log(4/1) xấp xỉ 1,3863 và tf-idf xấp xỉ 2,7726, còn học nhận đúng 0. Hai từ tần suất y hệt nhau, kết cục ngược nhau hoàn toàn, và cái quyết định nằm ở kho tài liệu chứ không nằm trong tài liệu đang xét. Đây chính là điều tf đơn thuần không làm được.
Thử tiếp: sửa tài liệu 4, xoá từ học đi. Lúc này df của học tụt còn 3, idf = log(4/3) khác 0, và học lập tức sống lại trong bảng của tài liệu 1. Trọng số của một từ không phải thuộc tính của từ đó, nó phụ thuộc vào cả kho bạn đang có.
Không có một công thức tf-idf duy nhất
Đây là chỗ dễ mất thời gian nhất khi làm việc thật. Người ta nói "dùng tf-idf" như thể đó là một công thức cố định, nhưng mỗi thư viện lại cài một biến thể. Ba công tắc trong sim là ba chỗ hay lệch nhau nhất:
tf thô hay tf chia độ dài. Để thô thì tài liệu dài tự nhiên có mọi tf lớn hơn, chỉ vì nó dài. Chia cho số token của tài liệu thì con số trở thành tỉ lệ. Bật công tắc rồi nhìn cột tf: nó hiện rõ tử số và mẫu số, ví dụ 2 / 11 = 0,1818. Lưu ý một điều dễ nhầm: trong cùng một tài liệu thì phép chia này không đổi thứ hạng, vì cả cột chia cho cùng một số. Nó chỉ đổi chuyện so giữa các tài liệu với nhau.
idf thường hay idf trơn. Bản sách giáo khoa là idf = log(N/df). Bản trơn mà sim này cài là idf = log(N/(1+df)) + 1. Hai bản khác nhau ở đúng chỗ quan trọng: với df = N thì bản thường cho 0 tròn trĩnh, còn bản trơn cho log(4/5) + 1 xấp xỉ 0,7769, nhỏ nhưng khác 0. Đây đúng là một họ chứ không phải hai bản: scikit-learn cũng cộng 1 vào cả tử số, tức idf = log((1+N)/(1+df)) + 1, nên trên đúng kho này nó cho log(5/5) + 1 bằng đúng 1 chứ không phải 0,7769. Ba công thức, ba con số, cùng một cái tên. Gạt công tắc sang biến thể trơn và nhìn lại bảng: sinh, viên, học không còn bị xoá sổ nữa, và thứ hạng đảo lại thật, vì bây giờ một từ phổ biến lặp nhiều lần vẫn cộng được điểm.
Chuẩn hoá L2. Sau khi có vector tf-idf, chia cả vector cho độ dài Euclid của nó để mọi tài liệu nằm trên mặt cầu đơn vị. Bật công tắc rồi xem dòng tổng bình phương trọng số: nó về đúng 1. Bước này cần khi ta đo độ tương đồng cosine giữa hai tài liệu, vì không có nó thì tài liệu dài luôn có vector to hơn và ăn gian.
Còn một biến thể nữa mà sim không có công tắc nhưng bạn phải nhớ: cơ số log. Sim này dùng log cơ số e. Có tài liệu dùng cơ số 2, có nơi dùng cơ số 10. Đổi cơ số chỉ là nhân toàn bộ cột idf với một hằng số, nên thứ hạng trong một tài liệu không đổi, nhưng mọi con số in ra thì đổi hết.
Kết luận thực dụng: khi ai đó đưa bạn một bảng tf-idf và bảng của bạn ra số khác, đừng vội đi tìm lỗi. Hỏi trước ba câu: dùng biến thể tf nào, dùng biến thể idf nào, và log cơ số mấy. Thêm câu thứ tư nếu cần: có chuẩn hoá L2 không, và tách token theo quy ước gì.
Vài chỗ dễ vấp
dfđếm tài liệu, không đếm lần xuất hiện. Một từ lặp 50 lần trong một tài liệu duy nhất vẫn códf = 1.- Xoá trắng một ô làm
Ntụt. Sim coi ô rỗng là "không có tài liệu đó" chứ không phải "có một tài liệu rỗng". Bạn xoá một ô làNcòn 3, và mọiidftính lại theo. tf-idfkhông bao giờ âm, vìdfluôn nhỏ hơn hoặc bằngNnênlog(N/df)luôn lớn hơn hoặc bằng 0. Nếu bạn thấy số âm trong bảng của mình thì đó là lỗi cài đặt.- tf-idf không hiểu nghĩa. Nó chỉ đếm chuỗi ký tự.
họcvàhọc tậplà hai chiều hoàn toàn rời nhau, không có chút quan hệ nào. Đó là lý do có các cách biểu diễn dựa trên vector nhúng, gặp ở bài sau trong chương này.
tf nói từ này quan trọng thế nào trong tài liệu, idf nói từ này hiếm thế nào trong kho. Nhân hai thứ lại thì từ vừa nhiều vừa hiếm mới được điểm cao, còn từ đâu cũng có bị kéo về 0. Nhưng "tf-idf" là tên gọi của cả một họ công thức chứ không phải một công thức, nên trước khi so hai con số, phải chốt xem hai bên dùng cùng biến thể hay không.
- 1Kho có 4 tài liệu, từ "học" xuất hiện trong cả 4 và lặp 2 lần ở tài liệu đang xét. Với công thức idf = log(N/df) thì tf-idf của nó bằng bao nhiêu?
- 2Hai nhóm cùng chạy "tf-idf" trên một kho dữ liệu nhưng ra hai bảng số khác nhau. Việc nên làm đầu tiên là gì?
- 3Đổi tf từ thô sang chia cho độ dài tài liệu thì thứ hạng các từ trong CÙNG một tài liệu thay đổi thế nào?