atorojaen commited on
Commit
8d62d50
·
verified ·
1 Parent(s): 688db9a

Upload 2 files

Browse files
Files changed (2) hide show
  1. app.py +94 -0
  2. requirements.txt +7 -0
app.py ADDED
@@ -0,0 +1,94 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import torch
3
+ from transformers import AutoTokenizer, AutoModelForSequenceClassification
4
+ import re
5
+ import os
6
+ import csv
7
+
8
+ from unsloth import FastLanguageModel
9
+ model, tokenizer = FastLanguageModel.from_pretrained(
10
+ model_name = "../../models/Model_DeepSeek-R1-Distill-Llama-8B-unsloth-bnb-4bit-CoT_GPT4o-R_16-Alpha_16-LR_2e-05-Tarea_1", # Modelo base
11
+ max_seq_length = 2048,
12
+ dtype = torch.float16,
13
+ load_in_4bit = True,
14
+ )
15
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
16
+ model.eval() # <- sí se puede usar
17
+
18
+ FLAG_FILE = "flags_data/flags.csv"
19
+ os.makedirs(os.path.dirname(FLAG_FILE), exist_ok=True)
20
+
21
+ def clean_lyrics(text):
22
+ # Elimina caracteres no alfabéticos (excepto espacios y letras acentuadas comunes en español)
23
+ text = re.sub(r"[^a-zA-ZáéíóúñüÁÉÍÓÚÑÜ ]+", " ", text)
24
+ # Convierte a minúsculas
25
+ text = text.lower()
26
+ # Reduce espacios múltiples
27
+ text = re.sub(r"\s+", " ", text).strip()
28
+ return text
29
+
30
+ # Función de predicción
31
+ def detect_misogyny(text):
32
+ cleaned_text = clean_lyrics(text)
33
+ # Construir el prompt de entrada
34
+ prompt = """
35
+ ### Instruccion
36
+ Analiza la siguiente letra de canción y determina si contiene contenido misógino. Evalúa si incluye lenguaje, actitudes o mensajes que:
37
+ - Degraden o deshumanicen a las mujeres.
38
+ - Menosprecien a las mujeres de manera explícita o implícita.
39
+ - Refuercen estereotipos negativos o dañinos sobre las mujeres.
40
+ - Promuevan violencia física, emocional o sexual contra las mujeres.
41
+ Piensa cuidadosamente tu respuesta y crea paso a paso una chain of thoughts para dar una respuesta logica.
42
+ 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.
43
+
44
+ ### Letra:
45
+ {lyrics}
46
+
47
+ ### Respuesta:
48
+ <think>"""
49
+
50
+ prompt = prompt.format(lyrics=text)
51
+
52
+ inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
53
+ with torch.no_grad():
54
+ outputs = model.generate(
55
+ **inputs,
56
+ max_new_tokens=2048,
57
+ do_sample=False,
58
+ temperature=0.6
59
+ )
60
+ response = tokenizer.decode(outputs[0], skip_special_tokens=True)
61
+
62
+ # Extraer explicación entre <think>...</think>
63
+ explanation_match = re.search(r"<think>(.*?)</think>", response, re.DOTALL)
64
+ explanation = explanation_match.group(1).strip() if explanation_match else ""
65
+
66
+ # Extraer "1" o "0" después de </think>
67
+ label_match = re.search(r"</think>\s*(\d)", response)
68
+ label = label_match.group(1) if label_match else ""
69
+
70
+ # Combinar resultado final
71
+ return f"{explanation}\n\nRespuesta final: {label}" if explanation and label else response.strip()
72
+
73
+
74
+ def save_flag(user_text, response, flag_type):
75
+ # Guarda la entrada, salida y si fue correcta o incorrecta en CSV
76
+ with open(FLAG_FILE, mode="a", newline="", encoding="utf-8") as f:
77
+ writer = csv.writer(f)
78
+ writer.writerow([user_text, response, flag_type])
79
+ return f"Guardado flag: {flag_type}"
80
+
81
+ with gr.Blocks() as demo:
82
+ user_input = gr.Textbox(label="Letra de canción", lines=10)
83
+ result = gr.Textbox(label="Respuesta del modelo", lines=10)
84
+
85
+ btn_analizar = gr.Button("Analizar")
86
+ btn_correcto = gr.Button("Respuesta correcta")
87
+ btn_incorrecto = gr.Button("Respuesta incorrecta")
88
+
89
+ btn_analizar.click(fn=detect_misogyny, inputs=user_input, outputs=result)
90
+
91
+ btn_correcto.click(fn=save_flag, inputs=[user_input, result, gr.State("correcto")], outputs=result)
92
+ btn_incorrecto.click(fn=save_flag, inputs=[user_input, result, gr.State("incorrecto")], outputs=result)
93
+
94
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ gradio
2
+ torch
3
+ transformers
4
+ unsloth
5
+ accelerate
6
+ bitsandbytes
7
+ scipy # requerido por algunos backends de HF