File size: 5,075 Bytes
f646fff
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
01081a5
f646fff
 
 
01081a5
 
 
 
 
3442b9b
 
44d275f
3442b9b
01081a5
 
 
 
 
44d275f
 
01081a5
 
44d275f
3442b9b
01081a5
 
3442b9b
01081a5
 
3442b9b
01081a5
 
f646fff
01081a5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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()