Spaces:
Runtime error
Runtime error
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() | |