import gradio as gr from transformers import pipeline import os # Añade esto para verificar la versión de Gradio en tiempo de ejecución print(f"Gradio version at runtime: {gr.__version__}") # --- Model Loading --- MODEL_ID = "Light-Dav/sentiment-analysis-full-project" try: # Esto carga tu modelo pre-entrenado desde Hugging Face Hub # top_k=None asegura que se devuelvan las puntuaciones de todas las clases (positivo, negativo, neutral) sentiment_analyzer = pipeline("sentiment-analysis", model=MODEL_ID, top_k=None) model_loaded_successfully = True print("Sentiment analysis model loaded successfully.") except Exception as e: print(f"Error loading model: {e}") sentiment_analyzer = None model_loaded_successfully = False print("Sentiment analysis model failed to load. Please check MODEL_ID and network connection.") # --- Custom CSS for a dark look inspired by the website --- # Este CSS define todo el aspecto visual sin depender de un tema de Gradio custom_css = """ body { background-color: #121212; /* Dark background */ color: #f8f8f2; /* Light text */ } .gradio-container { box-shadow: 0 4px 8px rgba(255, 255, 255, 0.1); border-radius: 10px; overflow: hidden; background-color: #1e1e1e; /* Darker card background */ padding: 20px; margin-bottom: 20px; } h1, h2, h3 { color: #80cbc4; /* Teal/Cyan accents */ text-align: center; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; animation: fadeIn 1s ease-in-out; } .gr-button.primary { background-color: #80cbc4 !important; color: #1e1e1e !important; border-radius: 6px; transition: background-color 0.3s ease; padding: 10px 20px; } .gr-button.primary:hover { background-color: #26a69a !important; } .gradio-output { border: 1px solid #424242; border-radius: 8px; padding: 15px; margin-top: 15px; background-color: #212121; color: #f8f8f2; } .sentiment-display { text-align: center; padding: 10px; border-radius: 6px; margin-top: 10px; font-size: 1.1em; font-weight: bold; } .sentiment-positive { background-color: #388e3c; /* Darker green */ color: #e8f5e9; /* Light green */ } .sentiment-negative { background-color: #d32f2f; /* Darker red */ color: #ffebee; /* Light red */ } .sentiment-neutral { background-color: #1976d2; /* Darker blue */ color: #e3f2fd; /* Light blue */ } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /* Estilos para las etiquetas de los componentes de entrada */ gr-textbox > label { color: #80cbc4; } /* Asegúrate de que las etiquetas de salida también tengan color */ .gradio-output .label { color: #80cbc4; /* Color de acento para las etiquetas de salida */ } """ # --- Helper Function for Sentiment Interpretation --- def interpret_sentiment(label, score): emoji = "" description = "" color_class = "" if label.lower() == "positive" or label.lower() == "label_2": emoji = "😊" description = "This text expresses a **highly positive** sentiment." if score > 0.9 else "This text expresses a **positive** sentiment." color_class = "sentiment-positive" elif label.lower() == "negative" or label.lower() == "label_0": emoji = "😠" description = "This text expresses a **highly negative** sentiment." if score > 0.9 else "This text expresses a **negative** sentiment." color_class = "sentiment-negative" elif label.lower() == "neutral" or label.lower() == "label_1": emoji = "😐" description = "This text expresses a **neutral** sentiment." color_class = "sentiment-neutral" else: emoji = "❓" description = "Could not confidently determine sentiment. Unexpected label." color_class = "" return f"
{description}
" # --- Sentiment Analysis Function --- def analyze_sentiment(text): if not model_loaded_successfully: # Devuelve 3 valores: HTML, dict, string return ( "Please contact the administrator. The sentiment analysis model failed to load.
", {}, # Diccionario vacío para Confidence Scores "Model loading failed." # String de error para Raw Output ) if not text.strip(): # Devuelve 3 valores: HTML, dict, string return ( "Start typing to analyze its sentiment.
", {}, # Diccionario vacío para Confidence Scores "" # String vacío para Raw Output ) try: # Asegúrate de que la salida del pipeline es una lista de listas, y toma la primera. results = sentiment_analyzer(text)[0] # Ordenar los resultados por puntuación de confianza de mayor a menor results_sorted = sorted(results, key=lambda x: x['score'], reverse=True) # Tomar el primer elemento (el de mayor confianza) top_sentiment = results_sorted[0] label = top_sentiment['label'] score = top_sentiment['score'] # Crear un diccionario de puntuaciones de confianza para la salida de la etiqueta confidence_scores_output = {item['label']: item['score'] for item in results} # Generar el HTML para mostrar el sentimiento general overall_sentiment_display = interpret_sentiment(label, score) # ¡CAMBIO CLAVE AQUÍ! Ahora devuelve una tupla con 3 valores separados return (overall_sentiment_display, confidence_scores_output, str(results)) except Exception as e: # En caso de cualquier error durante el análisis, devuelve 3 valores de error return ( f"An error occurred during analysis: {e}
", {}, # Diccionario vacío para Confidence Scores f"Error: {e}" # String de error para Raw Output ) # --- Gradio Interface --- # Al establecer theme=None, Gradio no aplicará ningún tema predefinido. # Todo el estilo visual vendrá de nuestro `custom_css`. with gr.Blocks(css=custom_css, theme=None) as demo: gr.Markdown("Uncover the emotional tone of your English text instantly.
") with gr.Column(elem_classes="gradio-container"): text_input = gr.Textbox( lines=7, placeholder="Type your English text here...", label="Your Text", interactive=True, value="This movie was absolutely brilliant! A masterpiece of storytelling and emotion." ) analyze_btn = gr.Button("Analyze Sentiment", variant="primary") gr.Markdown("