File size: 6,324 Bytes
35f4d2f
 
5fa6aaf
35f4d2f
5fa6aaf
 
35f4d2f
5fa6aaf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35f4d2f
5fa6aaf
35f4d2f
5fa6aaf
e4fc2bb
5fa6aaf
 
 
 
35f4d2f
 
 
5fa6aaf
35f4d2f
5fa6aaf
 
 
 
 
 
 
 
 
 
 
 
 
 
35f4d2f
e4fc2bb
5fa6aaf
 
 
 
 
81d43d6
5fa6aaf
e4fc2bb
81d43d6
e4fc2bb
 
76618c6
 
 
 
 
 
 
 
81d43d6
 
76618c6
81d43d6
 
 
 
 
 
 
 
 
76618c6
81d43d6
 
 
 
76618c6
 
 
 
 
81d43d6
 
 
 
 
 
 
 
 
 
 
 
 
 
76618c6
 
 
 
 
 
 
 
 
 
 
 
 
81d43d6
 
 
e4fc2bb
 
76618c6
35f4d2f
76618c6
5fa6aaf
 
35f4d2f
 
5fa6aaf
 
 
 
 
35f4d2f
 
 
 
 
 
 
 
 
5fa6aaf
e4fc2bb
35f4d2f
 
5fa6aaf
 
 
 
 
 
e4fc2bb
5fa6aaf
 
e4fc2bb
5fa6aaf
 
 
 
 
e4fc2bb
 
5fa6aaf
35f4d2f
5fa6aaf
e4fc2bb
5fa6aaf
e08472e
5fa6aaf
 
 
e08472e
 
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
import gradio as gr
from huggingface_hub import InferenceClient
from transformers import pipeline

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)**
"""

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

def respond(message, history, system_message, max_tokens, temperature, top_p):
    """
    Función para generar respuestas usando el modelo de chat
    """
    # Usar el mismo modelo para generación (si es compatible)

    client = InferenceClient(
        model="somosnlp-hackathon-2026/patriae-cuban-dialect-model"
    )
    
    messages = [{"role": "system", "content": system_message}]
    messages.extend(history)
    messages.append({"role": "user", "content": message})
    
    response = ""
    try:
        for message in client.chat_completion(
            messages,
            max_tokens=max_tokens,
            stream=True,
            temperature=temperature,
            top_p=top_p,
        ):
            if message.choices and message.choices[0].delta.content:
                token = message.choices[0].delta.content
                response += token
                yield response
    except Exception as e:
        yield f"Error: {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)
        
        # DEBUG: Imprimir para ver la estructura (puedes eliminar después)
        print(f"Results: {results}")
        print(f"Type: {type(results)}")
        print(f"Length: {len(results)}")
        
        # 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":
            es_coloquial = True
            emoji = "🇨🇺"
            tipo = "**COLOQUIAL CUBANO**"
            descripcion = "✅ Este texto contiene expresiones típicas del dialecto cubano."
        elif label == "LABEL_0":
            es_coloquial = False
            emoji = "📚"
            tipo = "**NO COLOQUIAL / ESTÁNDAR**"
            descripcion = "ℹ️ Este texto usa lenguaje estándar, sin expresiones coloquiales cubanas."
        else:
            # Si la etiqueta no es LABEL_0 ni LABEL_1, mostrar la etiqueta original
            emoji = "🔍"
            tipo = f"**{label}**"
            descripcion = f"Etiqueta desconocida: {label}"
        
        # Construir la salida formateada
        output = f"""
### {emoji} Resultado: {tipo}

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

{descripcion}

---
### 📊 Detalle de clasificación:

| Etiqueta | Probabilidad |
|----------|--------------|
"""
        # Mostrar todos los resultados disponibles
        for i, result in enumerate(results):
            if result['label'] == "LABEL_1":
                label_name = "🇨🇺 Coloquial"
            elif result['label'] == "LABEL_0":
                label_name = "📚 No coloquial"
            else:
                label_name = result['label']
            
            output += f"| {label_name} | {result['score']:.2%} |\n"
        
        output += """
---
💡 **Nota:** El modelo analiza si el texto contiene expresiones típicas del dialecto cubano.
        """
        return output
    except Exception as e:
        return f"❌ Error en clasificación: {str(e)}\n\nDetalles técnicos: El modelo devolvió: {results if 'results' in locals() else 'No hay resultados'}"

    
# Interfaz de Chat
chat_interface = gr.ChatInterface(
    respond,
    additional_inputs=[
        gr.Textbox(
            value="Eres un chatbot cubano que ayuda a entender y usar el dialecto cubano.",
            label="System message"
        ),
        gr.Slider(minimum=1, maximum=1024, value=150, step=1, label="Max new tokens"),
        gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"),
        gr.Slider(
            minimum=0.1,
            maximum=1.0,
            value=0.95,
            step=0.05,
            label="Top-p (nucleus sampling)",
        ),
    ],
    title=title,
    description=description
)

# Interfaz de Clasificación
classifier_interface = gr.Interface(
    fn=classify_text,
    inputs=gr.Textbox(
        label="Texto a clasificar",
        placeholder="Escribe una frase en 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."],
    ],
    article=article  # ✅ article SÍ es válido para gr.Interface
)

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

    with gr.Tab("🔍 Clasificador"):
        classifier_interface.render()
    
    with gr.Tab("💬 Chat"):
    
        chat_interface.render()
    
    gr.Markdown(article)

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