rovargasc's picture
Update app.py
02f7ea7 verified
import gradio as gr
from transformers import pipeline
import pandas as pd
import numpy as np
# Cargar el modelo de análisis de sentimientos
pipeline_classification = pipeline(
"text-classification",
model="pysentimiento/robertuito-sentiment-analysis"
)
def analyze_sentiment(text):
"""
Analiza el sentimiento del texto ingresado
"""
if not text.strip():
return "Por favor ingresa un texto para analizar."
# Realizar el análisis de sentimientos
result = pipeline_classification(text)
# Formatear la respuesta
sentiment = result[0]['label']
confidence = result[0]['score']
# Traducir las etiquetas al español
sentiment_map = {
'POS': 'Positivo',
'NEG': 'Negativo',
'NEU': 'Neutral'
}
sentiment_spanish = sentiment_map.get(sentiment, sentiment)
return f"**Sentimiento:** {sentiment_spanish}\n**Confianza:** {confidence:.4f}"
def analyze_batch(file):
"""
Analiza sentimientos de un archivo CSV
"""
if file is None:
return "Por favor sube un archivo CSV."
try:
# Leer el archivo CSV
df = pd.read_csv(file.name)
# Verificar que tenga una columna 'text'
if 'text' not in df.columns:
return "El archivo CSV debe tener una columna llamada 'text'."
# Analizar cada texto
results = []
for text in df['text']:
if pd.isna(text):
results.append({'sentiment': 'N/A', 'confidence': 0})
else:
result = pipeline_classification(str(text))
results.append({
'sentiment': result[0]['label'],
'confidence': result[0]['score']
})
# Agregar resultados al DataFrame
df['sentiment'] = [r['sentiment'] for r in results]
df['confidence'] = [r['confidence'] for r in results]
# Guardar el resultado
output_file = "sentiment_analysis_results.csv"
df.to_csv(output_file, index=False)
return output_file
except Exception as e:
return f"Error procesando el archivo: {str(e)}"
# Crear la interfaz de Gradio
with gr.Blocks(title="Análisis de Sentimientos") as demo:
gr.Markdown("""
# 🎭 Análisis de Sentimientos en Español
Esta aplicación utiliza el modelo **RoBERTuito** de pysentimiento para analizar el sentimiento de textos en español.
## Características:
- ✨ Análisis individual de textos
- 📄 Análisis en lote desde archivos CSV
- 🎯 Optimizado para español e idiomas de América Latina
""")
with gr.Tabs():
with gr.TabItem("📝 Análisis Individual"):
gr.Markdown("### Ingresa un texto para analizar su sentimiento:")
with gr.Row():
with gr.Column():
text_input = gr.Textbox(
label="Texto a analizar",
placeholder="Ejemplo: Tengo un nuevo empleo :D",
lines=3
)
analyze_btn = gr.Button("🔍 Analizar Sentimiento", variant="primary")
with gr.Column():
result_output = gr.Markdown(label="Resultado")
# Ejemplos predefinidos
gr.Examples(
examples=[
["Tengo un nuevo empleo :D"],
["Estoy muy triste porque perdí mi trabajo"],
["El clima está bien hoy"],
["¡Qué hermoso día para salir!"],
["No me gusta esta comida para nada"]
],
inputs=text_input,
outputs=result_output,
fn=analyze_sentiment
)
with gr.TabItem("📊 Análisis en Lote"):
gr.Markdown("""
### Sube un archivo CSV para analizar múltiples textos
**Formato requerido:** El archivo CSV debe tener una columna llamada `text` con los textos a analizar.
""")
with gr.Row():
file_input = gr.File(
label="Subir archivo CSV",
file_types=[".csv"]
)
batch_btn = gr.Button("📈 Analizar Archivo", variant="primary")
file_output = gr.File(label="Descargar resultados")
# Conectar eventos
analyze_btn.click(
fn=analyze_sentiment,
inputs=text_input,
outputs=result_output
)
batch_btn.click(
fn=analyze_batch,
inputs=file_input,
outputs=file_output
)
gr.Markdown("""
---
### 📖 Acerca del Modelo
Este análisis utiliza **RoBERTuito**, un modelo basado en RoBERTa entrenado específicamente en datos de redes sociales
en español y portugués. Es especialmente efectivo para:
- Textos informales y de redes sociales
- Contenido en español de América Latina
- Detección de ironía y sarcasmo
**Etiquetas de sentimiento:**
- **POS**: Sentimiento positivo
- **NEG**: Sentimiento negativo
- **NEU**: Sentimiento neutral
*Modelo: pysentimiento/robertuito-sentiment-analysis*
""")
# Lanzar la aplicación
if __name__ == "__main__":
demo.launch()