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() |