Recommendation System for Korean Drama with Content-Based Filtering Method

Tasya Apriliana
7 min readJul 23, 2023

--

Sistem rekomendasi merupakan subkelas dari sistem filtering informasi untuk memprediksi peringkat atau preferensi yang mungkin diberikan pengguna terhadap suatu item. Dengan kata lain, ini adalah algoritma yang menyarankan item yang relevan kepada pengguna.

Sistem rekomendasi pada artikel ini menggunakan pendekatan Content-Based Filtering. Studi kasus yang akan digunakan yaitu data kdrama pada website MyDramaList. Beberapa dokumen yang nantinya akan digunakan dalam artikel, Anda dapat mengunduhnya pada di link ini.

Business Cases Background Theme

Seperti yang kita ketahui drama korea atau yang sering disebut juga kdrama telah mendapatkan popularitas besar di seluruh dunia, dan beragam genre serta alur cerita yang menarik telah memikat perhatian dari berbagai kalangan penonton. Untuk meningkatkan pengalaman dan keterlibatan pengguna, tujuan saya adalah membangun sistem rekomendasi yang memberikan rekomendasi kdrama sesuai dengan preferensi individu, sehingga para penonton dapat menemukan konten yang sesuai dengan selera dan minat mereka.

Dalam kasus bisnis ini, fokus saya ingin mengembangkan sistem rekomendasi yang dipersonalisasi untuk para penggemar kdrama. Adapun beberapa tujuan utamanya seperti:

  1. Meningkatkan keterlibatan penonton dalam menonton dengan jangka waktu yang lebih lama
  2. Meningkatkan kepuasaan pengguna terhadap rekomendasi yang diberikan
  3. Mengoptimalkan waktu menonton untuk meningkatkan pendapatan iklan dan keterlibatan pengguna

Understanding The Business Constraints

Preferensi pengguna dapat berubah dari waktu ke waktu. Sehingga sistem rekomendasi harus mampu mengenali dan menyesuaikan diri dengan perubahan ini. Selain itu, karena sistem rekomendasi berbasis kendala beroperasi berdasarkan pernyataan eksplisit mengenai kebutuhan dan keinginan pengguna saat ini, pengetahuan tentang persyaratan pengguna juga harus tersedia untuk sistem sebelum rekomendasi dapat dibuat.

Data Collection and Pre-processing

Data yang digunakan merupakan dataset Top 250 kdrama pada website MyDramaList. Saya dapatkan data ini dari kaggle, dimana pada data terdiri dari 17 kolom dan 251 baris.

Untuk pengolahan data saya menggunakan Python dengan codingan berikut ini.

# Import library 
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import difflib
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# Load the data
df = pd.read_csv('C:\\project trending\\kdrama.csv')
df.head()

# DATA PREPARATION
# Cleaning data
df['Rank'] = df['Rank'].astype(str).str.replace('#', '').astype(int)
df.info()
df.shape
df.isnull().sum()
df.dropna(inplace=True)
# selecting only the relevant columns
selected_feature = ['Name', 'Original Network', 'Synopsis', 'Genre', 'Tags', 'Director', 'Cast']
print(selected_feature)
# replacing the null values with empty string
for feature in selected_feature:
df[feature] = df[feature].fillna('')
# combine all selected features
combined_features = df['Name'] + ' ' + df['Original Network'] + ' ' + df['Synopsis'] + ' ' + df['Genre'] + ' ' + df['Tags'] + ' ' + df['Director'] + ' ' + df['Cast']
print(combined_features)
# converting text data to feature vectors
vectorizer = TfidfVectorizer()
feature_vectors = vectorizer.fit_transform(combined_features)
print(feature_vectors)

Pada data preparation diatas, terdapat beberapa tahap yang dilakukan yaitu pembersihan data, memilih hanya kolom yang relevan untuk digunakan dalam tahap selanjutnya, mengganti nilai null dengan string kosong, menggabungkan semua features yang dipilih, dan mengkonversi atau melakukan pembobotan data teks dengan perhitungan TF-IDF. Term Frequency Inverse Document Frequency (TF-IDF) adalah salah satu metode representasi data teks menjadi bentuk numerik.

