Recomendador de películas basado en el resumen de la trama usando vectorización TF-IDF y similitud de coseno

La recomendación de películas a los usuarios se puede hacer de varias maneras mediante el filtrado basado en contenido y enfoques de filtrado colaborativo. El enfoque de filtrado basado en el contenido se centra principalmente en la similitud de los elementos, es decir, la similitud en las películas, mientras que el filtrado colaborativo se centra en establecer una relación entre diferentes usuarios de opciones similares al ver películas.
Según la trama de una película que el usuario vio en el pasado, se pueden recomendar al usuario películas con una trama similar. Este enfoque se incluye en el filtrado basado en el contenido, ya que las recomendaciones se realizan solo en función de la actividad anterior del usuario.

Conjunto de datos utilizado : un conjunto de datos de Kaggle que se extrajo de wikipedia y contiene un resumen de la trama de las películas.

Código: Lectura del conjunto de datos:

# Give the location of the dataset
path_dataset ="" 
  
import pandas as pd
data = pd.read_csv(path_dataset)
data.head()

Salida: hay películas que pertenecen a diferentes idiomas/origen en el conjunto de datos en cantidades variables.

Código:

len(data)
  
import numpy as np
np.unique(data['Origin / Ethnicity']
  
len(data.loc[data['Origin / Ethnicity']=='American'])
len(data.loc[data['Origin / Ethnicity']=='British'])

Producción:


34886    #Length of the dataset (Total number of rows/movies)

#Movies of various origins present in the dataset.
array(['American', 'Assamese', 'Australian', 'Bangladeshi', 'Bengali',
       'Bollywood', 'British', 'Canadian', 'Chinese', 'Egyptian',
       'Filipino', 'Hong Kong', 'Japanese', 'Kannada', 'Malayalam',
       'Malaysian', 'Maldivian', 'Marathi', 'Punjabi', 'Russian',
       'South_Korean', 'Tamil', 'Telugu', 'Turkish'], dtype=object)

17377    #Number of movies of American origin
3670     #Number of movies of British origin

De las diferentes columnas en el conjunto de datos, solo las columnas requeridas son el nombre de la película y la trama de la película. Teniendo en cuenta un subconjunto del conjunto de datos anterior, solo usamos películas estadounidenses y británicas. El subconjunto de datos consta de 21047 películas.

Código:

# Concatenating American and British movies
df1 = pd.DataFrame(data.loc[data['Origin / Ethnicity']=='American'])
df2 = pd.DataFrame(data.loc[data['Origin / Ethnicity']=='British'])
data = pd.concat([df1, df2], ignore_index = True)
  
len(data)
  
finaldata = data[["Title", "Plot"]]          # Required columns - Title and movie plot
finaldata = finaldata.set_index('Title')    # Setting the movie title as index
  
finaldata.head(10)
finaldata["Plot"][0]

Producción:


21047    #Number of rows in the new dataset

# First 10 rows of the new dataset


#Plot of the first movie
A bartender is working at a saloon, serving drinks to customers. After he fills a stereotypically Irish man's bucket with beer, Carrie Nation and her followers burst inside. They assault the Irish man, pulling his hat over his eyes and then dumping the beer over his head. The group then begin wrecking the bar, smashing the fixtures, mirrors, and breaking the cash register. The bartender then sprays seltzer water in Nation's face before a group of policemen appear and order everybody to leave.[1]

Código: aplicación de técnicas de procesamiento de lenguaje natural para preprocesar las tramas de la película:

import nltk
nltk.download('punkt')
nltk.download('averaged_perceptron_tagger')
nltk.download('wordnet')
  
  
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
  
from nltk.corpus import stopwords
nltk.download('stopwords')
stop_words = set(stopwords.words('english'))
  
VERB_CODES = {'VB', 'VBD', 'VBG', 'VBN', 'VBP', 'VBZ'}

Pasos de preprocesamiento de datos:

  • El resumen de la trama se convierte en tokens, utilizando el tokenizador de palabras NLTK.
  • Usando el etiquetador POS NLTK, se extraen las etiquetas POS de los tokens.
  • La lematización se considera mejor que la lematización, porque la lematización hace un análisis morfológico de las palabras.
  • La lematización se realiza eliminando las terminaciones flexivas de los tokens, a través del lematizador NLTK Word-net.
  • Las palabras comunes se eliminan para aumentar la importancia de los tokens. Desde la biblioteca NLTK, las palabras vacías en inglés se descargan y eliminan de las tramas de la película.
  • Pocas contracciones generales se reemplazan con palabras originales.

Código:

def preprocess_sentences(text):
  text = text.lower()
  temp_sent =[]
  words = nltk.word_tokenize(text)
  tags = nltk.pos_tag(words)
  for i, word in enumerate(words):
      if tags[i][1] in VERB_CODES: 
          lemmatized = lemmatizer.lemmatize(word, 'v')
      else:
          lemmatized = lemmatizer.lemmatize(word)
      if lemmatized not in stop_words and lemmatized.isalpha():
          temp_sent.append(lemmatized)
          
  finalsent = ' '.join(temp_sent)
  finalsent = finalsent.replace("n't", " not")
  finalsent = finalsent.replace("'m", " am")
  finalsent = finalsent.replace("'s", " is")
  finalsent = finalsent.replace("'re", " are")
  finalsent = finalsent.replace("'ll", " will")
  finalsent = finalsent.replace("'ve", " have")
  finalsent = finalsent.replace("'d", " would")
  return finalsent
  
finaldata["plot_processed"]= finaldata["Plot"].apply(preprocess_sentences)
finaldata.head()

Datos después del preprocesamiento:

TF-IDF (TERM FREQUENCY-INVERSE DOCUMENT FREQUENCY) Vectorización:

  1. Frecuencia de términos (TF): el número de veces que aparece una palabra en un documento dividido por el número total de palabras en el documento. Cada documento tiene su propia frecuencia de término.
  2. Frecuencia de datos inversa (IDF): el registro del número de documentos dividido por el número de documentos que contienen la palabra. La frecuencia de datos inversa determina el peso de las palabras raras en todos los documentos del corpus.

Scikit-Learn proporciona un transformador llamado TfidfVectorizer en el módulo llamado feature_extraction.text para vectorizar con puntajes TF–IDF.

Similitud de coseno:
las tramas de la película se transforman como vectores en un espacio geométrico. Por lo tanto, el ángulo entre dos vectores representa la cercanía de esos dos vectores. La similitud del coseno calcula la similitud midiendo el coseno del ángulo entre dos vectores.

Código:

from sklearn.feature_extraction.text import TfidfVectorizer
  
# Vectorizing pre-processed movie plots using TF-IDF
tfidfvec = TfidfVectorizer()
tfidf_movieid = tfidfvec.fit_transform((finaldata["plot_processed"]))
  
# Finding cosine similarity between vectors
from sklearn.metrics.pairwise import cosine_similarity
cos_sim = cosine_similarity(tfidf_movieid, tfidf_movieid)

Código: función de recomendación de construcción que ofrece las 10 mejores películas similares:

# Storing indices of the data
indices = pd.Series(finaldata.index)
  
def recommendations(title, cosine_sim = cos_sim):
    recommended_movies = []
    index = indices[indices == title].index[0]
    similarity_scores = pd.Series(cosine_sim[index]).sort_values(ascending = False)
    top_10_movies = list(similarity_scores.iloc[1:11].index)
    for i in top_10_movies:
        recommended_movies.append(list(finaldata.index)[i])
    return recommended_movies

Código: usando la función anterior para obtener recomendaciones basadas en gráficos:

recommendations("Harry Potter and the Chamber of Secrets")

Producción:


Recommendations for the movie "Harry Potter and the Chamber of Secrets"

["Harry Potter and the Sorcerer's Stone",
 "Harry Potter and the Philosopher's Stone",
 'Harry Potter and the Deathly Hallows: Part I',
 'Harry Potter and the Deathly Hallows: Part 1',
 'Harry Potter and the Half-Blood Prince',
 'Harry Potter and the Deathly Hallows: Part II',
 'Harry Potter and the Deathly Hallows: Part 2',
 'Harry Potter and the Order of the Phoenix',
 'Harry Potter and the Goblet of Fire',
 'Harry Potter and the Prisoner of Azkaban']

Código:

recommendations("Ice Age")

Producción:


Recommendations for the movie "Ice Age"

['Ice Age: The Meltdown',
 'Ice Age: Dawn of the Dinosaurs',
 'The Wrong Man',
 'Ice Age: Continental Drift',
 'The Buttercup Chain',
 'Ice Age: Collision Course',
 'Runaway Train',
 'Corrina, Corrina',
 'Sid and Nancy',
 'Zorro, the Gay Blade']

Código:

recommendations("Blackmail")

Producción:

Recommendations for the movie "Blackmail"

['Checkpoint',
 'Odds Against Tomorrow',
 'The Beast with Five Fingers',
 'Fruitvale Station',
 'The Exile',
 'The Black Swan',
 'Small Town Gay Bar',
 'Eye of the Cat',
 'Blown Away',
 'Brenda Starr, Reporter']

Publicación traducida automáticamente

Artículo escrito por manmayi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *