File size: 2,300 Bytes
31fa14f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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
            # Si no salió positivo, sigue al siguiente intento

    return f"{etiqueta} ({score:.2f})", reescritura

# --- INTERFAZ GRADIO ---
gr.Interface(
    fn=analizar_y_reescribir,
    inputs=gr.Textbox(label="Introduce un tweet", placeholder="Por ejemplo: Este servicio es terrible y no lo recomiendo."),
    outputs=[
        gr.Textbox(label="Sentimiento detectado en el tweet"),
        gr.Textbox(label="Frase positiva o motivadora")
    ],
    title="Análisis de Tweets Negativos",
).launch()