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 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() as demo: gr.Markdown( '''

Análisis de Sentimientos Amazon

Seleccione una categoría y visualice los datos y la distribución de sentimientos.

''' ) with gr.Row(): category = gr.Dropdown(choices=list(category_to_file_path.keys()), label="Seleccione una categoría") with gr.Column(): show_button = gr.Button("Mostrar Datos") plot_button = gr.Button("Graficar Distribución de Sentimientos") with gr.Column(): output_df = gr.Dataframe() 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()