File size: 7,711 Bytes
35f4d2f
 
5fa6aaf
443302c
cf422eb
4fc8d29
35f4d2f
5fa6aaf
47a752f
5fa6aaf
 
 
 
 
 
 
 
 
 
 
 
 
cf422eb
 
5fa6aaf
 
 
cf422eb
 
5fa6aaf
 
4fc8d29
 
 
 
 
fc02561
 
4fc8d29
fc02561
4fc8d29
 
 
 
 
 
 
 
fc02561
 
 
 
4fc8d29
 
5fa6aaf
4fc8d29
5fa6aaf
4fc8d29
fc02561
 
 
 
4fc8d29
 
 
 
 
 
fc02561
4fc8d29
fc02561
 
 
 
4fc8d29
fc02561
 
 
4fc8d29
fc02561
 
 
 
 
 
 
4fc8d29
fc02561
 
 
 
 
5fa6aaf
 
4fc8d29
 
fc02561
4fc8d29
fc02561
 
4fc8d29
fc02561
4fc8d29
fc02561
4fc8d29
 
 
fc02561
 
 
 
 
 
 
 
 
 
 
4fc8d29
 
 
 
fc02561
 
5fa6aaf
fc02561
35f4d2f
e4fc2bb
5fa6aaf
 
 
 
 
81d43d6
5fa6aaf
e4fc2bb
81d43d6
e4fc2bb
 
76618c6
 
 
81d43d6
 
76618c6
81d43d6
 
 
 
 
 
 
 
76618c6
81d43d6
 
 
76618c6
 
 
 
81d43d6
 
 
 
 
 
 
 
 
76618c6
e4fc2bb
4fc8d29
e4fc2bb
4fc8d29
35f4d2f
76618c6
5fa6aaf
 
fc02561
 
 
f55fff3
4fc8d29
fc02561
4fc8d29
fc02561
35f4d2f
 
5fa6aaf
 
 
 
 
4fc8d29
e4fc2bb
5fa6aaf
 
cf422eb
5fa6aaf
 
 
 
 
fc02561
 
f55fff3
5fa6aaf
35f4d2f
5fa6aaf
bb33952
5fa6aaf
47a752f
e08472e
5fa6aaf
 
 
e08472e
4fc8d29
 
 
 
ab275e0
4fc8d29
 
 
 
e4fc2bb
5fa6aaf
35f4d2f
 
5fa6aaf
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
import gradio as gr
from huggingface_hub import InferenceClient
from transformers import pipeline
from transformers import AutoTokenizer, AutoModelForCausalLM
import os
import torch

title = "Generador y clasificador de coloquialismos cubanos"
description = "Genera texto con el dialecto cubano y detecta expresiones coloquiales cubanas."
article = """
## Modelo:
Se usa el somosnlp-hackathon-2026/patriae-cuban-dialect-model.

## Fine-tuning:
Se utilizó el dataset somosnlp-hackathon-2026/patriae-cuba-literature-dataset para hacer fine-tuning del modelo gia-uh/cecilia-2b-instruct-v1.

## Participantes del equipo Patriae en SomosNLP 2026:
* **Carlos Luis Barnés Infante (https://huggingface.co/blacknoize404)**
* **Yisel Clavel Quintero (https://huggingface.co/clavel)**
* **Dionis Lopez (https://huggingface.co/inoid)**
"""

HF_TOKEN = os.environ.get("HF_TOKEN", None)

# Cargar el modelo para clasificación
classifier = pipeline(
    "text-classification", 
    model='somosnlp-hackathon-2026/patriae-cuban-dialect-model', 
    token=HF_TOKEN 
)

repo_id = 'somosnlp-hackathon-2026/patriae-cuban-dialect-model'
chat_available = False
generator = None
tokenizer_chat = None
error_message = ""

try:
    # Cargar tokenizador
    tokenizer_chat = AutoTokenizer.from_pretrained(repo_id, token=HF_TOKEN)
    print("✅ Tokenizador cargado")
    
    # Configurar token de padding
    if tokenizer_chat.pad_token is None:
        tokenizer_chat.pad_token = tokenizer_chat.eos_token
        print("✅ Token de padding configurado")
    
    # Cargar modelo para generación
    model_chat = AutoModelForCausalLM.from_pretrained(
        repo_id, 
        torch_dtype=torch.float16 if torch.cuda.is_available() else torch.float32,
        device_map="auto" if torch.cuda.is_available() else None,
        token=HF_TOKEN,
        low_cpu_mem_usage=True
    )
    print("✅ Modelo cargado")
    
    # Crear pipeline de generación de texto con parámetros optimizados
    generator = pipeline(
        "text-generation",
        model=model_chat,
        tokenizer=tokenizer_chat,
        device=0 if torch.cuda.is_available() else -1,
        max_new_tokens=100,  # Reducido para velocidad
        temperature=0.7,
        top_p=0.95,
        do_sample=True,
        repetition_penalty=1.1  # Evita repeticiones
    )
    
    chat_available = True
    print("✅ Modelo de chat cargado correctamente")
    
