File size: 4,674 Bytes
dd8a73e
 
 
a2578a5
 
 
 
c8bc5be
3ab02cd
 
c8bc5be
3ab02cd
 
07586d5
3ab02cd
b206a0e
3ab02cd
b206a0e
 
c8bc5be
3ab02cd
b206a0e
c8bc5be
3ab02cd
b206a0e
2f26661
dd8a73e
cf139ac
3ab02cd
b206a0e
bd753d4
 
1f443eb
cc67f39
 
 
 
3ab02cd
 
cc67f39
3ab02cd
cc67f39
217006b
 
 
3ab02cd
 
 
 
 
dd8a73e
 
 
 
 
c8bc5be
dd8a73e
 
 
 
c8bc5be
3ab02cd
 
c8bc5be
cc67f39
fc26408
52cf6b3
f722506
 
52cf6b3
f722506
 
3ab02cd
c8bc5be
 
 
 
 
 
 
 
dd8a73e
c8bc5be
 
3ab02cd
c8bc5be
 
fe2e652
3ab02cd
fbf3e03
255a40a
 
 
 
 
 
 
 
 
3ab02cd
255a40a
 
 
760a4fb
fbf3e03
3ab02cd
 
 
c8bc5be
 
3ab02cd
 
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
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):
    # Filtrar las películas que correspondan al usuario y a los géneros de interés
    df_filtered = df[(df['user_id'] == user_id) & df[genres].any(axis=1)]

    # 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_filtered.set_index('id')['title'].to_dict()

    # Obtener las recomendaciones utilizando la función `predict` del modelo SVD
    recommended_movies = []
    for movie_id in df_filtered['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
    recommended_titles = [id_to_title[movie_id] for movie_id, _ in recommended_movies[:top]]

    # 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_filtered[df_filtered['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')  # establece el estilo del gráfico
    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)  # agrega una cuadrícula
    plt.xticks(fontsize=10)  # ajusta el tamaño de la fuente de los ticks del eje x
    plt.yticks(fontsize=10)  # ajusta el tamaño de la fuente de los ticks del eje y

    

    # 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 y el gráfico como una imagen
    return ', '.join(recommended_titles), im


# 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)

# Modificar la función wrap_generar_recomendacion para devolver una imagen también
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))

# Modificar la interfaz de Gradio para mostrar una imagen también
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.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="200"/>
</center>
</p>
""",
    
    allow_flagging='auto',
    theme="huggingface",  # establece un tema predefinido
    favicon="https://iconos8.es/icon/OrZ75sWwdNU2/comedia",  # establece tu favicon personalizado

)

# Lanzar la interfaz
demo.launch()