Tóm tắt nội dung
- Cosine Similarity (độ tương đồng cosine) đo góc giữa hai vector, không quan tâm độ dài (magnitude) của chúng.
- Giá trị nằm trong [-1, 1]; với vector không âm (như TF-IDF, embedding) thường nằm trong [0, 1].
- Được dùng rộng rãi để so sánh văn bản, tìm kiếm ngữ nghĩa (semantic search) và hệ thống gợi ý.
- Khác biệt cốt lõi với Euclidean Distance: cosine đo hướng, Euclidean đo khoảng cách tuyệt đối.
Khi làm việc với văn bản hoặc embedding, câu hỏi thường gặp nhất là: hai vector này giống nhau đến mức nào? Cosine Similarity trả lời câu hỏi đó bằng cách đo góc giữa hai vector thay vì khoảng cách giữa chúng, và đây là lý do nó trở thành công cụ mặc định trong NLP.
Cosine Similarity là gì và tại sao cần đến nó
Trong không gian vector (vector space), mỗi văn bản, từ hoặc item có thể được biểu diễn thành một vector số thực nhiều chiều. Cosine Similarity đo mức độ giống nhau giữa hai vector bằng cách tính cosin của góc tạo bởi chúng.
Điểm quan trọng: cosine chỉ quan tâm đến hướng của vector, không quan tâm đến độ lớn (magnitude). Điều này rất hữu ích khi so sánh văn bản có độ dài khác nhau — một văn bản dài lặp lại từ khóa nhiều lần vẫn có thể "cùng hướng" với một văn bản ngắn nói về cùng chủ đề.
Công thức toán học
Với hai vector A và B, Cosine Similarity được định nghĩa:
Trong đó A · B là tích vô hướng (dot product), còn ‖A‖ và ‖B‖ là độ dài Euclidean (norm) của từng vector. Kết quả cos(θ) = 1 nghĩa là hai vector cùng hướng hoàn toàn (giống nhau tối đa), cos(θ) = 0 nghĩa là vuông góc (không liên quan), và cos(θ) = -1 nghĩa là ngược hướng hoàn toàn.
Từ vector đến điểm số: input → xử lý → output
Quy trình thực tế khi áp dụng cosine similarity cho văn bản thường gồm ba bước:
- Input: hai đoạn văn bản hoặc hai item cần so sánh.
- Xử lý: chuyển văn bản thành vector số (bằng TF-IDF, Bag-of-Words, hoặc embedding như Word2Vec, BERT).
- Output: một số thực trong khoảng [0, 1] (với vector không âm) thể hiện mức độ tương đồng.
Sơ đồ dưới đây minh họa trực quan: hai vector A, B trong không gian 2 chiều và góc θ giữa chúng quyết định giá trị cosine similarity.
Cài đặt Cosine Similarity bằng Python
Ví dụ dưới đây so sánh ba câu bằng TF-IDF và cosine similarity, dùng thư viện scikit-learn:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
documents = [
"con mèo đang ngủ trên ghế",
"chú mèo nằm nghỉ trên chiếc ghế",
"thị trường chứng khoán tăng điểm hôm nay",
]
# Chuyển văn bản thành ma trận TF-IDF
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(documents)
# Tính cosine similarity giữa câu 0 và các câu còn lại
scores = cosine_similarity(tfidf_matrix[0], tfidf_matrix)
print(scores)
Kết quả trả về là một mảng gồm ba giá trị, trong đó câu 0 và câu 1 (cùng nói về con mèo nằm nghỉ) sẽ có điểm số cao gần 1, trong khi câu 0 và câu 2 (chủ đề hoàn toàn khác) sẽ có điểm số gần 0. Đây chính là bản chất của cosine similarity: nắm bắt sự tương đồng về nội dung/hướng ngữ nghĩa, không phải độ dài câu.
Nếu muốn cài đặt thủ công không dùng thư viện, công thức có thể viết trực tiếp bằng NumPy:
import numpy as np
def cosine_sim(a, b):
dot = np.dot(a, b)
norm_a = np.linalg.norm(a)
norm_b = np.linalg.norm(b)
return dot / (norm_a * norm_b)
a = np.array([1, 2, 0])
b = np.array([2, 4, 0])
print(cosine_sim(a, b)) # kết quả: 1.0
Kết quả bằng 1.0 vì vector b chỉ là bản phóng đại (scale) của vector a — chúng cùng hướng dù độ lớn khác nhau. Đây là minh chứng rõ nhất cho việc cosine similarity bỏ qua magnitude.
Ứng dụng trong NLP và Machine Learning
Cosine similarity xuất hiện trong hầu hết các hệ thống xử lý ngôn ngữ tự nhiên hiện đại:
- Semantic search (tìm kiếm ngữ nghĩa): so sánh vector embedding của câu truy vấn với embedding các tài liệu để tìm kết quả gần nghĩa nhất.
- Hệ thống gợi ý (recommendation system): đo độ giống nhau giữa vector đặc trưng của người dùng hoặc sản phẩm.
- Phát hiện đạo văn hoặc trùng lặp nội dung: so sánh vector TF-IDF của các văn bản.
- Đánh giá embedding từ (word embedding): kiểm tra các từ có nghĩa gần nhau có vector gần nhau hay không, như trong Word2Vec [1].
Ưu điểm, hạn chế và khi nào nên dùng
Ưu điểm lớn nhất của cosine similarity là tính bất biến với độ dài vector (scale-invariant), giúp so sánh công bằng giữa các văn bản có độ dài khác nhau. Công thức cũng đơn giản, tính toán nhanh và mở rộng tốt với dữ liệu thưa (sparse) như TF-IDF.
Tuy nhiên, cosine similarity có một số hạn chế: nó không phản ánh khoảng cách tuyệt đối, nên không phù hợp khi độ lớn vector mang thông tin quan trọng (ví dụ: dữ liệu cảm biến hoặc giá trị đo lường vật lý). Ngoài ra, với vector rất thưa và nhiều chiều, cosine similarity có thể bị ảnh hưởng bởi "curse of dimensionality" — hiện tượng các vector ngẫu nhiên trong không gian nhiều chiều có xu hướng gần vuông góc với nhau.
Nên dùng cosine similarity khi làm việc với dữ liệu văn bản, embedding, hoặc bất kỳ trường hợp nào mà hướng của vector quan trọng hơn độ lớn.
So sánh với Euclidean Distance và Jaccard Similarity
| Phương pháp | Đo lường gì | Phù hợp với |
|---|---|---|
| Cosine Similarity | Góc giữa hai vector | Văn bản, embedding, dữ liệu thưa |
| Euclidean Distance | Khoảng cách tuyệt đối | Dữ liệu số liên tục, tọa độ vật lý |
| Jaccard Similarity | Tỷ lệ giao/hợp giữa hai tập hợp | Dữ liệu nhị phân, tập hợp từ khóa |
Sự khác biệt then chốt: Euclidean distance sẽ cho rằng một văn bản dài lặp từ khóa nhiều lần "khác xa" một văn bản ngắn cùng chủ đề, trong khi cosine similarity vẫn nhận ra chúng cùng hướng ngữ nghĩa.
Kết luận
Cosine Similarity là công cụ nền tảng để đo độ tương đồng giữa các vector trong NLP và Machine Learning, nhờ khả năng bỏ qua độ dài và tập trung vào hướng ngữ nghĩa. Hiểu rõ công thức và cách cài đặt giúp áp dụng đúng trong tìm kiếm, gợi ý và phân tích văn bản. Khi độ lớn vector mang ý nghĩa quan trọng, nên cân nhắc các phương pháp khác như Euclidean Distance thay vì cosine.
Tài liệu tham khảo
[1] T. Mikolov, K. Chen, G. Corrado, and J. Dean, "Efficient Estimation of Word Representations in Vector Space," arXiv:1301.3781, 2013.
[2] G. Salton and M. J. McGill, Introduction to Modern Information Retrieval. New York, NY, USA: McGraw-Hill, 1983.
[3] C. D. Manning, P. Raghavan, and H. Schütze, Introduction to Information Retrieval. Cambridge, U.K.: Cambridge Univ. Press, 2008.
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: Cosine Similarity Đo Độ Tương Đồng Vector
