BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ
BSM 461 BÜYÜK VERİYE GİRİŞ
MOVIE RECOMMENDATION SYSTEM
Waasiq MASOOD Demba SOW
Bölüm Danışman : : BİLGİSAYAR MÜHENDİSLİĞİ Öğr. Gör. Dr. Sümeyye KAYNAK
2022-2023 Güz Dönemi
Projemiz amacı büyük veriler teknolojiler ve kütüphaneler kullanarak bir film öneri sistem gerçekleşmektedir. Bunun için yeterince büyük bir veri set gerekiyor çünkü Model’e eğitmek için ve arasındaki fark görmek için ne kadar iyi veri varsa o kadar iyidir.
Kaggle’den filmlerin veri seti alıp üzerinde veri işlemler yapılacaktır. Filmler veri setinde TMDB sitesinde 45,000 filmler olan bir veri seti mevcuttur fakat bizim aldığımız veri sette 5000 veri 20 sütün kapsamaktadır.
Kullandığımız Teknolojiler:
- Python
- Scikit-learn
- Pandas
- NLTK (Natural Language Processing Library)
- Streamlit (Web için )
Veriler önişleme kısımında önce verilere incelememiz lazım, boş satır ve sütün varsa o veriler yerinde farklı veriler koymamız lazım. Projeyi göre hangi veriler bizim için en önemli olduğunu bakmamız lazım ve ona göre sütün ve satır seçmemiz lazım. Veriler iki tane CSV dosyalarda bulunmaktadır:
- Movies.csv Movies.csv içindeki sütunlar aşağıdaki verilere kapsıyor:
- Budget: Filminin bütçesi
- Genres: Filminin türleri
- Homepage: Filminin sitesi
- Id: TMDB sitesindeki Filminin ID
- Keywords: Filmi anlatılan kelimeler
- Original_language: Dili
- Original_title: Film yaptığı dilindeki başlık
- Overview: Filmi hakkında bilgi
- Popularity: Film ne kadar meşhur hakkında bilgi
- Production_companies: Filmi yapan firmalar
- Production_countries: Çektiği ülkeler
- Release_date: Çıktığı tarih
- Revenue: Kazandığı paranın miktarı
- Runtime: Filminin uzunluğu
- Spoken_languages: Konuştuğu diller
- Status: Çıkmış mı çıkmamış mı
- Tagline: Film hakkında tagler
- Title: Filmi adı
- Vote_average: Verildiği puanların ortalaması
- Vote_count: Verildiği oylar
- Credits.csv
- Movie_id: Filmin ID
- Title: Filminin Adı
- Cast: Filmdeki oyuncular
- Crew: Filmi yapan kişiler
import numpy as np
import pandas as pd
import ast as ast
import nltk as nltk
from nltk.stem.porter import PorterStemmer
#* Veriler okumak için pandas dataframe kullanılmaktadır:
Movies = pd.read_csv('dataset/tmdb_5000_movies.csv')
Credits = pd.read_csv('dataset/tmdb_5000_credits.csv')
#* Only keeping the important columns
md = Movies[['movie_id', 'title', 'genres', 'keywords', 'overview', 'cast', 'crew']]
md.dropna(inplace=True)
-
Veriler okuduktan sonra boş olan satırlar dataframe’den silenecektir. Ilk olan sütüne bakarsak böyle bir çıktı elde ediliyor
-
Credit dosyasında veriler böyledir
Verilerin dataframeleri keşfetmek için aşağıdaki kodu kullandık:
Farklı sütünlerdeki veriler keşfettikten sonra algoritma için kullanacağımız:
movies = movies[['movie_id', 'title', 'genres', 'keywords', 'overview', 'cast', 'crew']]
- Filmler hakkında bilgi
Genre, cast ve Keywords sütünlerde veriler JSON türünde bulunmaktadır ve bunlarda sadece bazı bilgileri istenir. Bu bilgiler almak için aşağıda verilmiş kodlar yazılmaktadir: Genre ve Cast sütünler sadece isimler alınmaktadır:
def formatGenre(obj):
List = []
for item in ast.literal_eval(obj):
List.append(item['name'])
return List
def formatCast(obj):
List = []
counter = 0
for item in ast.literal_eval(obj):
if counter != 6:
List.append(item['name'])
counter += 1
else:
break
return List
Crew sütünden sadece Director alınmaktadır:
def formatCrew(obj):
List = []
for item in ast.literal_eval(obj):
if item['job'] == 'Director':
List.append(item['name'])
break
return List
Sonrasından sütünlerde listelere bir araya birşleşmek için Lamda fonksiyonlar kullanılmaktadır:
movies['genres'] = movies['genres'].apply(lambda x: [i.replace(" ", "") for i in x])
movies['keywords'] = movies['keywords'].apply(lambda x: [i.replace(" ", "") for i in x])
movies['cast'] = movies['cast'].apply(lambda x: [i.replace(" ", "") for i in x])
movies['crew'] = movies['crew'].apply(lambda x: [i.replace(" ", "") for i in x])
Aynı kökten oluşan kelimeler mesala loves, love, lover bir kelime olarak almak için stemmin algoritma kullanılmaktadır ve bu algoritma kelimeler azalıp bir kelime verilmektedir.
Yukarıdaki örnek için love verir.
ps = PorterStemmer()
def stem(text):
y = []
for i in text.split():
y.append(ps.stem(i))
return " ".join(y)
new_movies['tags'] = new_movies['tags'].apply(stem)
Filmleri arasında bağlantılar bulmak için ilk önce kelimelere vector’e dönüştürmemiz lazım ve bunun için Bag of Words algoritması kullanılmaktadır.
#* Applying Text Vectorization (Bag of Words):
cv = CountVectorizer(max_features=5000, stop_words='english')
vectorized_movies = cv.fit_transform(new_movies['tags']).toarray()
Vectorization’dan sonra cosine similarlity algoritma uygulayarak her bir film arasındaki vector fark anlayıp o filmi önerilecektir:
similarity = cosine_similarity(vectorized_movies)
Filmi önermek için recommend fonksiyon kullanılmaktadır ve bir filmini index kullanararak similarlity listeden bulunmaktadır.
Model kullanarak sitesinde film önermek için API kullanarak önerdiği filmler gösterilmektedir. Spiderman iki için böyle filmler önermektedir:
Bu projede, günümüzde çok yaygın olan öneri sistemlerde(Recommendation systems) kullanılan İçerik tabanlı filtreme “Content-based recommendation system” türünü implemente ettik. Bu filtremenin avantajlarından biri, kullanıcıdan hiç bir bilgiye ihtıyacı duyulmamasıdır. Sadece kullanıcının ilgi alanlarına gerek duymaktadır. Bu nedeniyle bu tür filtremenin en iyi sonuca elde edilmesini sağlamaktadır.