LLaMA 2 7B — Emotion Detector (Spanish) V9

Modelo ajustado fino sobre LLaMA 2 7B para la detección de emociones en reflexiones personales en español. Clasifica textos en seis emociones: ira, disgusto, tristeza, alegría, miedo y neutral.

Desarrollado como Trabajo de Integración Curricular — Universidad Nacional de Loja, Ecuador, 2025.

Model Details

Model Description

  • Developed by: Joseph Daniel Ríos Salas
  • Supervised by: Ing. Oscar Miguel Cumbicus Pineda, Mg.Sc.
  • Institution: Universidad Nacional de Loja — Carrera de Computación
  • Model type: Causal Language Model con ajuste fino para clasificación emocional
  • Language: Español (es)
  • License: Llama 2 Community License
  • Finetuned from: clibrain/Llama-2-7b-ft-instruct-es

Model Sources

Uses

Direct Use

El modelo está diseñado para clasificar textos en español dentro de una de las seis emociones objetivo. Es especialmente adecuado para:

  • Análisis de reflexiones personales y diarios
  • Monitoreo de bienestar estudiantil
  • Apoyo a herramientas de salud mental
  • Investigación en análisis afectivo en español

Puedes usar el modelo de tres formas:

1. Interfaz web (sin código) Accede directamente desde el navegador, sin instalar nada: 👉 https://huggingface.co/spaces/Joseph7D/emotion-detector-page

2. API con Dockerfile Despliega tu propia instancia con Docker usando el Space configurado: 👉 https://huggingface.co/spaces/Joseph7D/emotion-detector-space

3. Código Python directo Carga el modelo en tu entorno con el código de la sección "How to Get Started with the Model".

Out-of-Scope Use

  • Textos fuera del rango de 3 a 200 palabras
  • Textos con ironía o sarcasmo marcado
  • Variantes del español latinoamericano con léxico muy regional
  • Diagnóstico clínico directo sin supervisión profesional

How to Get Started with the Model

# Celda 1 — Instalar dependencias
!pip install accelerate peft bitsandbytes transformers gradio

# Celda 2 — Imports
import torch
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
)

# Celda 3 — Cargar modelo
model_id = "Joseph7D/llama-2-7b-emotion-detector-v9"

quant_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.float16,
    bnb_4bit_use_double_quant=False,
)

model = AutoModelForCausalLM.from_pretrained(
    model_id,
    quantization_config=quant_config,
    device_map={"": 0}
)
model.config.use_cache = False
model.config.pretraining_tp = 1

tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"

# Celda 4 — Función de clasificación
def detectar_emocion(texto):
    model.eval()
    prompt = (
        f"Clasifica el siguiente texto en una de estas emociones: "
        f"ira, disgusto, tristeza, alegría, miedo o neutral. "
        f"Responde únicamente con la emoción correspondiente.\n\n"
        f"Texto: \"{texto}\""
    )
    formatted_prompt = f"<s>[INST] {prompt} [/INST]"
    inputs = tokenizer(
        formatted_prompt,
        return_tensors="pt",
        return_attention_mask=True
    ).to(model.device)

    with torch.no_grad():
        output = model.generate(
            input_ids=inputs["input_ids"],
            attention_mask=inputs["attention_mask"],
            max_new_tokens=20,
            do_sample=False
        )

    decoded = tokenizer.decode(output[0], skip_special_tokens=True)
    return decoded.split("[/INST]")[-1].strip()

# Celda 5 — Ejemplos
textos = [
    "Me siento con más energía, menos cansada he bajado dos libras",
    "Me siento aterrado cada vez que tengo que hablar frente a mi jefe",
    "Me enfurece la impuntualidad y la falta de compromiso de algunas personas",
    "Las lágrimas se mezclan con la tinta mientras escribo estas palabras",
    "La suciedad y el hedor eran palpables en aquella antigua calle",
    "El ministro anunció la retirada de las tropas hacia la región norte",
]

emojis = {
    "alegría": "😊", "ira": "😠", "tristeza": "😢",
    "neutral": "😐", "disgusto": "🤢", "miedo": "😨"
}

for texto in textos:
    emocion = detectar_emocion(texto)
    emoji = emojis.get(emocion.lower(), "🎭")
    print(f"{emoji} {emocion.upper():<10}{texto[:60]}...")

Output esperado:

Me siento con más energía, menos cansada he bajado...  → alegría
Me siento aterrado cada vez que tengo que hablar...      → miedo
Me enfurece la impuntualidad y la falta de compromiso... → ira
Las lágrimas se mezclan con la tinta mientras escribo... → tristeza
La suciedad y el hedor eran palpables en aquella...      → disgusto
El ministro anunció la retirada de las tropas...         → neutral

Training Details

Training Data

Dataset unificado de 33.672 textos balanceados (5.612 por emoción), construido a partir de cuatro corpus de referencia:

Corpus Muestras originales Idioma
Spanish MEACorpus 2023 5.129 Español
EmoEvalEs 2021 8.409 Español
CARER Emotion Dataset 20.000 Inglés → traducido
HRECPW Dataset 125.217 Inglés → traducido

