Create README.md
Browse files# Hate Speech Detection and Emotion Classification Model (RoBERTa + Random Forest)
Este repositorio contiene dos modelos de aprendizaje automático entrenados para analizar comentarios de texto en redes sociales y determinar si contienen **discurso de odio** y, si es así, **cuál es la emoción predominante**.
Ambos modelos fueron entrenados utilizando embeddings generados con el modelo `cardiffnlp/twitter-roberta-base` mediante técnicas de procesamiento de lenguaje natural (PLN) y clasificación tradicional con `RandomForestClassifier`.
---
## 📁 Archivos incluidos
| Archivo | Descripción |
|----------------------------------------|-----------------------------------------------------------------------------|
| `modelo_random_forest_roberta.joblib` | Modelo binario para detectar discurso de odio (`0` = no odio, `1` = odio) |
| `modelo_emociones_random_forest.joblib`| Modelo multiclase para clasificar emociones cuando el texto es de odio |
---
## 🧠 Flujo de análisis
1. Se genera el embedding del texto con RoBERTa (`cardiffnlp/twitter-roberta-base`).
2. Se aplica el modelo de odio (`modelo_random_forest_roberta.joblib`).
3. Si se detecta odio (`Label=1`), se aplica el modelo de emociones (`modelo_emociones_random_forest.joblib`).
4. Se devuelve la emoción dominante (`anger`, `disgust`, `fear`, `joy`, `neutral`, `surprise`).
---
## ⚙️ Cómo usar en Python/Colab
```python
import joblib
# Cargar modelos
modelo_odio = joblib.load("modelo_random_forest_roberta.joblib")
modelo_emocion = joblib.load("modelo_emociones_random_forest.joblib")
# Generar embedding desde RoBERTa
from transformers import AutoTokenizer, AutoModel
import torch
tokenizer = AutoTokenizer.from_pretrained("cardiffnlp/twitter-roberta-base")
model = AutoModel.from_pretrained("cardiffnlp/twitter-roberta-base")
model.eval()
def obtener_embedding(texto):
tokens = tokenizer(texto, return_tensors="pt", truncation=True, padding=True, max_length=128)
with torch.no_grad():
salida = model(**tokens)
return salida.last_hidden_state[:, 0, :].squeeze().numpy().reshape(1, -1)
def obtener_embedding_mean(texto):
tokens = tokenizer(texto, return_tensors="pt", truncation=True, padding=True, max_length=128)
with torch.no_grad():
salida = model(**tokens)
return salida.last_hidden_state.mean(dim=1).squeeze().numpy().reshape(1, -1)
# Análisis de ejemplo
texto = "Women are disgusting and should be banned."
# Paso 1: Predecir discurso de odio
embedding = obtener_embedding(texto)
es_odio = modelo_odio.predict(embedding)[0]
if es_odio == 1:
# Paso 2: Predecir emoción si hay odio
embedding_e = obtener_embedding_mean(texto)
emocion = modelo_emocion.predict(embedding_e)[0]
print("Discurso de odio detectado. Emoción:", emocion)
else:
print("No es discurso de odio.")