Spaces:
Runtime error
Runtime error
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() | |