except Exception as e:
    error_message = str(e)
    print(f"⚠️ Error cargando modelo de chat: {e}")
    chat_available = False
    generator = None
    tokenizer_chat = None


def chat_response(message, history):
    """
    Función para generar respuestas en dialecto cubano usando el modelo de chat
    """
    if not chat_available:
        yield f"⚠️ El modelo de chat no está disponible.\n\n**Error:** {error_message}\n\nUsa el clasificador por ahora."
        return
    
    if not message or message.strip() == "":
        yield "🤔 ¿Qué quieres que te diga? Dame algo con qué trabajar."
        return
    
    try:
        # Construir el prompt con contexto más corto para velocidad
        prompt = f"""Eres un cubano conversando con un amigo. Responde con naturalidad usando el dialecto cubano:\nUsuario: {message}\nCubano:"""
        
        # Generar respuesta con parámetros optimizados
        result = generator(
            prompt,
            max_new_tokens=80,  # Límite de tokens para respuesta más rápida
            temperature=0.7,
            top_p=0.9,
            do_sample=True,
            repetition_penalty=1.15,
            pad_token_id=tokenizer_chat.eos_token_id if tokenizer_chat else None,
            eos_token_id=tokenizer_chat.eos_token_id if tokenizer_chat else None
        )
        
        # Extraer la respuesta generada
        generated_text = result[0]['generated_text']
        # Quitar el prompt de la respuesta
        response = generated_text.replace(prompt, "").strip()
        
        # Si no hay respuesta, dar un mensaje por defecto
        if not response:
            response = "¡Ay, mi hermano! No sé qué decirte, pero pa' que veas que estoy aquí escuchando."
        
        # Limitar respuesta a 200 caracteres para velocidad
        if len(response) > 200:
            response = response[:200] + "..."
        
        yield response
        
    except Exception as e:
        yield f"❌ Error en el chat: {str(e)}"


def classify_text(text):
    """
    Función para clasificar texto y detectar coloquialismos cubanos
    """
    if not text or text.strip() == "":
        return "⚠️ Por favor, ingresa un texto para clasificar."
    
    try:
        # Obtener resultados del modelo
        results = classifier(text)
        
        # Verificar que results no esté vacío
        if not results or len(results) == 0:
            return "❌ No se obtuvieron resultados del modelo."
        
        # Obtener el resultado con mayor confianza
        top_result = results[0]
        label = top_result['label']
        score = top_result['score']
        
        # Determinar si es coloquial (LABEL_1 = coloquial, LABEL_0 = no coloquial)
        if label == "LABEL_1":
            emoji = "🇨🇺"
            tipo = "**COLOQUIAL CUBANO**"
            descripcion = "✅ Este texto contiene expresiones típicas del dialecto cubano."
        elif label == "LABEL_0":
            emoji = "📚"
            tipo = "**NO COLOQUIAL / ESTÁNDAR**"
            descripcion = "ℹ️ Este texto usa lenguaje estándar, sin expresiones coloquiales cubanas."
        else:
            emoji = "🔍"
            tipo = f"**{label}**"
            descripcion = f"Etiqueta desconocida: {label}"
        
        # Construir la salida formateada
        output = f"""
### {emoji} Resultado: {tipo}

**Confianza:** {score:.2%}

{descripcion}

"""
        return output
        
    except Exception as e:
        return f"❌ Error en clasificación: {str(e)}"

    
# Interfaz de Chat
chat_interface = gr.ChatInterface(
    fn=chat_response,
    title="💬 Chat en Dialecto Cubano",
    description="Conversa con un modelo entrenado en dialecto cubano.",
    examples=[
        "¿Qué bolá?",
        "Cuéntame qué hiciste hoy.",
        "Dime un refrán cubano."
    ]
)

# Interfaz de Clasificación
classifier_interface = gr.Interface(
    fn=classify_text,
    inputs=gr.Textbox(
        label="Texto a clasificar",
        placeholder="Escribe una frase en español cubano...",
        lines=5
    ),
    outputs=gr.Markdown(label="Resultado"),
    title="Clasificador de coloquialismos cubanos",
    description="Detecta si un texto contiene expresiones coloquiales cubanas.",
    examples=[
        ["Nos marchábamos sin ti, creyendo que se te habían pegado las sábanas."],
        ["De Varadero venía para acá porque en su casa las broncas con el padre eran de ampanga."],
        ["Los pueblos que no se conocen han de darse prisa para conocerse, como quienes van a pelear juntos."],
        ["El cielo está despejado y hace buen tiempo."],
        ["¿Qué bolá? ¿Cómo andas? ¡Tremenda jodedera!"],
    ]
)

# Combinar ambas interfaces en una sola app
with gr.Blocks(title=title) as demo:
    gr.Markdown(f"# {title}")
    gr.Markdown(description) 

    with gr.Tab("🔍 Clasificador"):
        classifier_interface.render()
    
    with gr.Tab("💬 Chat"):
        if chat_available:
            chat_interface.render()
        else:
            gr.Markdown(f"""
            ## ⚠️ Modelo de chat no disponible. 
            
            **Error:** `{error_message}`
            
            """)
    
    gr.Markdown(article)

if __name__ == "__main__":
    demo.launch()