Pehitungan TF-IDF dilakukan sesuai dengan persamaan berikut

dimana,

Setelah dilakukan pembobotan TF-IDF, maka tahap selanjutnya adalah mendapatkan nilai similaritasnya.

# COSINE SIMILARITY
# getting the similarity scores
similarity = cosine_similarity(feature_vectors)
print(similarity)
print(similarity.shape)
df = pd.DataFrame(similarity)
# write to csv
df.to_csv('C:/project trending/cosine_sim.csv', index=False)

# GETTING KDRAMA NAME
kdrame_name = input("Enter the name of the movie you want to search: ")
# creating list all the movie names
list_all_kdrama = df['Name'].tolist()
print(list_all_kdrama)
# finding close matches for kdrama
find_close_matches = difflib.get_close_matches(kdrame_name, list_all_kdrama)
print(find_close_matches)
close_matches = find_close_matches[0]
print(close_matches)
# finding the index of the movie
index_of_kdrama = df[df['Name'] == close_matches]['Rank'].values[0]
print(index_of_kdrama)
# getting a list similar movies
similarity_score = list(enumerate(similarity[index_of_kdrama]))
print(similarity_score)
len(similarity_score)
# sorting movies based on similarity score
sorted_similar_movies = sorted(similarity_score, key=lambda x: x[1], reverse=True)
print(sorted_similar_movies)
# printing the name of similarity movies based on index
print("KDrama suggested for you : \n")

i = 1

for movie in sorted_similar_movies:
index = movie[0]
title_from_index = df[df['Rank'] == index]['Name'].values
if len(title_from_index) > 0:
title_from_index = title_from_index[0]
if (i<=20):
print(i, ".", title_from_index)
i += 1
else:
continue

Machine Learning Training

Source: https://recosenselabs.com/blog/content-recommendations-media-websites

Dalam jenis sistem rekomendasi ini, item yang relevan ditampilkan menggunakan konten item yang dicari sebelumnya oleh pengguna. Di sini konten mengacu pada atribut/tag drama yang disukai pengguna. Dalam sistem jenis ini, produk diberi tag menggunakan kata kunci tertentu, kemudian sistem mencoba memahami apa yang diinginkan pengguna dan mencarinya di database dan terakhir mencoba merekomendasikan berbagai drama yang diinginkan pengguna.

Mari kita ambil contoh sistem rekomendasi film dimana setiap film dikaitkan dengan genrenya yang dalam kasus di atas disebut sebagai tag/atribut.

Sekarang anggaplah pengguna A datang dan pada awalnya sistem tidak memiliki data apa pun tentang pengguna A. Pada awalnya, sistem mencoba merekomendasikan film-film populer kepada pengguna atau sistem mencoba mendapatkan beberapa informasi pengguna dengan mengisi formulir oleh pengguna. Setelah beberapa waktu, pengguna mungkin telah memberikan peringkat pada beberapa film seperti memberikan peringkat yang baik untuk film berdasarkan genre aksi dan peringkat buruk untuk film berdasarkan genre anime. Jadi di sini sistem merekomendasikan film aksi kepada pengguna.

Tetapi di sini Anda tidak dapat mengatakan bahwa pengguna tidak menyukai film animasi karena mungkin pengguna tidak menyukai film tersebut karena alasan lain seperti akting atau cerita tetapi sebenarnya menyukai film animasi dan membutuhkan lebih banyak data dalam kasus ini.

Metrics on Model Machine Learning

Cosine similarity merupakan perhitungan yang sering digunakan untuk menghitung kemiripan diantara item-item. Secara umum, fungsi similarity adalah fungsi yang menerima dua obyek berupa bilangan riil (0 dan 1) dan mengembalikan nilai kemiripan (similarity) antara kedua obyek tersebut berupa bilangan riil.

Cosine similarity merupakan salah satu metode pengukuran kemiripan yang populer. Metode ini digunakan untuk menghitung nilai kosinus sudut antara dua vektor dan biasanya digunakan untuk mengukur kemiripan antara dua dokumen. Fungsi cosine similarity antara item A dan item B ditunjukkan sebagai berikut.

Jika kedua objek memiliki nilai similaritas 1, maka kedua objek dikatakan identik dan sebaliknya. Semakin besar hasil dari fungsi similarity, maka kedua objek yang dievaluasi dianggap semakin mirip dan sebaliknya.

Model Deployment

Model deploying machine learning dalam artikel ini menggunakan Flask. Machine learning merupakan cabang aplikasi dari Artificial Intelligence (Kecerdasan Buatan) yang fokus pada pengembangan sebuah sistem yang mampu belajar “sendiri” tanpa harus berulang kali di program oleh manusia.

Flask adalah framework atau kerangka yang menghubungkan Python dengan aplikasi web. Untuk itu script berikut ini yang akan digunakan dalam artikel ini untuk menghubungkan Python dengan aplikasi web. Selain itu, script berikut ini juga yang akan digunakan untuk menampilkan hasil rekomendasi yang dikeluarkan oleh sistem.

from flask import Flask, request, make_response, render_template, redirect, url_for
from flask.helpers import url_for
import pandas as pd
# import warnings
# warnings.filterwarnings('ignore')

# Initialize Flask app
app = Flask(__name__)

def recommendation_kdrama(name):
data = pd.read_csv("project trending/data/kdrama.csv")
cosine_sim = pd.read_csv("project trending/data/cosine_sim.csv")
indexprod = int(data.loc[data['Name'] == name].index.values[0])
similar_review = list(enumerate(cosine_sim.iloc[indexprod], start=-1))
sorted_similar_review = sorted(similar_review, key=lambda x:x[1], reverse=True)
aa = []
for i in range(1,7) :
aa.append(sorted_similar_review[i][0])
return data.iloc[aa,:5]

# @app.route("/")
# def home_page():
# return render_template("index.html")

@app.route("/")
def home_page():
return render_template("index.html")

@app.route("/recommendation", methods=["POST"])

def recommendation():
if request.method == "POST":
result = request.form
kdrama_name = str(request.form["Name"])
df = recommendation_kdrama(kdrama_name)
headers = list(enumerate(df.columns, 1))
rows = []

for _, row in df.iterrows():
rows.append(list(enumerate(row, 1)))

return render_template("table.html", result=result, headers=headers, rows=rows, Name=kdrama_name)
# else:
# return render_template("index.html")

if __name__ == '__main__':
app.run(debug=True)

Data Monitoring Through Web Application

Dalam artikel ini akan menggunakan Pythonanywhare, dimana merupakan layanan web hosting dan IDE (Integrated Development Environment) online berbasis python. Kita dapat mengunggah dan memasang aplikasi web berbasis Python yang menggunakan WSGI, misalnya Flask.

Untuk tutorial menggunakan Pythonanywhare dapat dipelajari dalam artikel di link ini.

Hasil dari hosting yang dilakukan menggunakan Pythonanywhare untuk sistem rekomendasi dapat dilihat melalui link berikut

tasyaapriliana.pythonanywhere.com

Dengan tampilan web yang akan muncul seperti pada gambar di bawah ini

Misal kita ingin mencoba apakah sistem telah berjalan dengan baik, maka kita dapat mencoba mengetikkan nama kdrama “Hospital Playlist” sehingga muncul tampilan web dengan tabel hasil rekomendasi yang diberikan oleh sistem sebagai berikut.

Karena sistem rekomendasi sudah memberikan hasil dengan baik, maka sampai disini pembahasan dalam artikel ini, semoga penjelasan yang ada dapat dipahami dengan baik…

Referensi

--

--

Tasya Apriliana
Tasya Apriliana

Written by Tasya Apriliana

Undergraduate Statistics Student at UII

No responses yet