Cosine Similarity & Python Uygulaması

Asli Cerman
Machine Learning Turkiye
4 min readAug 8, 2021

Cosine Similarity Nedir?

Cosine Similarity veri biliminde yaygın olarak kullanılan benzerlik ölçülerinden biridir. Temelde iki vektör arasındaki açının kosinüsünü hesaplayarak vektörlerin birbirlerine olan benzerliklerini ölçmemize olanak sağlayan bir uzaklık ölçüsüdür.

Kosinüs benzerliği büyüklük değil yönelim ölçüsür.

  • Aynı yönelimdeki iki vektör arasındaki açının kosinüs değeri 1'e yakındır.
  • Vektörlerin birbirine ortogonal olduğu durumda ise iki vektör arasındaki açının kosinüs değeri 0'a yakındır
  • Birbirine taban tabana zıt iki vektör için ise kosinüs değeri -1e yakındır.

Her biri bir cümleyi temsil eden iki vektörümüz olduğunu varsayalım. Bu bağlamda, bu iki vektör, iki cümlenin kelime sayısını içeren dizilerdir. Her boyutun belgedeki bir kelimeye karşılık geldiği çok boyutlu bir uzayda, kosinüs benzerliği belgelerin büyüklüğünü değil yönünü yakalar. Vektörler arasındaki açı ne kadar küçük ise iki cümlenin birbirine o derece benzer olduğunu varsyabiliriz.

İki benzer belge, boyutlarından ötürü Öklid mesafesine göre çok uzak olsalar dahi (Örneğin “televizyon” kelimesi bir belgede 30 kez, başka bir belgede 5 kez geçebilir.) belgelere ait vektörler küçük bir açıya sahip olabilir.

Aşağıdaki formülasyonu inceleyerek kosinüs benzerliğinin nasıl çalıştığını anlayabiliriz.

https://en.wikipedia.org/wiki/Cosine_similarity

Öncelikle sırasıya kısaca kosinüs benzerlik hesaplamasının bileşenlerini inceleyelim.

Dot product

Dot product bir vektör çarpma yöntemidir. Dot product ile iki vektörün değerlerinin çarpımının toplamına eşit olan skalar bir değer elde ederiz.

Vektör Uzunluğu

Vektör uzunluğu hesaplaması ise Pisagor teoreminden gelmektedir. Aşağıdaki gibi basit bir şekilde hesaplayabiliriz.

https://www.khanacademy.org/

Formüldeki bileşenleri yerlerine yerleştirdiğimzde a =[1,1,0] ve b =[1,0,1] vektörleri arasındaki kosinüs benzerliğini aşağıdaki gibi hesaplayoruz.

Python Uygulaması

Yukarıdaki formülasyonu, 3 farklı cümle arasındaki cosine similarity değerlerini bulmak için sıfırdan ve ayrıca Scikit-Learn ile Python kodlarını oluşturarak uygulayacağım.

sentence_1 = “Bugün hava oldukça güneşli görünüyor.”

sentence_2 = “Bugünlerde havalar hep güneşli.”

sentence_3 = “Dün hava pek güneşli değildi.”

İlk olarak yapmamız gereken her bir cümle için bir vektör oluşturmak. Öncelikle 3 cümlede yer alan tüm kelimeleri tekil olarak içerecek bir kelime listesi oluşturmamız gerekiyor. Bunun için cümleleri noktalama işaretlerinden arındırarak tokenize işlemi uygulayacak basit bir fonksiyon oluşturuyorum.

import string
import nltk
def tokenizer(text):
text_nopunct = "".join([char for char in text if char not in string.punctuation])
tokens = nltk.word_tokenize(text_nopunct)
return tokens
word_list=list(set(tokinizer(sentence_1)+tokinizer(sentence_2)+tokinizer(sentence_3)))

Bir sonraki adımda her bir cümleye ait vektöre kelime listesinde yer alan kelimeleri içeriyor ise 1, içermiyor ise 0 değeri atayacak bir fonksiyon oluşturuyorum.

import numpy as np
vector_1 = [0]*len(word_list)
vector_2 = [0]*len(word_list)
vector_3 = [0]*len(word_list)
def vectors(word_list, sentence, vector):
for j in tokenizer(sentence):
for i in range(0,len(word_list)):
if j ==word_list[i]:
vector[i] =1
vector = np.array(vector)
return vector

vector_1 = vectors(word_list, sentence_1, vector_1)
vector_2 = vectors(word_list, sentence_2, vector_2)
vector_3 = vectors(word_list, sentence_3, vector_3)
print("vector_1:", vector_1)
print("vector_2:", vector_2)
print("vector_3:", vector_3)
vector_1: [1 0 0 0 1 1 1 0 0 1 0]
vector_2: [0 1 0 0 0 1 0 1 1 0 0]
vector_3: [0 0 1 1 0 1 1 0 0 0 1]

Şimdi cosine similartiy formülünü tekrar hatırlayalım ve formüle uygun olarak Python kodumuzu oluşturalım.

https://en.wikipedia.org/wiki/Cosine_similarity
def cos_sim(vector1, vector2):
dot_product = np.dot(vector1, vector2)
norm_1 = np.linalg.norm(vector1)
norm_2 = np.linalg.norm(vector2)
return dot_product / (norm_1 * norm_2)
Cosine similarity between sentence_1 and sentence_2 : 0.2236068
Cosine similarity between sentence_1 and sentence_3 : 0.3999999
Cosine similarity between sentence_2 and sentence_3 : 0.2236068

Scikit-Learn ile aynı sonuçlara ulaşalım:

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
count_vectorizer = CountVectorizer()
sparse_matrix = count_vectorizer.fit_transform(documents)
doc_term_matrix = sparse_matrix.todense()
df = pd.DataFrame(doc_term_matrix,
columns=count_vectorizer.get_feature_names(),
index=['vector_1', 'vector_2', 'vector_3'])
df
from sklearn.metrics.pairwise import cosine_similarity
cosine = cosine_similarity(df, df)
np.fill_diagonal( cosine, 0 )
cosine
array([[0. , 0.2236068, 0.4 ],
[0.2236068, 0. , 0.2236068],
[0.4 , 0.2236068, 0. ]])

Umarım faydalı olmuştur.

--

--

Asli Cerman
Machine Learning Turkiye

Data Scientist at Tanı Pazarlama ve İletişim Hizmetleri A.Ş.