{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "vncDsAP0Gaoa"
},
"source": [
"# **Netflix Movies And TV Shows Clustering**\n",
"\n",
"---------------------------------------------"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "50pzm194nHoT"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "FJNUwmbgGyua"
},
"source": [
"# **Project Summary -**"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "F6v_1wHtG2nS"
},
"source": [
"Netflix Movies and TV Shows Clustering is a data analysis and machine learning technique that Netflix uses to group their content into similar categories. This technique involves analyzing the various characteristics of each title, such as genre, cast and plot, and using algorithms to identify patterns and similarities. In this way, Netflix can provide its users with personalized recommendations based on their viewing history and preferences. The goal is to improve user engagement and satisfaction, which will lead to increased retention and company revenue.\n",
"\n",
"Netflix Movies and TV Shows Clustering is a data-driven approach that Netflix uses to group its vast library of content into similar categories. The process involves collecting and analyzing various data points such as genre, cast, director, plot and other relevant features. Netflix will then use unsupervised machine learning algorithms to identify patterns and similarities between different titles.\n",
"\n",
"Algorithms used in this process include clustering techniques such as k-means, hierarchical clustering, and principal component analysis (PCA). These algorithms help Netflix group movies and TV shows with similar features into distinct groups, each representing a unique genre or category.\n",
"\n",
"The ultimate goal of this clustering is to improve the user experience on Netflix by providing personalized content recommendations to users using cosine similarity score. With the help of this, Netflix can suggest titles to users that are more likely to match their interests, making it more likely that users will stay engaged with the platform.\n",
"\n",
"In addition to improving user satisfaction, clustering analysis and recommender system also helps Netflix make data-driven decisions about content production and licensing. By understanding underlying trends and patterns in user behavior, Netflix can make informed decisions about which titles to produce or acquire and which to remove from its platform. This ultimately helps increase customer retention and company revenue."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BLpFGEcARMA2"
},
"source": [
"In this project we have done-:\n",
"\n",
"* Understanding the dataset and problem statement.\n",
"* Data Wrangling.\n",
"* Handling null vaulues and Data Cleaning.\n",
"* Text Preprocessing.\n",
"* Text Vectorization using TF-TDF.\n",
"* Clustering Analysis using different clustering algorithms.\n",
"* Checking out distribution of different cluster with the help of word cloud.\n",
"* Building a recommender system using cosine similarity.\n",
"* Conclusion"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "w6K7xa23Elo4"
},
"source": [
"# **GitHub Link 👇🏻**"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "h1o69JH3Eqqn"
},
"source": [
"https://github.com/HarshJain41/Netflix-Movies-TVShow-Clustering"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yQaldy8SH6Dl"
},
"source": [
"# **Problem Statement👇🏻**\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "DpeJGUA3kjGy"
},
"source": [
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rrCrqmn8lQih"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Hk1SVqcHldP3"
},
"source": [
""
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Y3lxredqlCYt"
},
"source": [
"### Importing Necessary Libraries👇🏻"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"id": "M8Vqi-pPk-HR"
},
"outputs": [],
"source": [
"# Necessary Libraries\n",
"#necessary packages\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import missingno as msno\n",
"import matplotlib.cm as cm\n",
"from wordcloud import WordCloud, STOPWORDS\n",
"%matplotlib inline\n",
"\n",
"\n",
"#for nlp\n",
"from sklearn import preprocessing\n",
"from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer\n",
"from sklearn.model_selection import train_test_split, KFold\n",
"from nltk.corpus import stopwords\n",
"from nltk.stem.snowball import SnowballStemmer\n",
"\n",
"from sklearn.metrics import silhouette_score\n",
"from sklearn.cluster import KMeans\n",
"from sklearn.metrics import silhouette_samples\n",
"import scipy.cluster.hierarchy as sch\n",
"\n",
"\n",
"import warnings\n",
"warnings.filterwarnings('ignore')\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3RnN4peoiCZX"
},
"source": [
"### Loading the given dataset👇🏻\n",
"\n"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"id": "4CkvbW_SlZ_R"
},
"outputs": [],
"source": [
"# Load Dataset\n",
"data = pd.read_csv('NETFLIX MOVIES AND TV SHOWS CLUSTERING (1).csv')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "x71ZqKXriCWQ"
},
"source": [
"### Dataset First View👇🏻"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 337
},
"executionInfo": {
"elapsed": 55,
"status": "ok",
"timestamp": 1676699085083,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "LWNFOSvLl09H",
"outputId": "fed5f463-d849-48a9-e19b-a62ae62f9fe8"
},
"outputs": [
{
"data": {
"text/html": [
"
"
],
"text/plain": [
" show_id type title director \\\n",
"count 7787 7787 7787 5398 \n",
"unique 7787 2 7787 4049 \n",
"top s6307 Movie The Hollow Point Raúl Campos, Jan Suter \n",
"freq 1 5377 1 18 \n",
"mean NaN NaN NaN NaN \n",
"std NaN NaN NaN NaN \n",
"min NaN NaN NaN NaN \n",
"25% NaN NaN NaN NaN \n",
"50% NaN NaN NaN NaN \n",
"75% NaN NaN NaN NaN \n",
"max NaN NaN NaN NaN \n",
"\n",
" cast country date_added release_year \\\n",
"count 7069 7280 7777 7787.000000 \n",
"unique 6831 681 1565 NaN \n",
"top David Attenborough United States January 1, 2020 NaN \n",
"freq 18 2555 118 NaN \n",
"mean NaN NaN NaN 2013.932580 \n",
"std NaN NaN NaN 8.757395 \n",
"min NaN NaN NaN 1925.000000 \n",
"25% NaN NaN NaN 2013.000000 \n",
"50% NaN NaN NaN 2017.000000 \n",
"75% NaN NaN NaN 2018.000000 \n",
"max NaN NaN NaN 2021.000000 \n",
"\n",
" rating duration listed_in \\\n",
"count 7780 7787 7787 \n",
"unique 14 216 492 \n",
"top TV-MA 1 Season Documentaries \n",
"freq 2863 1608 334 \n",
"mean NaN NaN NaN \n",
"std NaN NaN NaN \n",
"min NaN NaN NaN \n",
"25% NaN NaN NaN \n",
"50% NaN NaN NaN \n",
"75% NaN NaN NaN \n",
"max NaN NaN NaN \n",
"\n",
" description \n",
"count 7787 \n",
"unique 7769 \n",
"top Multiple women report their husbands as missin... \n",
"freq 3 \n",
"mean NaN \n",
"std NaN \n",
"min NaN \n",
"25% NaN \n",
"50% NaN \n",
"75% NaN \n",
"max NaN "
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Dataset Describe\n",
"data.describe(include = 'all')"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bKJF3rekwFvQ"
},
"source": [
"### Data Wrangling Code"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 74,
"status": "ok",
"timestamp": 1676699088001,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "wk-9a2fpoLcV",
"outputId": "7ee26ad4-fcc7-4c80-fda0-9b5376c7959f"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[nltk_data] Downloading package punkt to\n",
"[nltk_data] C:\\Users\\ADMIN\\AppData\\Roaming\\nltk_data...\n",
"[nltk_data] Package punkt is already up-to-date!\n"
]
},
{
"data": {
"text/plain": [
"True"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# converting the cast column into a list\n",
"import nltk\n",
"nltk.download('punkt')"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 69,
"status": "ok",
"timestamp": 1676699088002,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "iGQzh0z_wMDk",
"outputId": "bf8ed126-0031-4243-b12c-893042c92f47"
},
"outputs": [
{
"data": {
"text/plain": [
"show_id 0\n",
"type 0\n",
"title 0\n",
"director 2389\n",
"cast 718\n",
"country 507\n",
"date_added 10\n",
"release_year 0\n",
"rating 7\n",
"duration 0\n",
"listed_in 0\n",
"description 0\n",
"dtype: int64"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.isnull().sum()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"id": "TcNt1y5xT5OG"
},
"outputs": [],
"source": [
"#fillna() is a function in Pandas, a Python library for data analysis, that we used to replace missing (NaN) values in our DataFrame with a specified value.\n",
"data['cast'].fillna('No cast',inplace=True)\n",
"data['country'].fillna(data['country'].mode()[0],inplace=True)\n",
"data['director'].fillna('', inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"id": "Rhd-J-qWwW2B"
},
"outputs": [],
"source": [
"#'date_added' and 'rating' contains an lower and not much important portion of the data so we will drop them from our analysis.\n",
"data.dropna(subset=['date_added','rating'],inplace=True)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 66,
"status": "ok",
"timestamp": 1676699088004,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "7E06p0Mz6TyW",
"outputId": "c29dda97-fd19-4d53-af47-ad9796630059"
},
"outputs": [
{
"data": {
"text/plain": [
"show_id 0\n",
"type 0\n",
"title 0\n",
"director 0\n",
"cast 0\n",
"country 0\n",
"date_added 0\n",
"release_year 0\n",
"rating 0\n",
"duration 0\n",
"listed_in 0\n",
"description 0\n",
"dtype: int64"
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#isnull() is a function in Pandas, a Python library for data analysis, that is used to identify missing (NaN) values in a DataFrame.\n",
"data.isnull().sum()\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "riotQugGqtWx"
},
"source": [
"### So as we can check here the null values are replaced and read for EDA and TexT Preprocessing."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yLjJCtPM0KBk"
},
"source": [
"## **Feature Engineering & Data Pre-processing**"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Iwf50b-R2tYG"
},
"source": [
"### Textual Data Preprocessing 👇🏻"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 64,
"status": "ok",
"timestamp": 1676699103203,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "lpSr8voLRYoN",
"outputId": "9e40e7e8-d5aa-4842-a582-b64022187a53"
},
"outputs": [
{
"data": {
"text/plain": [
"show_id 0\n",
"type 0\n",
"title 0\n",
"director 0\n",
"cast 0\n",
"country 0\n",
"date_added 0\n",
"release_year 0\n",
"rating 0\n",
"duration 0\n",
"listed_in 0\n",
"description 0\n",
"dtype: int64"
]
},
"execution_count": 21,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.isnull().sum()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "-lNShkeaQ_uG"
},
"source": [
"All the null values in our dataset are handled till now."
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 458
},
"executionInfo": {
"elapsed": 54,
"status": "ok",
"timestamp": 1676699103204,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "He1mWK1W07Os",
"outputId": "970b14ef-2e8c-4c3b-b2ae-ff1cbe8d60ea"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
show_id
\n",
"
type
\n",
"
title
\n",
"
director
\n",
"
cast
\n",
"
country
\n",
"
date_added
\n",
"
release_year
\n",
"
rating
\n",
"
duration
\n",
"
listed_in
\n",
"
description
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
s1
\n",
"
TV Show
\n",
"
3%
\n",
"
\n",
"
João Miguel, Bianca Comparato, Michel Gomes, R...
\n",
"
Brazil
\n",
"
August 14, 2020
\n",
"
2020
\n",
"
TV-MA
\n",
"
4 Seasons
\n",
"
International TV Shows, TV Dramas, TV Sci-Fi &...
\n",
"
In a future where the elite inhabit an island ...
\n",
"
\n",
"
\n",
"
1
\n",
"
s2
\n",
"
Movie
\n",
"
7:19
\n",
"
Jorge Michel Grau
\n",
"
Demián Bichir, Héctor Bonilla, Oscar Serrano, ...
\n",
"
Mexico
\n",
"
December 23, 2016
\n",
"
2016
\n",
"
TV-MA
\n",
"
93 min
\n",
"
Dramas, International Movies
\n",
"
After a devastating earthquake hits Mexico Cit...
\n",
"
\n",
"
\n",
"
2
\n",
"
s3
\n",
"
Movie
\n",
"
23:59
\n",
"
Gilbert Chan
\n",
"
Tedd Chan, Stella Chung, Henley Hii, Lawrence ...
\n",
"
Singapore
\n",
"
December 20, 2018
\n",
"
2011
\n",
"
R
\n",
"
78 min
\n",
"
Horror Movies, International Movies
\n",
"
When an army recruit is found dead, his fellow...
\n",
"
\n",
"
\n",
"
3
\n",
"
s4
\n",
"
Movie
\n",
"
9
\n",
"
Shane Acker
\n",
"
Elijah Wood, John C. Reilly, Jennifer Connelly...
\n",
"
United States
\n",
"
November 16, 2017
\n",
"
2009
\n",
"
PG-13
\n",
"
80 min
\n",
"
Action & Adventure, Independent Movies, Sci-Fi...
\n",
"
In a postapocalyptic world, rag-doll robots hi...
\n",
"
\n",
"
\n",
"
4
\n",
"
s5
\n",
"
Movie
\n",
"
21
\n",
"
Robert Luketic
\n",
"
Jim Sturgess, Kevin Spacey, Kate Bosworth, Aar...
\n",
"
United States
\n",
"
January 1, 2020
\n",
"
2008
\n",
"
PG-13
\n",
"
123 min
\n",
"
Dramas
\n",
"
A brilliant group of students become card-coun...
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" show_id type title director \\\n",
"0 s1 TV Show 3% \n",
"1 s2 Movie 7:19 Jorge Michel Grau \n",
"2 s3 Movie 23:59 Gilbert Chan \n",
"3 s4 Movie 9 Shane Acker \n",
"4 s5 Movie 21 Robert Luketic \n",
"\n",
" cast country \\\n",
"0 João Miguel, Bianca Comparato, Michel Gomes, R... Brazil \n",
"1 Demián Bichir, Héctor Bonilla, Oscar Serrano, ... Mexico \n",
"2 Tedd Chan, Stella Chung, Henley Hii, Lawrence ... Singapore \n",
"3 Elijah Wood, John C. Reilly, Jennifer Connelly... United States \n",
"4 Jim Sturgess, Kevin Spacey, Kate Bosworth, Aar... United States \n",
"\n",
" date_added release_year rating duration \\\n",
"0 August 14, 2020 2020 TV-MA 4 Seasons \n",
"1 December 23, 2016 2016 TV-MA 93 min \n",
"2 December 20, 2018 2011 R 78 min \n",
"3 November 16, 2017 2009 PG-13 80 min \n",
"4 January 1, 2020 2008 PG-13 123 min \n",
"\n",
" listed_in \\\n",
"0 International TV Shows, TV Dramas, TV Sci-Fi &... \n",
"1 Dramas, International Movies \n",
"2 Horror Movies, International Movies \n",
"3 Action & Adventure, Independent Movies, Sci-Fi... \n",
"4 Dramas \n",
"\n",
" description \n",
"0 In a future where the elite inhabit an island ... \n",
"1 After a devastating earthquake hits Mexico Cit... \n",
"2 When an army recruit is found dead, his fellow... \n",
"3 In a postapocalyptic world, rag-doll robots hi... \n",
"4 A brilliant group of students become card-coun... "
]
},
"execution_count": 22,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"id": "kEJZf8DXTpp1"
},
"outputs": [],
"source": [
"#merging all text column to single text column to work with\n",
"\n",
"data['organized'] = data['description'] + ' ' + data['listed_in'] + ' ' + data['country']+ ' ' + data['cast'] + ' '+ data['director']\n"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"id": "rw84Yt4bXZw1"
},
"outputs": [],
"source": [
"#filled all the missing value with empty strings\n",
"data['organized'] = data['organized'].fillna(\"\")"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 53
},
"executionInfo": {
"elapsed": 53,
"status": "ok",
"timestamp": 1676699103206,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "Wsas3AdhXgQ1",
"outputId": "d6f5a1eb-604d-4030-d5a8-d384c29e780d"
},
"outputs": [
{
"data": {
"text/plain": [
"\"When an army recruit is found dead, his fellow soldiers are forced to confront a terrifying secret that's haunting their jungle island training camp. Horror Movies, International Movies Singapore Tedd Chan, Stella Chung, Henley Hii, Lawrence Koh, Tommy Kuan, Josh Lai, Mark Lee, Susan Leong, Benjamin Lim Gilbert Chan\""
]
},
"execution_count": 25,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data['organized'][2]"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {
"id": "seRsQHVnTpEm"
},
"outputs": [],
"source": [
"#text cleaning\n",
"import re\n",
"def cleaned(x):\n",
" return re.sub(r\"[^a-zA-Z ]\",\"\",str(x)) #to remove all non-alphabetic characters\n",
"data['organized'] = data['organized'].apply(cleaned)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WVIkgGqN3qsr"
},
"source": [
"#### 2. Lower Casing"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {
"id": "88JnJ1jN3w7j"
},
"outputs": [],
"source": [
"# Lower Casing\n",
"data['organized']= data['organized'].str.lower()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "XkPnILGE3zoT"
},
"source": [
"#### 3. Removing Punctuations"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"id": "JNXs4Uif5Pj1"
},
"outputs": [],
"source": [
"import string\n",
"\n",
"def remove_punctuation(text):\n",
" # Create a translation table to remove punctuation using the string module\n",
" translator = str.maketrans('', '', string.punctuation)\n",
" # Apply the translation table to remove punctuation from the text\n",
" text = text.translate(translator)\n",
" return text"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 55,
"status": "ok",
"timestamp": 1676699103210,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "SLKcXBZ75gIN",
"outputId": "e0bd6d24-6605-4b33-dcbf-cf03c35a2ffd"
},
"outputs": [
{
"data": {
"text/plain": [
"0 in a future where the elite inhabit an island ...\n",
"1 after a devastating earthquake hits mexico cit...\n",
"2 when an army recruit is found dead his fellow ...\n",
"3 in a postapocalyptic world ragdoll robots hide...\n",
"4 a brilliant group of students become cardcount...\n",
" ... \n",
"7782 when lebanons civil war deprives zozo of his f...\n",
"7783 a scrappy but poor boy worms his way into a ty...\n",
"7784 in this documentary south african rapper nasty...\n",
"7785 dessert wizard adriano zumbo looks for the nex...\n",
"7786 this documentary delves into the mystique behi...\n",
"Name: organized, Length: 7770, dtype: object"
]
},
"execution_count": 29,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data['organized'].apply(remove_punctuation)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mT9DMSJo4nBL"
},
"source": [
"#### 4. Removing Stopwords"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 48,
"status": "ok",
"timestamp": 1676699103211,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "vqbBqNaA33c0",
"outputId": "fda25fda-bfb0-4786-a6c2-c3607b499878"
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"[nltk_data] Downloading package stopwords to\n",
"[nltk_data] C:\\Users\\ADMIN\\AppData\\Roaming\\nltk_data...\n",
"[nltk_data] Package stopwords is already up-to-date!\n"
]
}
],
"source": [
"#necessary import for nlp\n",
"import nltk\n",
"nltk.download('stopwords')\n",
"from nltk.corpus import stopwords\n",
"from nltk.tokenize import word_tokenize\n",
"from nltk.stem.snowball import SnowballStemmer\n"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"id": "24wQ8Jkn6Rnh"
},
"outputs": [],
"source": [
"# Removing Stopwords\n",
"def remove_stopwords(text):\n",
" # Tokenizing the text into words\n",
" words = nltk.word_tokenize(text)\n",
" # Removing stopwords from the list of words\n",
" words = [word for word in words if word.lower() not in stopwords.words('english')]\n",
" # Joining the remaining words back into a single string\n",
" text = ' '.join(words)\n",
" return text\n"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 46620,
"status": "ok",
"timestamp": 1676699149791,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "FcdeJmcZ7KKF",
"outputId": "19e3a50c-54e3-43bb-a234-6545882571bf"
},
"outputs": [
{
"data": {
"text/plain": [
"0 future elite inhabit island paradise far crowd...\n",
"1 devastating earthquake hits mexico city trappe...\n",
"2 army recruit found dead fellow soldiers forced...\n",
"3 postapocalyptic world ragdoll robots hide fear...\n",
"4 brilliant group students become cardcounting e...\n",
" ... \n",
"7782 lebanons civil war deprives zozo family hes le...\n",
"7783 scrappy poor boy worms way tycoons dysfunction...\n",
"7784 documentary south african rapper nasty c hits ...\n",
"7785 dessert wizard adriano zumbo looks next willy ...\n",
"7786 documentary delves mystique behind bluesrock t...\n",
"Name: organized, Length: 7770, dtype: object"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data['organized'].apply(remove_stopwords)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9ExmJH0g5HBk"
},
"source": [
"#### 5. Text Normalization"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"id": "l32X3m9CYVgw"
},
"outputs": [],
"source": [
"#stemming\n",
"stemmer = SnowballStemmer('english')\n",
"stop_words = set(stopwords.words('english'))"
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {
"id": "2sxKgKxu4Ip3"
},
"outputs": [],
"source": [
"def stem_text(text):\n",
" words = nltk.word_tokenize(text) # tokenizing the text into words\n",
" stemmed_words = [stemmer.stem(word) for word in words] # applying the Snowball stemmer to each word\n",
" return ' '.join(stemmed_words) # joining the stemmed words back into a single string\n",
"\n",
"# Apply the stem_text function to a column of a pandas DataFrame, such as a column called 'text'\n",
"data['org_new'] = data['organized'].apply(stem_text)"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 13,
"status": "ok",
"timestamp": 1676699157357,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "Jz6jRmB5ZRkY",
"outputId": "26b5df0e-a377-4d2c-b797-5868dba89f31"
},
"outputs": [
{
"data": {
"text/plain": [
"0 in a futur where the elit inhabit an island pa...\n",
"1 after a devast earthquak hit mexico citi trap ...\n",
"2 when an armi recruit is found dead his fellow ...\n",
"3 in a postapocalypt world ragdol robot hide in ...\n",
"4 a brilliant group of student becom cardcount e...\n",
" ... \n",
"7782 when lebanon civil war depriv zozo of his fami...\n",
"7783 a scrappi but poor boy worm his way into a tyc...\n",
"7784 in this documentari south african rapper nasti...\n",
"7785 dessert wizard adriano zumbo look for the next...\n",
"7786 this documentari delv into the mystiqu behind ...\n",
"Name: org_new, Length: 7770, dtype: object"
]
},
"execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.org_new"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 53
},
"executionInfo": {
"elapsed": 11,
"status": "ok",
"timestamp": 1676699157358,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "gojjm2KeDUcP",
"outputId": "3c4781c7-aa84-4776-8fb4-22a0f56d70fd"
},
"outputs": [
{
"data": {
"text/plain": [
"'in a futur where the elit inhabit an island paradis far from the crowd slum you get one chanc to join the save from squalor intern tv show tv drama tv scifi fantasi brazil joo miguel bianca comparato michel gome rodolfo valent vaneza oliveira rafael lozano vivian porto mel fronckowiak sergio mamberti zez motta celso frateschi'"
]
},
"execution_count": 36,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.org_new.iloc[0]"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z9jKVxE06BC1"
},
"source": [
"Here We used Snowball stemmer because it is a popular choice for stemming in NLP because it supports multiple languages, is accurate and efficient, and can be customized to meet specific needs."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "T0VqWOYE6DLQ"
},
"source": [
"#### 6. Text Vectorization"
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 738
},
"executionInfo": {
"elapsed": 529,
"status": "ok",
"timestamp": 1676699176059,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "NP1PRoPqDudF",
"outputId": "5dfe0b58-e201-49bb-c1db-d4e19ec28453"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
show_id
\n",
"
type
\n",
"
title
\n",
"
director
\n",
"
cast
\n",
"
country
\n",
"
date_added
\n",
"
release_year
\n",
"
rating
\n",
"
duration
\n",
"
listed_in
\n",
"
description
\n",
"
organized
\n",
"
org_new
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
s1
\n",
"
TV Show
\n",
"
3%
\n",
"
\n",
"
João Miguel, Bianca Comparato, Michel Gomes, R...
\n",
"
Brazil
\n",
"
August 14, 2020
\n",
"
2020
\n",
"
TV-MA
\n",
"
4 Seasons
\n",
"
International TV Shows, TV Dramas, TV Sci-Fi &...
\n",
"
In a future where the elite inhabit an island ...
\n",
"
in a future where the elite inhabit an island ...
\n",
"
in a futur where the elit inhabit an island pa...
\n",
"
\n",
"
\n",
"
1
\n",
"
s2
\n",
"
Movie
\n",
"
7:19
\n",
"
Jorge Michel Grau
\n",
"
Demián Bichir, Héctor Bonilla, Oscar Serrano, ...
\n",
"
Mexico
\n",
"
December 23, 2016
\n",
"
2016
\n",
"
TV-MA
\n",
"
93 min
\n",
"
Dramas, International Movies
\n",
"
After a devastating earthquake hits Mexico Cit...
\n",
"
after a devastating earthquake hits mexico cit...
\n",
"
after a devast earthquak hit mexico citi trap ...
\n",
"
\n",
"
\n",
"
2
\n",
"
s3
\n",
"
Movie
\n",
"
23:59
\n",
"
Gilbert Chan
\n",
"
Tedd Chan, Stella Chung, Henley Hii, Lawrence ...
\n",
"
Singapore
\n",
"
December 20, 2018
\n",
"
2011
\n",
"
R
\n",
"
78 min
\n",
"
Horror Movies, International Movies
\n",
"
When an army recruit is found dead, his fellow...
\n",
"
when an army recruit is found dead his fellow ...
\n",
"
when an armi recruit is found dead his fellow ...
\n",
"
\n",
"
\n",
"
3
\n",
"
s4
\n",
"
Movie
\n",
"
9
\n",
"
Shane Acker
\n",
"
Elijah Wood, John C. Reilly, Jennifer Connelly...
\n",
"
United States
\n",
"
November 16, 2017
\n",
"
2009
\n",
"
PG-13
\n",
"
80 min
\n",
"
Action & Adventure, Independent Movies, Sci-Fi...
\n",
"
In a postapocalyptic world, rag-doll robots hi...
\n",
"
in a postapocalyptic world ragdoll robots hide...
\n",
"
in a postapocalypt world ragdol robot hide in ...
\n",
"
\n",
"
\n",
"
4
\n",
"
s5
\n",
"
Movie
\n",
"
21
\n",
"
Robert Luketic
\n",
"
Jim Sturgess, Kevin Spacey, Kate Bosworth, Aar...
\n",
"
United States
\n",
"
January 1, 2020
\n",
"
2008
\n",
"
PG-13
\n",
"
123 min
\n",
"
Dramas
\n",
"
A brilliant group of students become card-coun...
\n",
"
a brilliant group of students become cardcount...
\n",
"
a brilliant group of student becom cardcount e...
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" show_id type title director \\\n",
"0 s1 TV Show 3% \n",
"1 s2 Movie 7:19 Jorge Michel Grau \n",
"2 s3 Movie 23:59 Gilbert Chan \n",
"3 s4 Movie 9 Shane Acker \n",
"4 s5 Movie 21 Robert Luketic \n",
"\n",
" cast country \\\n",
"0 João Miguel, Bianca Comparato, Michel Gomes, R... Brazil \n",
"1 Demián Bichir, Héctor Bonilla, Oscar Serrano, ... Mexico \n",
"2 Tedd Chan, Stella Chung, Henley Hii, Lawrence ... Singapore \n",
"3 Elijah Wood, John C. Reilly, Jennifer Connelly... United States \n",
"4 Jim Sturgess, Kevin Spacey, Kate Bosworth, Aar... United States \n",
"\n",
" date_added release_year rating duration \\\n",
"0 August 14, 2020 2020 TV-MA 4 Seasons \n",
"1 December 23, 2016 2016 TV-MA 93 min \n",
"2 December 20, 2018 2011 R 78 min \n",
"3 November 16, 2017 2009 PG-13 80 min \n",
"4 January 1, 2020 2008 PG-13 123 min \n",
"\n",
" listed_in \\\n",
"0 International TV Shows, TV Dramas, TV Sci-Fi &... \n",
"1 Dramas, International Movies \n",
"2 Horror Movies, International Movies \n",
"3 Action & Adventure, Independent Movies, Sci-Fi... \n",
"4 Dramas \n",
"\n",
" description \\\n",
"0 In a future where the elite inhabit an island ... \n",
"1 After a devastating earthquake hits Mexico Cit... \n",
"2 When an army recruit is found dead, his fellow... \n",
"3 In a postapocalyptic world, rag-doll robots hi... \n",
"4 A brilliant group of students become card-coun... \n",
"\n",
" organized \\\n",
"0 in a future where the elite inhabit an island ... \n",
"1 after a devastating earthquake hits mexico cit... \n",
"2 when an army recruit is found dead his fellow ... \n",
"3 in a postapocalyptic world ragdoll robots hide... \n",
"4 a brilliant group of students become cardcount... \n",
"\n",
" org_new \n",
"0 in a futur where the elit inhabit an island pa... \n",
"1 after a devast earthquak hit mexico citi trap ... \n",
"2 when an armi recruit is found dead his fellow ... \n",
"3 in a postapocalypt world ragdol robot hide in ... \n",
"4 a brilliant group of student becom cardcount e... "
]
},
"execution_count": 37,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.head()"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"id": "cBxFBVPG3yDP"
},
"outputs": [],
"source": [
"new_df = data[['title', 'org_new']]"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"executionInfo": {
"elapsed": 6,
"status": "ok",
"timestamp": 1676699247013,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "lnE3n7hbD_Qz",
"outputId": "aabe11ec-858e-49a1-8e9a-f34287b5c1f7"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
title
\n",
"
org_new
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
3%
\n",
"
in a futur where the elit inhabit an island pa...
\n",
"
\n",
"
\n",
"
1
\n",
"
7:19
\n",
"
after a devast earthquak hit mexico citi trap ...
\n",
"
\n",
"
\n",
"
2
\n",
"
23:59
\n",
"
when an armi recruit is found dead his fellow ...
\n",
"
\n",
"
\n",
"
3
\n",
"
9
\n",
"
in a postapocalypt world ragdol robot hide in ...
\n",
"
\n",
"
\n",
"
4
\n",
"
21
\n",
"
a brilliant group of student becom cardcount e...
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" title org_new\n",
"0 3% in a futur where the elit inhabit an island pa...\n",
"1 7:19 after a devast earthquak hit mexico citi trap ...\n",
"2 23:59 when an armi recruit is found dead his fellow ...\n",
"3 9 in a postapocalypt world ragdol robot hide in ...\n",
"4 21 a brilliant group of student becom cardcount e..."
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"new_df.head()"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {
"id": "yBRtdhth6JDE"
},
"outputs": [],
"source": [
"#using tfidf\n",
"from sklearn.feature_extraction.text import TfidfVectorizer"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {
"id": "D_ut5aDyZfm-"
},
"outputs": [],
"source": [
"t_vectorizer = TfidfVectorizer(max_features=20000)\n",
"X= t_vectorizer.fit_transform(new_df['org_new'])\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 17,
"status": "ok",
"timestamp": 1676699370133,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "vPw2Mv6KWfi8",
"outputId": "3ef9fa2c-67bf-4674-e24b-b70fe283e15c"
},
"outputs": [
{
"data": {
"text/plain": [
"(7770, 20000)"
]
},
"execution_count": 42,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X.shape"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "su2EnbCh6UKQ"
},
"source": [
"Here we have used Tf-idf vectorization beacause it takes into account the importance of each word in a document. TF-IDF also assigns higher values to rare words that are unique to a particular document, making them more important in the representation."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "BqgSdoDiEjsP"
},
"source": [
"### **Dimensionality Reduction using PCA**"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 799598,
"status": "ok",
"timestamp": 1676700322087,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "DIpLz1k_Ea2g",
"outputId": "3f30dfa4-cfd4-4c95-baf6-5a276d5b8cf0"
},
"outputs": [
{
"data": {
"text/plain": [
"PCA()"
]
},
"execution_count": 43,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.decomposition import PCA\n",
"pca = PCA()\n",
"pca.fit(X.toarray())"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 548
},
"executionInfo": {
"elapsed": 728,
"status": "ok",
"timestamp": 1676700345325,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "j5RZHG93Ea5t",
"outputId": "4def5484-d999-48e1-fed7-6b0857bd7075"
},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Lets plot explained var v/s comp to check how many components to be considered.\n",
"plt.figure(figsize=(14,5), dpi=120)\n",
"plt.plot(np.cumsum(pca.explained_variance_ratio_))\n",
"plt.xlabel('number of components')\n",
"plt.ylabel('cumulative explained variance')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "RGz3cOZmFW2e"
},
"source": [
"* We can see from the above plot almost 95% of the variance can be explained by 5000 components.\n",
"* Since choosing 5000 could be tricky we will set the value to be 95% in sklearn."
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 834096,
"status": "ok",
"timestamp": 1676701222021,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "c25x73lKEa88",
"outputId": "46ee11ae-58da-460b-9f69-bd8834b54736"
},
"outputs": [
{
"data": {
"text/plain": [
"(7770, 5000)"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pca_tuned = PCA(n_components=5000)\n",
"pca_tuned.fit(X.toarray())\n",
"X_transformed = pca_tuned.transform(X.toarray())\n",
"X_transformed.shape"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 4,
"status": "ok",
"timestamp": 1676701273365,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "FgFTGWv5Ea_5",
"outputId": "8ec504a8-0b1c-4571-85bf-2fb48d871d82"
},
"outputs": [
{
"data": {
"text/plain": [
"array([[ 1.16827901e-01, -3.10369903e-02, -3.41246062e-03, ...,\n",
" -1.79854520e-03, -7.63243167e-03, 8.98526686e-03],\n",
" [-4.36200516e-02, -3.76015060e-02, 2.87479309e-02, ...,\n",
" 1.66970683e-03, 1.01036253e-02, 9.25303735e-03],\n",
" [-5.64130207e-02, -7.12843503e-02, 8.35385566e-03, ...,\n",
" -4.06459845e-04, -2.25336637e-03, -9.23281249e-03],\n",
" ...,\n",
" [-5.48001710e-02, 1.94571030e-01, 9.70241682e-02, ...,\n",
" -9.47824400e-03, -1.31496047e-02, 8.57450338e-03],\n",
" [ 1.03010848e-01, 1.85228855e-04, 8.46923825e-03, ...,\n",
" 6.55925665e-03, 1.35469571e-02, 3.65357917e-03],\n",
" [-3.48841516e-02, 3.90448132e-01, 8.66812216e-02, ...,\n",
" 5.52689990e-03, -4.31618769e-03, -5.86522660e-03]])"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"X_transformed"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "eRyf-cTqG-Cf"
},
"source": [
"Above we have used Principal component analysis which is one of the dimensionality reduction technique. We have used it in order to capture the maximum variance of our data into small number of features."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "VfCC591jGiD4"
},
"source": [
"# **ML Model Implementation**"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PhtGMjSh_ytU"
},
"source": [
"## **Recommender System**"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {
"id": "38hPncgI_H9D"
},
"outputs": [],
"source": [
"#removing stopwords\n",
"tfidf = TfidfVectorizer(stop_words='english')"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"executionInfo": {
"elapsed": 473,
"status": "ok",
"timestamp": 1676714753548,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "5onYUbWco2YB",
"outputId": "776ec8fb-2b77-4ed4-ece6-29a2284ec9c6"
},
"outputs": [
{
"data": {
"text/plain": [
"(7770, 41973)"
]
},
"execution_count": 50,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#get the tf-idf scores\n",
"#create TF-IDF matrix by fitting and transforming the data\n",
"tfidf_matrix = tfidf.fit_transform(data['org_new'])\n",
"\n",
"#shape of tfidf_matrix\n",
"tfidf_matrix.shape"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mLGj0IEqBh0o"
},
"source": [
"We'll use cosine similarity over tf-idf because-:\n",
"* Cosine similarity handles high dimensional sparse data better. \n",
"\n",
"* Cosine similarity captures the meaning of the text better than tf-idf. For example, if two items contain similar words but in different orders, cosine similarity would still consider them similar, while tf-idf may not. This is because tf-idf only considers the frequency of words in a document and not their order or meaning."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kOgz-J28Bo7k"
},
"source": [
"### **Using Cosine Similarity**"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3-1DxvwuSxll"
},
"source": [
"Cosine similarity is a measure of similarity between two non-zero vectors in a multidimensional space. It measures the cosine of the angle between the two vectors, which ranges from -1 (opposite direction) to 1 (same direction), with 0 indicating orthogonality (the vectors are perpendicular to each other).\n",
"\n",
"In this project we have used cosine similarity which is used to determine how similar two documents or pieces of text are. We represent the documents as vectors in a high-dimensional space, where each dimension represents a word or term in the corpus. We can then calculate the cosine similarity between the vectors to determine how similar the documents are based on their word usage."
]
},
{
"cell_type": "code",
"execution_count": 51,
"metadata": {
"id": "r522RJBlA8i6"
},
"outputs": [],
"source": [
"from sklearn.metrics.pairwise import cosine_similarity\n",
"cosine_sim = cosine_similarity(tfidf_matrix)"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"id": "DT0i29gBD23p"
},
"outputs": [],
"source": [
"programme_list=new_df['title'].to_list()"
]
},
{
"cell_type": "code",
"execution_count": 53,
"metadata": {
"id": "F-69HjWWD29i"
},
"outputs": [],
"source": [
"def recommend(title, cosine_similarity=cosine_sim):\n",
" index = programme_list.index(title) #finds the index of the input title in the programme_list.\n",
" sim_score = list(enumerate(cosine_sim[index])) #creates a list of tuples containing the similarity score and index between the input title and all other programmes in the dataset.\n",
" \n",
" #position 0 is the movie itself, thus exclude\n",
" sim_score = sorted(sim_score, key= lambda x: x[1], reverse=True)[1:11] #sorts the list of tuples by similarity score in descending order.\n",
" recommend_index = [i[0] for i in sim_score]\n",
" rec_movie = new_df['title'].iloc[recommend_index]\n",
" rec_score = [round(i[1],4) for i in sim_score]\n",
" rec_table = pd.DataFrame(list(zip(rec_movie,rec_score)), columns=['Recommended movie','Similarity(0-1)'])\n",
" return rec_table\n",
" "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1XrNWkiTUDUf"
},
"source": [
"This function calculates the cosine similarity scores between the input title and all other titles in the dataset, sorts them in descending order, and returns the top 10 movies with the highest similarity scores as recommendations."
]
},
{
"cell_type": "code",
"execution_count": 54,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
},
"executionInfo": {
"elapsed": 747,
"status": "ok",
"timestamp": 1676720468181,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "gt186LvoD3EG",
"outputId": "63b1900a-4776-4211-eb9f-899e6b0d1b38"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Recommended movie
\n",
"
Similarity(0-1)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Indiana Jones and the Raiders of the Lost Ark
\n",
"
0.3160
\n",
"
\n",
"
\n",
"
1
\n",
"
Indiana Jones and the Kingdom of the Crystal S...
\n",
"
0.1974
\n",
"
\n",
"
\n",
"
2
\n",
"
Indiana Jones and the Temple of Doom
\n",
"
0.1949
\n",
"
\n",
"
\n",
"
3
\n",
"
Monty Python and the Holy Grail
\n",
"
0.1294
\n",
"
\n",
"
\n",
"
4
\n",
"
Lincoln
\n",
"
0.1252
\n",
"
\n",
"
\n",
"
5
\n",
"
A Bridge Too Far
\n",
"
0.1225
\n",
"
\n",
"
\n",
"
6
\n",
"
The Adventures of Tintin
\n",
"
0.1087
\n",
"
\n",
"
\n",
"
7
\n",
"
The Battle of Midway
\n",
"
0.1073
\n",
"
\n",
"
\n",
"
8
\n",
"
Pawn Stars
\n",
"
0.1060
\n",
"
\n",
"
\n",
"
9
\n",
"
Patriot Games
\n",
"
0.1023
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Recommended movie Similarity(0-1)\n",
"0 Indiana Jones and the Raiders of the Lost Ark 0.3160\n",
"1 Indiana Jones and the Kingdom of the Crystal S... 0.1974\n",
"2 Indiana Jones and the Temple of Doom 0.1949\n",
"3 Monty Python and the Holy Grail 0.1294\n",
"4 Lincoln 0.1252\n",
"5 A Bridge Too Far 0.1225\n",
"6 The Adventures of Tintin 0.1087\n",
"7 The Battle of Midway 0.1073\n",
"8 Pawn Stars 0.1060\n",
"9 Patriot Games 0.1023"
]
},
"execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"recommend(\"Indiana Jones and the Last Crusade\")"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
},
"executionInfo": {
"elapsed": 573,
"status": "ok",
"timestamp": 1676720472920,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "01qpvvoZD3KD",
"outputId": "e656c77a-d864-42ac-db30-fbb846435f9c"
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Recommended movie
\n",
"
Similarity(0-1)
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
Poshter Girl
\n",
"
0.1284
\n",
"
\n",
"
\n",
"
1
\n",
"
Agent Raghav
\n",
"
0.1200
\n",
"
\n",
"
\n",
"
2
\n",
"
Anjaan: Rural Myths
\n",
"
0.1077
\n",
"
\n",
"
\n",
"
3
\n",
"
Bard of Blood
\n",
"
0.0991
\n",
"
\n",
"
\n",
"
4
\n",
"
Gunjan Saxena: The Kargil Girl
\n",
"
0.0917
\n",
"
\n",
"
\n",
"
5
\n",
"
Manusangada
\n",
"
0.0897
\n",
"
\n",
"
\n",
"
6
\n",
"
Fear Files... Har Mod Pe Darr
\n",
"
0.0866
\n",
"
\n",
"
\n",
"
7
\n",
"
Battlefield Recovery
\n",
"
0.0853
\n",
"
\n",
"
\n",
"
8
\n",
"
Back with the Ex
\n",
"
0.0844
\n",
"
\n",
"
\n",
"
9
\n",
"
Sacred Games
\n",
"
0.0841
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Recommended movie Similarity(0-1)\n",
"0 Poshter Girl 0.1284\n",
"1 Agent Raghav 0.1200\n",
"2 Anjaan: Rural Myths 0.1077\n",
"3 Bard of Blood 0.0991\n",
"4 Gunjan Saxena: The Kargil Girl 0.0917\n",
"5 Manusangada 0.0897\n",
"6 Fear Files... Har Mod Pe Darr 0.0866\n",
"7 Battlefield Recovery 0.0853\n",
"8 Back with the Ex 0.0844\n",
"9 Sacred Games 0.0841"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"recommend('Betaal')"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 363
},
"executionInfo": {
"elapsed": 14,
"status": "ok",
"timestamp": 1676720475568,
"user": {
"displayName": "Harsh Jain",
"userId": "02354714666944083536"
},
"user_tz": -330
},
"id": "j45r5r7X_8Ll",
"outputId": "b71a924c-4f1b-4c01-f412-5af2e14358b6"
},
"outputs": [
{
"data": {
"text/html": [
"