File size: 4,664 Bytes
dd8a73e a2578a5 c8bc5be 1b3df15 c8bc5be b206a0e 1b3df15 b206a0e c8bc5be b206a0e c8bc5be 1b3df15 b206a0e 1b3df15 2b8a291 2f26661 dd8a73e cf139ac 1b3df15 b206a0e bd753d4 1f443eb cc67f39 1b3df15 cc67f39 217006b 1b3df15 dd8a73e c8bc5be dd8a73e c8bc5be 2b8a291 c8bc5be cc67f39 fc26408 52cf6b3 f722506 52cf6b3 f722506 c8bc5be dd8a73e c8bc5be fe2e652 2b8a291 fbf3e03 255a40a cbd4a7d 255a40a 760a4fb fbf3e03 1b3df15 c8bc5be fbf3e03 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
import matplotlib.pyplot as plt
import io
from PIL import Image
import pickle
import pandas as pd
import gradio as gr
def generar_recomendacion(svd_model, user_id, df, genres, top=5):
# Crear un mapeo de id de película a título de película para una búsqueda más eficiente
id_to_title = df.set_index('id')['title'].to_dict()
# Obtener las recomendaciones utilizando la función `predict` del modelo SVD
recommended_movies = []
for movie_id in df['id'].unique():
predicted_rating = svd_model.predict(user_id, movie_id).est
recommended_movies.append((movie_id, predicted_rating))
# Ordenar las películas según su predicción de rating
recommended_movies.sort(key=lambda x: x[1], reverse=True)
# Obtener los títulos de las películas recomendadas y géneros
recommended_titles = [id_to_title[movie_id] for movie_id, _ in recommended_movies[:top]]
recommended_genres = []
for movie_id, _ in recommended_movies[:top]:
movie_genres = []
for genre in genres:
if df[df['id'] == movie_id][genre].values[0] == 1:
movie_genres.append(genre)
recommended_genres.append(', '.join(movie_genres))
# Crear un dataframe con las recomendaciones
recommendations_df = pd.DataFrame({
'Top': range(1, top+1),
'Películas': recommended_titles,
'Genero': recommended_genres
})
# Contar cuántas películas de cada género hay en las recomendaciones
recommended_movies_ids = [movie_id for movie_id, _ in recommended_movies[:top]]
genre_counts = df[df['id'].isin(recommended_movies_ids)][genres].sum()
# Limpiar la figura
plt.clf()
# Asignar colores específicos a cada género
genre_colors = {'Drama': 'blue', 'Comedy': 'orange', 'Horror': 'red', 'Romance': 'pink'}
colors = [genre_colors[genre] for genre in genres]
# Crear el gráfico de barras con los colores específicos
plt.style.use('ggplot')
plt.bar(genres, genre_counts, color=colors)
plt.xlabel('Género', fontsize=10)
plt.ylabel('Cantidad', fontsize=10)
plt.title('Cantidad de Películas por Género en las Recomendaciones', fontsize=12)
plt.grid(True)
plt.xticks(fontsize=10)
plt.yticks(fontsize=10)
# Guardar el gráfico como una imagen PNG en una cadena de bytes
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
# Convertir la cadena de bytes en una imagen que se puede mostrar en Gradio
im = Image.open(buf)
im = im.convert('RGB')
buf.close()
# Devolver la lista de títulos como una cadena, el gráfico como una imagen y el dataframe de recomendaciones
return ', '.join(recommended_titles), im, recommendations_df
# Leer los datos
dfmerge = pd.read_csv('merged_data7.csv')
# Cargar el modelo
with open('fc_model_svd_v2.pkl', 'rb') as file:
svd_model = pickle.load(file)
def wrap_generar_recomendacion(user_id, drama, comedy, horror, romance, top=5):
# Crear la lista de géneros de interés a partir de las casillas de verificación
genres = []
if drama: genres.append('Drama')
if comedy: genres.append('Comedy')
if horror: genres.append('Horror')
if romance: genres.append('Romance')
# Llamar a la función de recomendación y devolver los resultados como una cadena y una imagen
return generar_recomendacion(svd_model, user_id, dfmerge, genres, int(top))
demo = gr.Interface(
fn=wrap_generar_recomendacion,
inputs=[gr.inputs.Number(label="User ID"), gr.inputs.Checkbox(label="Drama"), gr.inputs.Checkbox(label="Comedy"), gr.inputs.Checkbox(label="Horror"), gr.inputs.Checkbox(label="Romance"), gr.inputs.Number(label="Top")],
outputs=[gr.outputs.Textbox(), gr.outputs.Dataframe(type='pandas'), gr.outputs.Image(type='pil')],
title = '<h1 style="text-align: center; color: #FF6347;">STREAMREC</h1>',
description = """
<p>
<center>
<font size="4" face="Arial" color="white">
Sistema de Recomendaciones Personalizadas de Películas y Series
</font>
<p><b style="color: #DC143C;">Advertencia: Ingresa el ID del usuario (user_id), selecciona los géneros de interés y la cantidad de recomendaciones que te gustaría generar.
Te mostraremos algunas películas que pueden gustarte.</b></p>
<img src="https://i.pinimg.com/564x/18/51/c8/1851c8a1adbf68564f3a29e1c5c602a0.jpg" alt="logo" width="250"/>
<img src="https://i.pinimg.com/564x/22/19/69/221969071884e659af16c78455e3afde.jpg" alt="logo" width="1000" height="95"/>
</center>
</p>
""",
allow_flagging='auto',
theme="huggingface",
favicon="https://iconos8.es/icon/OrZ75sWwdNU2/comedia",
)
demo.launch()
|