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