Pipeline de preprocesamiento:

  1. Unificación de etiquetas entre fuentes
  2. Filtrado por idioma con FastText (Meta AI)
  3. Control de calidad con RoBERTa-CoLA (coherencia > 50%)
  4. Traducción con Helsinki-NLP/opus-mt-en-es
  5. Normalización de longitud (3–200 palabras)
  6. Limpieza textual

Validación externa: psicólogo clínico certificó una validez del 98,67% sobre una muestra de 300 textos (50 por emoción). Solo 4 casos de 300 presentaron etiquetas incorrectas.

Dataset disponible en: 👉 Joseph7D/emotion-dataset-v2

Training Procedure

Training Hyperparameters

Parámetro Valor
Modelo base clibrain/Llama-2-7b-ft-instruct-es
Técnica LoRA (Low-Rank Adaptation)
LoRA rank (r) 8
LoRA alpha 32
LoRA dropout 0,10
Target modules q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
Cuantización entrenamiento 4-bit NF4
Training regime fp16 mixed precision
Epochs 2
Learning rate 2e-5
Batch efectivo 8 (batch=1 × gradient_accumulation=8)
Optimizer paged_adamw_32bit
Weight decay 0,01
Warmup ratio 0,10
LR scheduler Linear
Max grad norm 0,5

Speeds, Sizes, Times

  • Hardware: GPU NVIDIA Tesla P100 16GB (Kaggle)
  • Tiempo de entrenamiento: 9 horas 39 minutos
  • Versiones experimentadas: V4 → V9 (6 configuraciones)
  • Salto clave: V4→V5 al incorporar tokenización uniforme: 84,48% → 91,13% eval_token_acc

Evaluation

Testing Data

Conjunto de prueba independiente: 3.366 muestras balanceadas (561 por emoción), nunca visto durante el entrenamiento.

Metrics

Métricas de clasificación multiclase: precisión, recall y F1-score por clase, más precisión global y F1-score macro.

Results

Resultados globales:

Métrica Valor
Precisión global 89,04%
F1-score macro 89,02%

Resultados por emoción:

Emoción Precisión Recall F1-Score
Disgusto 0,9514 0,9412 0,9462
Miedo 0,9475 0,9323 0,9398
Neutral 0,8318 0,9430 0,8839
Alegría 0,8891 0,8574 0,8730
Tristeza 0,8623 0,8485 0,8553
Ira 0,8679 0,8200 0,8433

Comparación con el estado del arte:

Trabajo Modelo Resultado
EmoLLMs (TR01) EmoLLaMA-7B 54,50%
MEACorpus (TR03) MarIA (BERT-es) 69,39%
GPT-4 zero-shot (TR06) GPT-4 82,20%
EmoBERTTiny (TR04) BERT compacto 85,46%
Este trabajo LLaMA 2 7B + LoRA 89,04%

Tiempo de inferencia (GPU T4, Google Colab):

  • Promedio: 1,25 segundos por muestra
  • Throughput: ~48 muestras/minuto

Bias, Risks, and Limitations

  • Sesgo dialectal: los corpus tienen predominio del español peninsular. El rendimiento puede variar en variantes latinoamericanas.
  • Ironía y sarcasmo: el modelo tiene dificultad cuando la emoción expresada es opuesta al significado literal del texto.
  • Uso clínico: este modelo es una herramienta de apoyo. No debe usarse como sustituto del criterio de un profesional de salud mental.
  • Longitud de texto: optimizado para textos entre 3 y 200 palabras.

Recommendations

Se recomienda supervisión humana en cualquier aplicación clínica. El modelo es apropiado para análisis exploratorio y monitoreo general, no para diagnóstico individual.

Environmental Impact

  • Hardware: GPU NVIDIA Tesla P100 (Kaggle — cloud)
  • Hours used: ~9,65 horas
  • Cloud Provider: Google (Kaggle)
  • Compute Region: No especificada

Citation

BibTeX:

@thesis{rios2025llama2emotions,
  title     = {Ajuste fino del modelo LLaMA 2 para la detección de 
               emociones en reflexiones personales en español},
  author    = {Ríos Salas, Joseph Daniel},
  year      = {2025},
  school    = {Universidad Nacional de Loja},
  type      = {Trabajo de Integración Curricular},
  url       = {https://dspace.unl.edu.ec/items/396f65b5-5e5e-4d68-bc52-9999fc790c90}
}

APA: Ríos Salas, J. D. (2025). Ajuste fino del modelo LLaMA 2 para la detección de emociones en reflexiones personales en español [Trabajo de Integración Curricular, Universidad Nacional de Loja]. Repositorio Institucional UNL. https://dspace.unl.edu.ec/items/396f65b5-5e5e-4d68-bc52-9999fc790c90

Model Card Authors

Joseph Daniel Ríos Salas — Universidad Nacional de Loja

Model Card Contact

📧 joseph.rios@unl.edu.ec
🤗 Hugging Face
🐙 GitHub

Downloads last month
232
Safetensors
Model size
7B params
Tensor type
F32
·
F16
·
I8
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for Joseph7D/llama-2-7b-emotion-detector-v9

Adapter
(2)
this model

Spaces using Joseph7D/llama-2-7b-emotion-detector-v9 2