library(reticulate)import numpy as np
import pandas as pd
from sklearn.feature_extraction import text
from sklearn.metrics.pairwise import cosine_similarityLink: https://www.kaggle.com/datasets/satpreetmakhija/netflix-movies-and-tv-shows-2021
data = pd.read_csv("netflixData.csv")Verificamos los nulos
data.isnull().sum()## Show Id 0
## Title 0
## Description 0
## Director 2064
## Genres 0
## Cast 530
## Production Country 559
## Release Date 3
## Rating 4
## Duration 3
## Imdb Score 608
## Content Type 0
## Date Added 1335
## dtype: int64
Seleccionamos la variables a usar
data = data[[
"Title", "Description",
"Content Type", "Genres"
]]Eliminamos filas con valores nulos
data = data.dropna()Vista previa de los datos
Limpieza de los nombres peliculas (title)
import nltk
import re# stopwords
nltk.download('stopwords')## [nltk_data] Downloading package stopwords to
## [nltk_data] C:\Users\Tama\AppData\Roaming\nltk_data...
## [nltk_data] Package stopwords is already up-to-date!
## True
stemmer = nltk.SnowballStemmer("english")
from nltk.corpus import stopwords
import string
stopword = set(stopwords.words("english"))Definimos función de limpieza
def clean(text):
text = str(text).lower()
text = re.sub('\[.*?\]', '', text)
text = re.sub('https?://\S+|www\.\S+', '', text)
text = re.sub('<.*?>+', '', text)
text = re.sub('[%s]' % re.escape(string.punctuation), '', text)
text = re.sub('\n', '', text)
text = re.sub('\w*\d\w*', '', text)
text = [word for word in text.split(' ') if word not in stopword]
text=" ".join(text)
text = [stemmer.stem(word) for word in text.split(' ')]
text=" ".join(text)
return textAplicación de función limpieza
data["Title"] = data["Title"].apply(clean)data.Title.sample(10)## 3272 dead ex
## 4587 terrac hous tokyo
## 4288 sit limbo
## 2067 hire woman
## 64 balloon
## 3617 panipat great betray
## 596 bella bulldog
## 3277 first first love
## 2868 luka chuppi
## 5203 smurf
## Name: Title, dtype: object
Sirve para encontrar similitudes. Lo hace calculando la puntuación de similitud entre los vectores, con los ángulos entre si. El rango de similitudes está entre 0 y 1. Si el valor de la puntuación de similitud entre dos vectores es 1, significa que existe una mayor similitud entre los dos vectores y 0 cuando no hay similitud entre los dos vectores.
Cuando el puntaje de similitud es uno, el ángulo entre dos vectores es 0 y cuando el puntaje de similitud es 0, el ángulo entre dos vectores es 90 grados.
feature = data["Genres"].tolist()
tfidf = text.TfidfVectorizer(input=feature, stop_words="english")
tfidf_matrix = tfidf.fit_transform(feature)
similarity = cosine_similarity(tfidf_matrix)Título como índice
indices = pd.Series(data.index,
index=data['Title']).drop_duplicates()Función de recomendación
def netFlix_recommendation(title, similarity = similarity):
index = indices[title]
similarity_scores = list(enumerate(similarity[index]))
similarity_scores = sorted(similarity_scores, key=lambda x: x[1], reverse=True)
similarity_scores = similarity_scores[0:10]
movieindices = [i[0] for i in similarity_scores]
return data['Title'].iloc[movieindices]netFlix_recommendation("stranger thing")## 978 chill adventur sabrina
## 3406 nightflyer
## 4438 stranger thing
## 2941 manifest
## 4605
## 5085 oa
## 5285 vampir diari
## 5956 zoo
## 5267 umbrella academi
## 5715 warrior nun
## Name: Title, dtype: object