aymeescobar commited on
Commit
b06625d
·
verified ·
1 Parent(s): 4c7b733

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.")

Files changed (1) hide show
  1. README.md +7 -0
README.md ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ ---
2
+ license: apache-2.0
3
+ language:
4
+ - en
5
+ tags:
6
+ - Hateful
7
+ ---