Cosine, Jaccard và hệ số chồng lấn
Cosine, Jaccard và hệ số chồng lấn
Hai câu giống nhau đến đâu? Câu trả lời phụ thuộc vào việc bạn đếm cái gì và chia cho cái gì. Ba độ đo dưới đây cùng chạy trên một cặp câu và vẫn cho ba con số khác nhau.
Sau khi tách token, cách đơn giản nhất để biểu diễn một câu là đếm: mỗi từ trong từ vựng là một chiều, giá trị là số lần từ đó xuất hiện. Câu thành một vector, và câu hỏi "hai câu giống nhau đến đâu" thành câu hỏi hình học "hai vector này gần nhau đến đâu". Nhưng có nhiều cách trả lời, và chúng không đồng ý với nhau.
Ba cách hay gặp nhất, tất cả đều là một phân số. Tử số của cả ba đều là phần chung, cái khác nhau nằm ở mẫu số: cosine chia cho tích hai độ dài vector, Jaccard chia cho số từ trong hợp hai tập, còn chồng lấn chia cho tập nhỏ hơn trong hai tập.
9 / (3.606 × 3.317)8 / 13 (giao trên hợp)8 / 10 (giao trên tập nhỏ hơn)| Từ | Đếm ở A | Đếm ở B | Tích từng thành phần |
|---|---|---|---|
| con | 1 | 1 | 1 × 1 = 1 |
| của | 1 | 1 | 1 × 1 = 1 |
| giúp | 1 | 1 | 1 × 1 = 1 |
| hiểu | 1 | 1 | 1 × 1 = 1 |
| học | 1 | 1 | 1 × 1 = 1 |
| máy | 2 | 1 | 2 × 1 = 2 |
| ngôn | 1 | 0 | 1 × 0 = 0 |
| ngữ | 1 | 0 | 1 × 0 = 0 |
| người | 1 | 1 | 1 × 1 = 1 |
| nói | 0 | 1 | 0 × 1 = 0 |
| sâu | 0 | 1 | 0 × 1 = 0 |
| tiếng | 0 | 1 | 0 × 1 = 0 |
| tính | 1 | 1 | 1 × 1 = 1 |
Tích vô hướng A · B (tổng cột bên phải) | 9 | ||
Độ dài |A| và |B| (căn tổng bình phương) | 3.606 và 3.317 | ||
Hãy làm đúng ba việc trong sim, theo thứ tự.
Một: để ô số lần lặp ở ×2 rồi bấm nút ⧉ Lặp câu A. Câu A bị nối vào chính nó, mọi ô trong cột đếm ở A tăng gấp đôi, độ dài |A| cũng gấp đôi. Vậy mà cosine đứng yên tại chỗ. Lý do nằm ngay trong công thức: tử số tăng gấp đôi, mẫu số cũng tăng gấp đôi vì |A| nằm trong đó, hai cái triệt tiêu nhau. Nói cho gọn thì cosine chỉ nhìn hướng của vector chứ không nhìn độ dài của nó. Jaccard và chồng lấn cũng không đổi, nhưng vì lý do khác hẳn: chúng làm việc trên tập từ, mà lặp lại một câu thì tập từ y nguyên. Dòng "trước lần lặp gần nhất" ghi lại cả ba con số cũ để bạn đối chiếu.
Đây là tính chất thật sự hữu ích chứ không phải mẹo toán. Một bài báo dài và một đoạn tóm tắt của chính nó có vector đếm chênh nhau rất xa về độ lớn, nhưng hướng thì gần nhau, nên cosine vẫn nhận ra chúng cùng chủ đề.
Hai: bấm Câu ngắn nằm trong câu dài. Hệ số chồng lấn nhảy lên đúng 1, còn Jaccard chỉ 0.357, tức 5/14. Không có cái nào sai cả, chúng trả lời hai câu hỏi khác nhau. Chồng lấn hỏi "câu ngắn có nằm trọn trong câu kia không", nên nó chia cho tập nhỏ hơn và bỏ qua toàn bộ phần thừa của câu dài. Jaccard hỏi "hai tập trùng nhau bao nhiêu phần của tất cả những gì hai bên nói", nên phần thừa đó vào thẳng mẫu số. Nếu bạn dùng chồng lấn để lọc trùng lặp, một câu ba từ sẽ trùng khớp hoàn hảo với một bài viết dài, và đó thường không phải điều bạn muốn.
Ba: đổi hai ô chọn từ dưới hình vẽ. Hình đó không phải minh hoạ trang trí, nó là một lát cắt thật của không gian đếm: trục ngang là số lần từ thứ nhất xuất hiện, trục dọc là từ thứ hai, mỗi câu thành một mũi tên. Đổi từ là đổi luôn hai mũi tên, và góc giữa chúng tính lại theo. Góc nhỏ thì cosine gần 1, góc 90 độ thì cosine bằng 0. Con số dưới hình bằng đúng cosine đầy đủ khi từ vựng gộp chỉ có hai từ, còn bình thường thì khác, vì cosine đầy đủ đo trên tất cả các chiều chứ không riêng hai chiều bạn đang nhìn.
Vài điều nên nhớ đúng:
- Cosine ở đây luôn nằm trong đoạn từ 0 tới 1. Cosine nói chung chạy từ
-1tới1, nhưng số đếm thì không bao giờ âm, nên tích vô hướng không thể âm và góc không thể vượt quá90độ. Muốn thấy trường hợp âm bạn phải đợi tới vector nhúng, nơi các thành phần có dấu. - Mẫu số bằng 0 phải được định nghĩa, không được để máy trả về
NaN. Câu rỗng thì|A|bằng 0, phép chia không có nghĩa. Ở đây quy ước cả ba độ đo trả về 0 trong tình huống đó, và góc thì báo là không xác định thay vì vẽ bừa một mũi tên. - Cả ba đều mù trước từ đồng nghĩa. Bấm
Cùng nghĩa, khác chữ: hai câu nói gần như cùng một điều, cả ba độ đo vẫn chấm 0 tròn trĩnh, chỉ vì không có ký tự nào trùng nhau. Đây chính là chỗ các bài sau bước vào: thay vì mỗi từ một chiều riêng biệt, người ta học một vector nhúng trong đóxe hơivàô tônằm cạnh nhau, rồi vẫn lấy cosine, nhưng lần này lấy trên vector nhúng.
Ba độ đo dùng chung một tử số và khác nhau ở mẫu số, nên hỏi "cosine hay Jaccard đúng hơn" là hỏi sai. Câu hỏi đúng là bạn muốn chuẩn hoá theo cái gì: theo độ dài vector, theo toàn bộ những gì hai bên nói, hay theo bên nói ít hơn. Còn chuyện cả ba đều không hiểu từ đồng nghĩa thì không mẫu số nào cứu được, phải đổi cách biểu diễn.
- 1Nhân đôi một câu bằng cách nối nó vào chính nó. Cosine giữa câu đó và câu kia thay đổi thế nào?
- 2Câu A có 5 từ khác nhau, tất cả đều xuất hiện trong câu B vốn có 14 từ khác nhau. Jaccard và hệ số chồng lấn bằng bao nhiêu?
- 3Vì sao cosine trên vector đếm không bao giờ âm, dù cosine của hai vector bất kỳ có thể xuống tới âm 1?