Spaces:
Runtime error
Runtime error
File size: 3,867 Bytes
28ef461 b3d8755 9a3d8a9 b3d8755 3d2732d b3d8755 3d2732d b3d8755 3d2732d b3d8755 b2185ad fedcae5 9adf504 fedcae5 3d2732d fedcae5 b2185ad fedcae5 3d2732d f83c6b6 48400b1 b84e21c 48400b1 3d2732d b84e21c 517309b b84e21c fedcae5 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 |
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(
'''
<h1 style='text-align: center; color: navy;'>Análisis de Sentimientos Amazon</h1>
<p style='text-align: center;'>Seleccione una categoría y visualice los datos y la distribución de sentimientos.</p>
'''
)
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()
|