Materi
Kemiripan kosinus mengukur seberapa searah dua vektor: hasil kali titik (dot product) keduanya dibagi hasil kali panjangnya. Untuk vektor hitungan kata, yang tidak pernah negatif, hasilnya berada di antara 0 dan 1: 1 berarti proporsi katanya sama persis, 0 berarti tidak ada satu kata pun yang sama. Karena yang diukur arah, bukan panjang, dokumen yang diulang dua kali tetap bernilai 1 terhadap aslinya.
import math
a = [2, 0, 1]
b = [1, 1, 0]
titik = sum(x * y for x, y in zip(a, b))
panjang = math.sqrt(sum(x * x for x in a)) * math.sqrt(sum(y * y for y in b))
print(round(titik / panjang, 4)) # 0.6325sklearn.metrics.pairwise.cosine_similarity(X, Y) menghitung kemiripan setiap baris X dengan setiap baris Y sekaligus, dan menerima matriks jarang hasil vectorizer. Dokumentasinya mencatat bahwa pada data yang sudah dinormalkan L2, fungsi ini setara dengan linear_kernel, yaitu hasil kali titik biasa; keluaran TfidfVectorizer bawaan sudah dinormalkan seperti itu.
Pola pencarian dokumen mirip: vectorizer di-fit pada korpus, kueri diubah dengan transform (bukan fit_transform, supaya kosakata dan idf tetap berasal dari korpus), lalu cosine_similarity(kueri, X) memberi satu baris skor. argmax() pada baris itu menunjuk dokumen yang paling mirip.