Rafmiggonpaz's picture
Update app.py
44d275f verified
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()