1 Librerias de R

library(reticulate)

2 Librerias de Python

import numpy as np
import pandas as pd
from sklearn.feature_extraction import text
from sklearn.metrics.pairwise import cosine_similarity

3 Data de Kaggle

Link: https://www.kaggle.com/datasets/satpreetmakhija/netflix-movies-and-tv-shows-2021

data = pd.read_csv("netflixData.csv")

4 Tranformación de los datos

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 text

Aplicació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

5 Similitud de coseno

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]

6 Aplicación de la función de recomendación

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