Flask ve Sklearn ile Film Önerme Sitesi Yapalım
Bu yazıdaki bütün kodlar Bu repodan bulunmaktadır. Eğer demo versiyonunu görmek isterseniz http://banafilmoner.herokuapp.com/ sitesinden görebilirsiniz.
Gereksinimler
Bu yazımızda yapacağımız siteyi eğer kendiniz de yapmak istiyorsanız Flask ve Scikit-learn kütüphanelerini yüklemeniz gerekmektedir. Bunları yüklemek için terminalden şu komutları yazabilirsiniz ya da her bir paketin dökümentasyonundan bakabilirsiniz.
|
|
Sitenin Yapısı
Yapacağımız sitede film önerileri metin benzerliği ile olacak. Bu filmlerin açıklama metinlerini ise bir veri kümesinden alacağız. Bu veri kümesine TMDB 5000 Movies sayfasından ulaşabilirsiniz. Bundan dolayı önerebileceğimiz metinler sadece bu veri kümesindekiler olacaktır. Metin benzerliğini ise kosinüs benzerliği ile yapacağız.
Veri Seti ve Metin Benzerliği
Veri setindeki title
sütunu filmin başlığını ve overview
sütunu ise filmi basitçe açıklar.Bu yazıda overview
sütununu kullanarak metin benzerliğini kuracağız. Bunun için önce utils.py
diye bir dosya oluşturalım ve indirdiğimiz veri setini de projedeki dosyaya koyalım. Öncelikle filmlerin açıklamalarını kullanarak kosinüs benzerliğini verecek olan bir fonksiyon yazalım.
|
|
get_cosine_similarities(df)
fonksiyonu parametere olarak DataFrame
alır, DataFrame
i ise veri setini okuduktan sonra bu fonksiyona parametre olarak vereceğiz. Fonksiyonda kullanılan TfidfVectorizer
metinlerden bilgi çıkarmamıza yarayan bir algoritmadır. Açılımı Term frequency (tf) -> (terim sıklığı) ve inverse document frequency (ters döküman sıklığı)dır. Yani terimlerin her bir metinde ne kadar sıklıkla geçtiğine ve bu terimlerin bütün dökümanda ne kadar sıklıkla geçtiğine bakıp, hangi terimlerin cümleleri ayırmada önemli olduğuna karar verir. Bu bize (4803, n) boyutunda bir matrix dönderecektir. n ise bu algoritmanın bulduğu belirleyici kelimelerin sayısıdır. Yazdığımız fonksiyonla beraber, her bir cümle için her bir kelimenin ne kadar önemi olduğunu gösteren bir matrix elde edilecek. Daha sonra bu matrixi kullanarak her bir metin arasındaki benzerliği bulmak için linear_kernel kullanıyoruz. Bu algoritma ise bize (4803, 4803) boyutunda her bir metnin diğer 4038 filmin metni ile benzerliğini gösteren bir matrix döndürecek.
Bu fonksiyondan çıkan sonuç ise şu şekildedir
|
|
Görüldüğü gibi bazı değerler 0 bazıları 1 (köşegendekiler), bazıları da 0 ile 1 arasında. Kısaca
- Sonucu 0 olanlar arasında hiçbir benzerlik yok,
- 1 olanlar zaten kendileri ile ölçüldüğü için aynı olarak çıkıyor, örnek olarak 1.film ile 1.film arasındaki benzerlik 1 olacak doğal olarak
- 0-1 arasındakiler ise iki film arasındaki benzerliği gösteriyor.
Ne yaptığımızı kısaca yazalım.
- Veri setini okuduk
- Kosinüs benzerlik matriksini oluşturduk.
Şimdi yapılması gerekenler ise bu matrixi kullanıp film önerileri alabilmek. Bunun için yapılması gerekenler
- Kosinüs matrixini kullanıp bize verilen film için önerileri döndüren bir fonksiyon yazmak
- Flask ile web arayüzü oluşturup, kullanıcın girdiği filme öneriler vermek
- Bu fonksiyonu flask ile kullanabilmek.
Film Önerme Fonksiyonu
Bu fonksiyona geçmeden önce veriyi okuyalım, ve kosinüs matriximizi alalım. Şunu belirtmem gerekir ki, kullanıcının attığı her requestte veri setini baştan okuyup kosinüs matrixini okumak yük olur. Bundan dolayı, bunu bir kez yapmak adına, bu işlemleri if __name__ == "__main__"
altında yapacağız.
Öncelikle bir app.py
adında bir dosya açalım. Bu dosyada Flask applikasyonumuzun kodları olacak. Diğer utils.py
dan fonksiyonları çağıracağız.
app.py
dosyasına şu kodları girelim.
|
|
Şuan app.py
dosyasında yapılan işlemler.
- Flask uygulaması oluşturuldu.
- Veri okundu.
- Kosinüs benzerlik matriksi oluşturuldu.
Main kısmında titles diye bir değişken oluşturulma sebebi bu değişkenin filmleri önerecek olan fonksiyonda kullanacağımızdan dolayıdır. Titles değişkeni tip olarak Series
dir. Konsola yazdırdığımız zaman şöyle bir sonuç çıkacaktır.
|
|
Şimdi filmleri önerecek fonksiyonu yazmaya başlayabiliriz. Bunu utils.py
dosyasında yazalım.
|
|
HTML Arayüz
Bu fonksiyon da yazıldığına göre şimdi Flask ile bağlayabiliriz. Ama öncelikle bir arayüzümüz olması gerekiyor. Bunun için aynı klasörde templates
diye bir klasör oluşturun ve içine index.html
adında bir dosya oluşturun. Bu dosya bizim kullanıcıdan arayüzü almamızı sağlayacak olan HTML
kodunu içerecek. HTML
kısmını anlatmayacağım. Basit şekilde Flask
bildiğinizi varsayıyorum.
index.html
dosyasına buradaki arayüz kodunu yapıştırın. HTML kısmı şuan çok ilgi alanımız değil, eğer arayüz nasıl görünüyor diye merak ediyorsanız, buradan bakabilirsiniz.
Flask Endpointleri halletme
Bu kodda dikkatinizi çekmek istediğim bir nokta var. FORM
bir ‘/’ yoluna POST request yapıyor. Flask uygulamasında ‘/’ adresine bir POST request yapılacak. Ayrıca websitesinin giriş sayfası da bu adrese GET request yapılarak alınacak. Şimdi app.py
dosyasında bu koşulları sağlayan kodumuzu yazalım.
|
|
Render templatede gönderilen context
değişkeni HTML
dosyasında parse ediliyor ve bilgiler güzel bir şekilde gösteriliyor. Dediğim gibi basit şekilde Flask bildiğiniz düşünüyorum.
Beğendiyseniz paylaşırsanız çok sevinirim. İyi öğrenmeler.