import gradio as gr from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM, BertForSequenceClassification, BertTokenizer # --- MODELO DE SENTIMIENTOS --- sentiment_tokenizer = BertTokenizer.from_pretrained("VerificadoProfesional/SaBERT-Spanish-Sentiment-Analysis") sentiment_model = BertForSequenceClassification.from_pretrained("VerificadoProfesional/SaBERT-Spanish-Sentiment-Analysis") sentiment_pipeline = pipeline("sentiment-analysis", model=sentiment_model, tokenizer=sentiment_tokenizer) # --- MODELO DE REESCRITURA GPT-2 --- rewrite_tokenizer = AutoTokenizer.from_pretrained("flax-community/gpt-2-spanish") rewrite_model = AutoModelForCausalLM.from_pretrained("flax-community/gpt-2-spanish") rewrite_pipeline = pipeline("text-generation", model=rewrite_model, tokenizer=rewrite_tokenizer) # --- FUNCIÓN PRINCIPAL --- def analizar_y_reescribir(tweet, max_retries=10): sentimiento = sentiment_pipeline(tweet)[0] etiqueta = sentimiento["label"] score = sentimiento["score"] reescritura = "" if etiqueta == "Negative": for intento in range(max_retries): prompt = f"Este es el tweet: {tweet}\nEscribe una respuesta positiva y motivadora:\n" resultado = rewrite_pipeline( prompt, max_new_tokens=60, do_sample=True, temperature=0.7, top_k=50, top_p=0.9, pad_token_id=rewrite_tokenizer.eos_token_id, return_full_text=False )[0]["generated_text"] reescritura = resultado.strip().split("\n")[0] # Revisar sentimiento de la propuesta senti2 = sentiment_pipeline(reescritura)[0] if senti2["label"] == "Positive": break else: reescritura = "No es necesario reescribir, el tweet ya es positivo o neutro." return f"{etiqueta} ({score:.2f})", reescritura # --- DOCUMENTACIÓN --- documentacion = """ # Documentación **Problema:** El problema que se quiere solucionar es buscar una medida para minimizar la toxicidad que se encuentra habitualmente en internet, sobretodo en redes sociales como twitter, Facebook, Instagram, etc. **Solución:** La solución que propongo es la de analizar los sentimientos de los distintos comentarios que se realizan, y al detectar comentarios negativos, se realice una recomendación de una frase más positiva. **Input esperado:** Texto corto en español, sin caracteres especiales ni emoticonos. **Output esperado:** -El sentimiento después del análisis que puede ser: Positive (Positivo), Neutro y Negative (Negativo). -Si de la frase del input ha salido en el análisis Positive, saldrá una frase de texto genérica, si en cambio el análisis da Negative, se va a entregar una frase generada de forma dinámica más positiva y motivadora. **Modelos usados:** -VerificadoProfesional/SaBERT-Spanish-Sentiment-Analysis: Este modelo es de Text Classification, ha sido entrenado con un dataset de 11.500 tweets en español de distintas regiones, está basado en BERT y clasifica texto en tres categorías distintas: Positive (Positivo), Neutro y Negative (Negativo). -flax-community/gpt-2-spanish: Este modelo es de Text Generation, es un tipo GPT-2 entrenado en corpus de español, y es capaz de generar texto coherente en español a partir de un prompt inicial. **Limitaciones:** Las limitaciones que se puede encontrar son que va a funcionar mal para otros idiomas que no sean español, puede confundir el sarcasmo o el lenguaje informal llevando a un análisis erróneo de la frase introducida, la calidad del output es relativa ya que puede que las frases generadas no sean del todo coherentes o motivadoras y que puede que el output genere una respuesta que se salga del límite de longitud esperada por lo que aparezca cortada. **Rendimiento:** El rendimiento del programa es bastante rápido, entre ambos modelos llegan a tardar una media de 7-8 segundos en completar tanto el análisis como la escritura del mensaje motivador. """ # --- INTERFAZ GRADIO --- with gr.Blocks(title="Análisis de Tweets Negativos") as demo: gr.Markdown("## Analizador y Reescritor de Tweets Negativos") tweet_input = gr.Textbox(label="Introduce un tweet", placeholder="Por ejemplo: Este servicio es terrible y no lo recomiendo.") output_sentimiento = gr.Textbox(label="Sentimiento detectado en el tweet") output_reescritura = gr.Textbox(label="Frase positiva o motivadora") boton = gr.Button("Analizar y Reescribir") boton.click(fn=analizar_y_reescribir, inputs=tweet_input, outputs=[output_sentimiento, output_reescritura]) gr.Examples( examples=[ ["Este producto es una pérdida de dinero y tiempo."], ["No volveré a este restaurante."], ["La atención fue lenta y pésima."], ["El personal fue muy amable y servicial."] ], inputs=tweet_input ) gr.Markdown(documentacion) # Aquí aparece la documentación abajo demo.launch()