File size: 3,788 Bytes
8d62d50
 
1a1813d
8d62d50
 
 
b701d0c
1a1813d
5be1c50
b701d0c
5d94b8c
1a1813d
 
 
 
 
8d62d50
bf61c9e
 
 
8d62d50
 
 
 
1a1813d
8d62d50
1a1813d
8d62d50
1a1813d
8d62d50
 
 
1a1813d
8d62d50
 
1a1813d
8d62d50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1a1813d
8d62d50
 
 
 
 
 
 
 
 
 
 
 
1a1813d
8d62d50
 
 
1a1813d
8d62d50
 
 
1a1813d
8d62d50
 
1a1813d
8d62d50
1a1813d
8d62d50
 
 
 
 
 
1a1813d
 
8d62d50
 
1a1813d
8d62d50
1a1813d
8d62d50
 
1a1813d
 
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
import gradio as gr
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import re
import os
import csv
from huggingface_hub import login
from unsloth import FastLanguageModel

login(os.environ["HF_TOKEN"])

model, tokenizer = FastLanguageModel.from_pretrained(
    model_name = "atorojaen/DeepSeek-R1-MiSonGyny",   # Modelo base
    max_seq_length = 2048,
    dtype = torch.float16,
    load_in_4bit = True,
)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model.eval()

FLAG_FILE = "flags_data/flags.csv"
os.makedirs(os.path.dirname(FLAG_FILE), exist_ok=True)

def clean_lyrics(text):
    # Elimina caracteres no alfabéticos (excepto espacios y letras acentuadas comunes en español)
    text = re.sub(r"[^a-zA-ZáéíóúñüÁÉÍÓÚÑÜ ]+", " ", text)
    # Convierte a minúsculas
    text = text.lower()
    # Reduce espacios múltiples
    text = re.sub(r"\s+", " ", text).strip()
    return text

# Función de predicción
def detect_misogyny(text):
    cleaned_text = clean_lyrics(text)
    # Construir el prompt de entrada
    prompt = """

            ### Instruccion

            Analiza la siguiente letra de canción y determina si contiene contenido misógino. Evalúa si incluye lenguaje, actitudes o mensajes que:

              - Degraden o deshumanicen a las mujeres.

              - Menosprecien a las mujeres de manera explícita o implícita.

              - Refuercen estereotipos negativos o dañinos sobre las mujeres.

              - Promuevan violencia física, emocional o sexual contra las mujeres.

            Piensa cuidadosamente tu respuesta y crea paso a paso una chain of thoughts para dar una respuesta logica.

            Responde únicamente con "1" si la letra es misógina o con "0" si la letra no es misógina. No proporciones ninguna explicación ni texto adicional.



            ### Letra:

            {lyrics}



            ### Respuesta:

            <think>"""
    
    prompt = prompt.format(lyrics=text)

    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=2048,
            do_sample=False,
            temperature=0.6
        )
    response = tokenizer.decode(outputs[0], skip_special_tokens=True)

    # Extraer explicación entre <think>...</think>
    explanation_match = re.search(r"<think>(.*?)</think>", response, re.DOTALL)
    explanation = explanation_match.group(1).strip() if explanation_match else ""

    # Extraer "1" o "0" después de </think>
    label_match = re.search(r"</think>\s*(\d)", response)
    label = label_match.group(1) if label_match else ""

    # Combinar resultado final
    return f"{explanation}\n\nRespuesta final: {label}" if explanation and label else response.strip()


def save_flag(user_text, response, flag_type):
    # Guarda la entrada, salida y si fue correcta o incorrecta en CSV
    with open(FLAG_FILE, mode="a", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow([user_text, response, flag_type])
    return f"Guardado flag: {flag_type}"

with gr.Blocks() as demo:
    gr.Markdown("# Detector de misoginia en letras de canciones")  # Título principal
    gr.Markdown("Este sistema analiza letras de canciones en español y detecta contenido misógino utilizando el modelo DeepSeek R1 entrenado.")
    user_input = gr.Textbox(label="Letra de canción", lines=10)
    result = gr.Textbox(label="Respuesta del modelo", lines=10)
    
    btn_analizar = gr.Button("Analizar")
    
    btn_analizar.click(fn=detect_misogyny, inputs=user_input, outputs=result)


demo.launch()