Foto User
Movie Recommendation System

Rio Brian

Sosial Media


1 orang menyukai ini
Suka

Summary

Sistem rekomendasi film (Movie Recommendation System) adalah aplikasi yang menggunakan algoritma dan teknik tertentu untuk memberikan saran atau rekomendasi film kepada pengguna. Tujuan utama sistem ini adalah membantu pengguna menemukan film yang mungkin sesuai dengan preferensi mereka, meningkatkan pengalaman menonton, dan meningkatkan kepuasan pengguna.

Description

Movie Recommendation System Using Content Based Filtering

Sistem rekomendasi film atau Movie Recommendation System adalah aplikasi yang menggunakan algoritma dan teknik tertentu untuk memberikan saran atau rekomendasi film kepada pengguna. Tujuan utama sistem ini adalah membantu pengguna menemukan film yang mungkin sesuai dengan preferensi mereka, meningkatkan pengalaman menonton, dan meningkatkan kepuasan pengguna. Terdapat beberapa metode yang digunakan untuk membuat sistem rekomendasi, yaitu Collaborative-filtering, Content-based filtering, Knowledge-based, Hybrid filtering, dan lainnya. Pada pembuatan sistem rekomendasi ini digunakan content based filtering.

Content-based filtering merekomendasikan item berdasarkan karakteristik intrinsik atau konten dari item itu sendiri. Sistem mengevaluasi preferensi pengguna dan mencocokkannya dengan fitur-fitur seperti genre, aktor, atau kata kunci yang terkait dengan item. Kelebihan metode ini termasuk kemampuan untuk memberikan rekomendasi yang lebih personal dan independen dari data pengguna lain. Namun, kelemahannya terletak pada keterbatasan variasi rekomendasi. Dalam konteks movie recommendation, konten ini bisa mencakup genre film, aktor, sutradara, kata kunci, atau fitur lainnya yang dapat diambil dari deskripsi atau metadata film.

Implementasi

Pertama - tama akan diimport beberapa library yang diperlukan. Berikut penjelasannya:

  • import numpy as np: Mengimpor library NumPy untuk operasi numerik efisien. NumPy umumnya digunakan untuk manipulasi data numerik.
  • import pandas as pd: Mengimpor library Pandas untuk manipulasi dan analisis data. Pandas digunakan untuk bekerja dengan data dalam bentuk DataFrame.
  • import matplotlib as mpl: Mengimpor library Matplotlib sebagai "mpl" untuk visualisasi data. Matplotlib digunakan untuk membuat plot dan grafik.
  • import seaborn as sns: Mengimpor library Seaborn sebagai "sns" untuk visualisasi data berbasis Matplotlib. Seaborn menyediakan antarmuka yang lebih tinggi dan estetika yang lebih baik untuk visualisasi data.
  • from sklearn.metrics.pairwise import cosine_distances: Mengimpor modul cosine_distances dari scikit-learn untuk menghitung jarak kosinus antara vektor. Dalam konteks sistem rekomendasi, jarak kosinus sering digunakan untuk mengukur kesamaan antar item.
  • from sklearn.feature_extraction.text import CountVectorizer: Mengimpor modul CountVectorizer dari scikit-learn untuk mengonversi teks menjadi representasi vektor hitungan. Dalam sistem rekomendasi berbasis konten, ini dapat digunakan untuk mengonversi teks (seperti deskripsi film) menjadi fitur yang dapat digunakan untuk perhitungan kesamaan.
  • from nltk.tokenize import word_tokenize: Mengimpor fungsi word_tokenize dari NLTK untuk tokenisasi kata. Tokenisasi adalah proses memecah teks menjadi kata-kata terpisah.
  • import nltk: Mengimpor Natural Language Toolkit (NLTK), sebuah toolkit untuk pemrosesan bahasa alami.
  • nltk.download('punkt'): Mengunduh model tokenisasi kata dari NLTK. Ini diperlukan agar fungsi tokenisasi dapat digunakan.

