File size: 4,074 Bytes
28ef461
b3d8755
9a3d8a9
b3d8755
 
 
7744c78
b3d8755
 
3d2732d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b3d8755
3d2732d
 
 
 
 
b3d8755
3d2732d
 
 
 
b3d8755
b2185ad
 
 
 
 
 
 
fedcae5
 
9adf504
fedcae5
 
 
 
 
3d2732d
 
fedcae5
b2185ad
fedcae5
 
 
 
 
 
 
 
3d2732d
 
 
 
f83c6b6
48400b1
397e334
 
b84e21c
 
43b4acc
b84e21c
 
397e334
 
 
 
 
 
 
43b4acc
397e334
 
3d2732d
 
fedcae5
b3d8755
 
 
9b4ec2e
28ef461
 
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
import gradio as gr
import pandas as pd
import matplotlib.pyplot as plt
from transformers import pipeline

# Inicializa la pipeline de análisis de sentimientos
# Utiliza como base el modelo distilbert-base-uncased-finetuned-sst-2-english
sentiment_pipeline = pipeline("sentiment-analysis")

# Función que toma un Dataframe y crea un gráfico visual con matplotlib
def plot_sentiment_distribution(df_category):
    sentiment_counts = df_category['sentiment'].value_counts()
    fig, ax = plt.subplots()
    sentiment_counts.plot(kind='bar', ax=ax)
    ax.set_title("Distribución de Sentimientos")
    ax.set_xlabel("Sentimiento")
    ax.set_ylabel("Número de reseñas")
    return fig

# Mapeo de categorías a nombres de archivos
category_to_file_path = {
    'Fashion': 'AMAZON_FASHION_5.json.gz',
    'Appliances': 'Appliances_5.json.gz',
    'Gift Cards': 'Gift_Cards_5.json.gz',
    'Magazine subscriptions': 'Magazine_Subscriptions_5.json.gz',
    'All beauty': 'All_Beauty_5.json.gz'
}

# Función para cargar los datos por categoría
def load_reviews(category):
    # Asegúrate de que la categoría proporcionada es válida
    if category not in category_to_file_path:
        raise ValueError("Categoría no encontrada. Asegúrate de que la categoría sea correcta.")

    file_name = category_to_file_path[category]
    file_path = f"{file_name}"  # Asegúrate de que este sea el path correcto a tus archivos
    df = pd.read_json(file_path, lines=True, compression='gzip')
    return df

def analyze_sentiment(text):
    # Verifica si el texto es una cadena de texto (string)
    if isinstance(text, str):
        return sentiment_pipeline(text[:512])[0]['label']
    else:
        return "Unknown"  # O algún valor por defecto para datos no procesables

def plot_pie_chart(sentiment_counts):
    labels = sentiment_counts.keys()
    sizes = sentiment_counts.values
    fig, ax = plt.subplots()
    ax.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
    ax.axis('equal')  # Equal aspect ratio ensures that pie is drawn as a circle.
    return fig

def sentiment_counts_by_category(category):
    df_category = load_reviews(category)
    df_category = df_category.head(30)  # Limita el análisis a las primeras 30 reseñas
    df_category['sentiment'] = df_category['reviewText'].apply(analyze_sentiment)
    # Conteo de sentimientos
    sentiment_counts = df_category['sentiment'].value_counts(normalize=True)  # Obtiene porcentajes
    # Genera la gráfica de barras para la distribución de sentimientos
    bar_fig = plot_sentiment_distribution(df_category)
    # Genera la gráfica de pastel para la distribución porcentual de sentimientos
    pie_fig = plot_pie_chart(sentiment_counts)
    # Retorna ambas figuras
    return bar_fig, pie_fig

def show_first_five(category):
    df_category = load_reviews(category)
    return df_category.head(5)  # Muestra las primeras 5 filas del DataFrame de la categoría

# Crear la interfaz usando gr.Blocks
with gr.Blocks(css='style.css') as demo:
    gr.Markdown("<font color=red size=10><center>Sentiment analysis: Amazon </center></font>")
    gr.Markdown(
    '''
    <p style='text-align: center;'>Seleccione una categoría de producto comprado y visualice la distribución de sentimientos en las reviews para esa categoría.</p>
    '''
    )
    with gr.Column():
        with gr.Row():
            with gr.Column():
                category = gr.Dropdown(choices=list(category_to_file_path.keys()), label="Seleccione una categoría")
                show_button = gr.Button("Mostrar Datos")
                plot_button = gr.Button("Graficar Distribución de Sentimientos")
                output_df = gr.Dataframe()
            with gr.Column():
                output_bar_plot = gr.Plot()
                output_pie_plot = gr.Plot()

    show_button.click(show_first_five, inputs=category, outputs=output_df)
    plot_button.click(sentiment_counts_by_category, inputs=category, outputs=[output_bar_plot, output_pie_plot])

# Lanza la interfaz
if __name__ == "__main__":
    demo.launch()