| 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) |
|
|
| |
| 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: |
| |
| tokenizer_chat = AutoTokenizer.from_pretrained(repo_id, token=HF_TOKEN) |
| print("✅ Tokenizador cargado") |
| |
| |
| if tokenizer_chat.pad_token is None: |
| tokenizer_chat.pad_token = tokenizer_chat.eos_token |
| print("✅ Token de padding configurado") |
| |
| |
| 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") |
| |
| |
| generator = pipeline( |
| "text-generation", |
| model=model_chat, |
| tokenizer=tokenizer_chat, |
| device=0 if torch.cuda.is_available() else -1, |
| max_new_tokens=100, |
| temperature=0.7, |
| top_p=0.95, |
| do_sample=True, |
| repetition_penalty=1.1 |
| ) |
| |
| 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: |
| |
| prompt = f"""Eres un cubano conversando con un amigo. Responde con naturalidad usando el dialecto cubano:\nUsuario: {message}\nCubano:""" |
| |
| |
| result = generator( |
| prompt, |
| max_new_tokens=80, |
| 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 |
| ) |
| |
| |
| generated_text = result[0]['generated_text'] |
| |
| response = generated_text.replace(prompt, "").strip() |
| |
| |
| if not response: |
| response = "¡Ay, mi hermano! No sé qué decirte, pero pa' que veas que estoy aquí escuchando." |
| |
| |
| 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: |
| |
| results = classifier(text) |
| |
| |
| if not results or len(results) == 0: |
| return "❌ No se obtuvieron resultados del modelo." |
| |
| |
| top_result = results[0] |
| label = top_result['label'] |
| score = top_result['score'] |
| |
| |
| 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}" |
| |
| |
| output = f""" |
| ### {emoji} Resultado: {tipo} |
| |
| **Confianza:** {score:.2%} |
| |
| {descripcion} |
| |
| """ |
| return output |
| |
| except Exception as e: |
| return f"❌ Error en clasificación: {str(e)}" |
|
|
| |
| |
| 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." |
| ] |
| ) |
|
|
| |
| 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!"], |
| ] |
| ) |
|
|
| |
| 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() |