Selanjutnya menggunakan pd.read_csv("movies.csv") dari Pandas untuk membaca file CSV dengan nama "movies.csv". File ini berisi data tentang film, dan fungsi ini akan mengembalikan hasil pembacaan tersebut dalam bentuk DataFrame Pandas. Dan hasil pembacaan file CSV disimpan dalam variabel movies. Dengan demikian, DataFrame tersebut dapat diakses dan diolah lebih lanjut dalam kode selanjutnya.

Dan movies.head() digunakan untuk menampilkan lima baris pertama dari DataFrame movies. 

Kode movies.columns digunakan untuk menampilkan daftar kolom yang ada dalam DataFrame "movies". Fungsi ini memberikan informasi tentang variabel atau atribut apa saja yang tersedia dalam dataset. 

Selanjutnya menggunakan pd.read_csv("credits.csv") dari Pandas untuk membaca file CSV dengan nama "credits.csv". File ini  berisi data tentang kredit film, dan fungsi ini akan mengembalikan hasil pembacaan tersebut dalam bentuk DataFrame Pandas. Hasil pembacaan file CSV disimpan dalam variabel credits. Dengan demikian, DataFrame tersebut dapat diakses dan diolah lebih lanjut dalam kode selanjutnya.

Dan credits.head() digunakan untuk menampilkan lima baris pertama dari DataFrame credits. 

Selanjutnya, menggunakan metode merge dari Pandas untuk menggabungkan dua DataFrame, yaitu "movies" dan "credits", berdasarkan kolom "title". Ini berarti DataFrame akan digabungkan berdasarkan judul film. Hasilnya adalah DataFrame baru yang mencakup kolom-kolom dari kedua DataFrame. Hasil penggabungannya akan disimpan dalam variabel df. Dengan demikian, DataFrame ini sekarang berisi kolom-kolom dari "movies" dan "credits" yang telah digabungkan. Lalu menampilkan bentuk (jumlah baris dan kolom) dari DataFrame df setelah penggabungan. Fungsi shape memberikan tuple yang berisi jumlah baris dan jumlah kolom.

Kemudian, menggunakan notasi kurung siku ganda ([['...']]) untuk memilih kolom tertentu dari DataFrame df. Kolom-kolom yang dipilih adalah 'movie_id', 'title', 'overview', 'genres', 'keywords', 'cast', dan 'crew'. Hasil seleksi kolom disimpan kembali dalam variabel df, sehingga DataFrame sekarang hanya berisi kolom-kolom yang dipilih. Lalu, menampilkan kembali lima baris pertama dari DataFrame df setelah pemilihan kolom. Fungsi head() umumnya digunakan untuk memberikan gambaran cepat tentang struktur dan konten dari DataFrame yang telah dimodifikasi.

Menggunakan df.isnull().sum() untuk menghitung jumlah nilai null (missing values) pada setiap kolom dalam DataFrame df. Dimana ditemukan 3 dalam kolom overview.

Selanjutnya, menggunakan metode dropna dari Pandas untuk menghapus baris-baris yang mengandung nilai null dari DataFrame df. Parameter inplace=True digunakan untuk melakukan perubahan pada DataFrame asli tanpa perlu menyimpan hasilnya ke variabel baru. Ini berarti DataFrame df akan dimodifikasi langsung. Setelah baris ini dieksekusi, baris-baris yang memiliki setidaknya satu nilai null akan dihapus dari DataFrame df.

Dan menggunakan df.isnull().sum() kembali untuk menghitung jumlah nilai null (missing values) pada setiap kolom dalam DataFrame df. Dimana sudah tidak ditemukan lagi nilai null pada kolom.

Selanjutnya, fungsi convert yang didefinisikan di atas digunakan untuk mengonversi string yang berisi representasi list dalam Python menjadi daftar nama. Fungsi ini menggunakan modul ast untuk mengevaluasi string sebagai ekspresi Python, kemudian melakukan iterasi melalui elemen-elemen dalam list tersebut. Hanya tiga nama pertama yang diambil dari setiap elemen dictionary dengan kunci 'name', dan hasilnya adalah daftar yang berisi tiga nama pertama dari setiap elemen list yang dievaluasi. Dengan kata lain, fungsi ini dimaksudkan untuk mengonversi string representasi list yang mungkin berisi informasi tentang nama-nama (misalnya, aktor atau genre film) menjadi daftar Python dengan tiga nama pertama.

