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