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

Cosine Similarity Đo Độ Tương Đồng Vector

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:

cos(θ) = (A · B) / (‖A‖ × ‖B‖) = (Σ Aᵢ Bᵢ) / (√Σ Aᵢ² × √Σ Bᵢ²)

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.

x y Vector A Vector B θ Góc θ nhỏ → cos(θ) gần 1 → hai vector rất tương đồng

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.

© 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: Cosine Similarity Đo Độ Tương Đồng Vector

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...