Selanjutnya, mengaplikasikan fungsi convert yang telah dibuat sebelumnya ke dalam kolom 'genres' dan 'keywords' dalam DataFrame df.

Fungsi ini dirancang untuk mengonversi string yang berisi representasi list dalam Python menjadi daftar nama. Fungsi ini menerima satu parameter, yaitu text, yang diharapkan berisi string representasi list. Menggunakan modul ast untuk mengevaluasi string sebagai ekspresi Python, kemudian melakukan iterasi melalui elemen-elemen dalam list tersebut. Hanya tiga nama pertama dari elemen dictionary dengan kunci 'name' yang ditambahkan ke dalam daftar L. Iterasi dihentikan setelah tiga nama pertama telah ditambahkan. Hasilnya adalah daftar yang berisi tiga nama pertama dari setiap elemen list yang dievaluasi.

Selanjutnya, mengaplikasikan fungsi convert_cast ke setiap elemen dalam kolom 'cast' pada DataFrame df. Hasilnya, kolom 'cast' dalam DataFrame df sekarang berisi daftar yang berisi tiga nama pertama dari setiap elemen list yang sebelumnya dalam bentuk string representasi list.


Fungsi extract_director ini dirancang untuk mengekstrak nama direktur dari string representasi list dalam kolom 'crew'. Fungsi ini menggunakan modul ast untuk mengevaluasi string sebagai ekspresi Python, lalu melakukan iterasi melalui elemen-elemen dalam list tersebut. Jika ditemukan elemen dengan pekerjaan ('job') 'Director', maka nama direktur ditambahkan ke dalam daftar. Hasilnya adalah daftar yang berisi nama direktur dari elemen list yang dievaluasi. 

Selanjutnya, mengaplikasikan fungsi extract_director ke setiap elemen dalam kolom 'crew' pada DataFrame df. Ini menghasilkan perubahan pada kolom 'crew', di mana setiap nilai yang sebelumnya dalam bentuk string representasi list akan digantikan oleh daftar yang berisi nama direktur dari setiap elemen list yang terkandung dalam nilai tersebut.


Fungsi replace_spaces dirancang untuk menggantikan spasi dengan string kosong dalam setiap elemen daftar. Fungsi ini menerima satu parameter, yaitu daftar L, dan menggunakan loop untuk iterasi melalui setiap elemen dalam daftar tersebut. Setiap spasi dalam elemen daftar digantikan dengan string kosong, dan hasilnya ditambahkan ke dalam daftar baru L1. Hasilnya adalah daftar L1 yang berisi elemen-elemen dari L tanpa spasi.

Baris kode tersebut mengaplikasikan fungsi replace_spaces ke setiap elemen dalam kolom 'cast', 'crew', 'genres', dan 'keywords' pada DataFrame df. Ini akan menghasilkan perubahan di mana setiap spasi dalam setiap elemen daftar dari kolom-kolom tersebut akan digantikan oleh string kosong ("").

Selanjutnya, kita akan menampilkan data yang telah dimodifikasi, seperti beberapa kolom yaitu cast, crew, genres, keywords. Disini dapat dilihat perubahan yang telah dilakukan sebelumnya, dimana data telah bersih dan bisa digunakan.

Selanjutnya, akan dibuat kolom baru bernama 'metadata' dalam DataFrame df. Kolom ini berisi gabungan informasi dari kolom 'genres', 'keywords', 'cast', dan 'crew' untuk setiap entri film. Hasilnya adalah DataFrame yang diperluas dengan penambahan kolom 'metadata'. Setiap baris dalam kolom 'metadata' sekarang berisi informasi yang digabungkan dari kolom 'genres', 'keywords', 'cast', dan 'crew' untuk entri film yang bersangkutan.

Berikutnya melakukan dua langkah transformasi pada kolom 'metadata' dalam DataFrame df, yaitu

