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()