Kosinüs Benzerlik Algoritması ve Kitap Önerisi Uygulaması
Merhabalar, sizlere bu yazımda Kosinüs Benzerlik Algoritması’nın matematiğinden bahsedip ardından da kitap verisi üzerinde uygulamasını göstereceğim.
Kosinüs Benzerlik Algoritması genellikle iki metin arasındaki benzerliği ölçmek amacıyla kullanılır. Öneri Sistemlerinde de oldukça fazla kullanılmaktadır. Biz de kitap önerisi üzerinde uygulayacağız.
Kosinüs Benzerlik Algoritması
Kosinüs benzerliği n boyutlu uzayda, iki tane n boyutlu vektör arasındaki açının kosinüsüdür. Diğer algoritmalara göre bazı avantajları vardır. Mesela iki taraf boyut sebebiyle farklı olsa bile (örn. kitap kelimesi ilk veride 5 kere ikinci veride 50 kere geçerse) aradaki açıyla ilgilenildiğinden dolayı benzerlikleri kolaylıkla bulunabilir. Sonra da hesaplanan benzerliği bir öneri sorgusu için kullanabiliriz. Büyük veri kümelerinde hesaplamak daha iyi sonuçlar vermektedir.
A ve B karşılaştırması için kosinüs benzerliği formülü aşağıdadır.
Matematiksel olarak vektörlerin iç çarpımının, normlarına bölümüdür.
∣∣A∣∣, A vektörünün uzunluğu (öklid normu); ∣∣B∣∣, B vektörünün uzunluğudur. Bu formül ile A ve B vektörleri arasında açının ölçüsünü hesaplamaktadır. 0 kosinüs değeri, A ve B vektörlerinin birbirine 90 derece olduğu (ortogonal) ve eşleşmediği anlamına gelir. Kosinüs değeri 1'e ne kadar yakınsa, açı o kadar küçük ve vektörler arasındaki eşleşme o kadar büyük olur.
Kitap Önerisi
Burada yazarları baz alarak kitap önerisi uygulayacağız. Öncelikle gerekli kütüphaneleri import ediyoruz.
Kullanacağımız veriyi okutuyoruz. Verideki eksik değerlerle uğraşmamak adına da en başından bunları kaldırıyoruz.
Veri üzerinde uygulama yapabilmemiz için öncelikle ön işlemlerden geçirmemiz gerekiyor. YayınEvi değişkeninin değerlerinin hepsinin sonunda virgül var. Biz de split
adında bir fonksiyon yazıyoruz ve tüm değişkenler içerisindeki virgülleri kaldırıyoruz. Aynı zamanda da Yazar değişkeninde her değerin sonunda virgül var ve iki taraflı olarak boşluklar bulunmaktadır. Baktığımız zaman split
fonksiyonunu buna göre oluşturuyoruz. Ardından da tüm değişkenler üzerinde uyguluyoruz.
Tüm veriyi küçük harflere dönüştüreceğiz. Türkçe’de ı ve i harflerinin dönüşümü klasik kütüphanelerde sorun oluşturmaktadır. Bunun için trlower
adlı fonksiyonu yazıyoruz. Fonksiyon içerisine ilk öncelikle result adında boş değer giriyoruz. Fonksiyona giriş yapacağımız veri (text) içinde dolaşan bir for döngüsü yazıyoruz. Döngünün geldiği harf I ise bunu küçültürken ı şeklinde küçültecektir. Eğer geldiği harf İ ise bunu da i şeklinde küçültecektir. Bu ikisi dışında da sorun oluşmayacağından dolayı genel kural ne ise o şekilde küçültme yapacaktır. Küçülen karakteri result içine atayacak ve veri içerisine ekleyecektir.
Oluşturduğumuz fonksiyonu tüm veri içerisine bir for döngüsü ve apply
modülü ile uyguluyoruz.
Şimdi ise noktalama işaretlerini kaldıracağız. remove_punctuation
adlı bir fonksiyon yazıyoruz. Bu fonksiyon değerler içerisinde dolanacak ve eğer gezindiği karakter noktalama işareti değil ise bunu word_wo_punc
değişkenine atacak.
Bu oluşturduğumuz fonksiyonu da tüm veri içerisine bir for döngüsü ve apply
modülü ile uyguluyoruz.
Ön işlemeden geçirilen verinin son haline göz atıyoruz.
Terim-Frekans Vektörü veri içerisinde her sözcüğün sıklığını saklamaktadır. Yazar değişkeni üzerinden bunu hesaplayacağız.
Oluşturduğumuz bu matris ile benzerlik skorlarını kosinüs benzerliği kullanarak hesaplayacağız. Kosinüs skoru büyüklükten bağımsızdır. Hesaplanması bir tık daha kolaydır.
Kitap adını giriş olarak alan ve en çok benzeyen 10 kitabı veren bir işlev çıkaracağız.
get_recommendations
fonksiyonunu tanımlıyoruz:
Başlıkla eşleşen kitap dizini alınır. Bu kitapla tüm kitapların benzerlik puanları alınır. Ardından kitapları benzerlik puanlarına göre sıralar. En çok benzeyen 10 kitabın puanlarını alır. Kitaplar elde edilir ve listelenir.
Şimdi uygulamaya geçiyoruz. Örnek olarak 30. indexteki kitaba bakıyoruz.
Kitabın adını alarak get_recommendations
fonksiyonuna veriyoruz. Ardından boş bir DataFrame oluşturuyoruz. Değişkenlerin adlarını da verimizdeki gibi veriyoruz. get_recommendations
fonksiyonu sonucunda elde ettiğimiz değerleri almak için bir for döngüsü yazıyoruz. Fonksiyon indexleri içinde dolanarak, sonuç kaçıncı indexte ise o index numarasını alıyoruz. Veri içerisine index numarasını giriyoruz. Bu şekilde elde ettiğimiz 10 sonucu df_gt verisi içerisinde biriktiyoruz. Bunu yapmamızdaki amaç sonuçları daha rahat gözlemlemektir. Ardından sonuçlar önümüze listeleniyor. Yazar üzerinden benzerlik aldığımız için de sonuçlar oldukça iyi gözüküyor.
Şimdi de 10. index üzerinde aynı işlemleri yaparak sonuçları kontrol edelim.