Menggunakan fungsi apply dengan lambda function untuk menggabungkan elemen-elemen daftar dalam kolom 'metadata' menjadi satu string, dengan setiap elemen dipisahkan oleh spasi. Hasilnya, setiap baris dalam kolom 'metadata' sekarang berisi satu string yang merupakan gabungan dari informasi 'genres', 'keywords', 'cast', dan 'crew' untuk setiap film.

Menggunakan fungsi apply dengan lambda function untuk mengubah semua karakter dalam setiap string dalam kolom 'metadata' menjadi huruf kecil (lowercase). Ini dilakukan untuk memastikan konsistensi dalam pengolahan teks, sehingga perbedaan huruf besar dan kecil tidak mempengaruhi analisis atau rekomendasi.

Selanjutnya menggunakan fungsi ToString yang bertujuan untuk mengonversi sebuah daftar menjadi sebuah string, dengan elemen-elemen daftar dipisahkan oleh koma. 

Setelah itu, mengaplikasikan fungsi ToString ke setiap elemen dalam kolom 'genres', 'keywords', 'cast', dan 'crew' dalam DataFrame df. Dengan melakukan ini, setiap kolom akan diubah dari bentuk daftar menjadi string, di mana elemen-elemen daftar dipisahkan oleh koma. Hasilnya adalah DataFrame yang diperluas, di mana kolom-kolom tersebut sekarang berisi string yang berisi elemen-elemen daftar yang dipisahkan oleh koma. Lalu menjalankan df.head(), sehingga dapat terlihat hasilnya pada lima baris pertama dari DataFrame yang telah diubah.

Class recomendation_system disini adalah kerangka sistem rekomendasi berbasis konten. Berikut adalah penjelasan singkatnya:

init disini merupakan metode inisialisasi (constructor) yang dipanggil saat objek kelas dibuat. Dimana menerima dua parameter, data dan content_col, yang digunakan untuk menyimpan DataFrame dan nama kolom konten yang akan digunakan.

fit disini merupakan metode untuk melatih model rekomendasi. Dimana menggunakan CountVectorizer untuk mengonversi teks dalam kolom konten menjadi representasi vektor. Dan menyimpan hasil transformasi dalam atribut bank.

Selanjutnya recomend, metode untuk memberikan rekomendasi berdasarkan kesamaan konten. Dimana akan diterima nama (judul) item yang ingin direkomendasikan dan parameter opsional topk yang menentukan jumlah rekomendasi yang dihasilkan. Akan digunakan cosine similarity untuk mengukur kesamaan antara item yang dipilih dan item lainnya. Dan mengembalikan DataFrame yang berisi rekomendasi untuk item yang diberikan.

Dengan ini akan dihasilkan sistem rekomendasi berbasis konten dengan melatih model menggunakan metode fit dan mendapatkan rekomendasi menggunakan metode recomend.

Setelah itu, membuat objek recsys dari kelas recomendation_system dengan menggunakan DataFrame df dan menggunakan kolom 'metadata' sebagai kolom konten. Selanjutnya, metode fit() dipanggil pada objek tersebut untuk melatih model rekomendasi berbasis konten.

Setelah menjalankan recsys.fit(), model rekomendasi sekarang sudah dilatih menggunakan representasi vektor dari kolom 'metadata' pada DataFrame. Dengan model yang sudah dilatih ini, dapat digunakan metode recsys.recomend() untuk mendapatkan rekomendasi berdasarkan kesamaan konten. 

Setelah selesai membuat model rekomendasi, sekarang akan diuji dengan menjalankan recsys.recomend("batman"), akan diberikan rekomendasi untuk film dengan judul "Batman" berdasarkan kesamaan kontennya dengan film lain dalam dataset. Akan didapatkan DataFrame yang berisi film-film yang direkomendasikan. Dimana dapat dilihat terdapat banyak kemiripan setiap film dari kolom - kolomnya. Bukan hanya kesamaan judul film karena model rekomendasi yang telah dibuat ini menggunakan representasi vektor dari kolom metadata, yang dimana gabungan dari beberapa kolom.

Informasi Course Terkait
  Kategori: Artificial Intelligence
  Course: Artificial Intelligence