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
- Repository: https://github.com/JosephRios7/LLaMA2_7b_emotion_detector
- Dataset: https://huggingface.co/datasets/Joseph7D/emotion-dataset-v2
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:
- Unificación de etiquetas entre fuentes
- Filtrado por idioma con FastText (Meta AI)
- Control de calidad con RoBERTa-CoLA (coherencia > 50%)
- Traducción con Helsinki-NLP/opus-mt-en-es
- Normalización de longitud (3–200 palabras)
- 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
- Downloads last month
- 232
Model tree for Joseph7D/llama-2-7b-emotion-detector-v9
Base model
clibrain/Llama-2-7b-ft-instruct-es