ReiderMx's picture
Update app.py
cadebbd verified
raw
history blame
3.01 kB
import gradio as gr
import pandas as pd
from transformers import pipeline
import matplotlib.pyplot as plt
import io
import base64
# Configurar el clasificador de sentimientos multilingüe
classifier = pipeline(task="zero-shot-classification", model="facebook/bart-large-mnli")
# Función para analizar los sentimientos de una lista de textos
def analyze_sentiments(texts):
if not texts:
return "0.0%", "0.0%", "0.0%", None # Manejar el caso donde no hay textos para analizar
positive, negative, neutral = 0, 0, 0
for text in texts:
results = classifier(text, candidate_labels=["positive", "negative", "neutral"], multi_label=True)
mx = max(results['scores'])
ind = results['scores'].index(mx)
result = results['labels'][ind]
if result == "positive":
positive += 1
elif result == "negative":
negative += 1
else:
neutral += 1
total = len(texts)
positive_percent = round((positive / total) * 100, 1)
negative_percent = round((negative / total) * 100, 1)
neutral_percent = round((neutral / total) * 100, 1)
# Crear el gráfico circular
labels = 'Positivo', 'Negativo', 'Neutral'
sizes = [positive_percent, negative_percent, neutral_percent]
colors = ['#ff9999','#66b3ff','#99ff99']
fig, ax = plt.subplots()
ax.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90)
ax.axis('equal') # Para asegurar que el pie sea circular
# Guardar el gráfico en un buffer de memoria
buf = io.BytesIO()
plt.savefig(buf, format='png')
buf.seek(0)
img_base64 = base64.b64encode(buf.read()).decode('utf-8')
buf.close()
return f"{positive_percent}%", f"{negative_percent}%", f"{neutral_percent}%", img_base64
# Función para cargar el archivo CSV y analizar los primeros 100 comentarios
def analyze_sentiment_from_csv(file):
try:
df = pd.read_csv(file.name)
if 'content' not in df.columns:
raise ValueError("El archivo CSV no contiene una columna 'content'")
texts = df['content'].head(100).tolist() # Tomar solo los primeros 100 comentarios
return analyze_sentiments(texts)
except pd.errors.ParserError as e:
return f"Error al analizar el archivo CSV: {e}", "", "", None
except Exception as e:
return f"Error inesperado: {e}", "", "", None
# Configurar la interfaz de Gradio
demo = gr.Interface(
fn=analyze_sentiment_from_csv,
inputs=gr.File(file_count="single", label="Sube tu archivo CSV"), # Permitir la carga del archivo CSV
outputs=[
gr.Textbox(label="Porcentaje Positivo"),
gr.Textbox(label="Porcentaje Negativo"),
gr.Textbox(label="Porcentaje Neutro"),
gr.Image(label="Gráfico de Resultados") # Añadir un output para el gráfico
],
title="Analizador de Sentimientos V.2",
description="Porcentaje de comentarios positivos, negativos y neutrales"
)
demo.launch(share=True)