Instructions to use gefero/replicate-HatEval-robertuito-base-uncased with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use gefero/replicate-HatEval-robertuito-base-uncased with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-classification", model="gefero/replicate-HatEval-robertuito-base-uncased")# Load model directly from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("gefero/replicate-HatEval-robertuito-base-uncased") model = AutoModelForSequenceClassification.from_pretrained("gefero/replicate-HatEval-robertuito-base-uncased", device_map="auto") - Notebooks
- Google Colab
- Kaggle
replicate-HatEval-robertuito-base-uncased
Réplica del experimento de detección de discurso de odio en español de Pérez et al. (2022): fine-tuning de RoBERTuito sobre HatEval 2019 (SemEval-2019 Task 5), Subtarea A, español, con las particiones oficiales del shared task y 10 corridas con distintas semillas.
| Macro-F1 (test oficial ES) | |
|---|---|
| Reportado en el paper (media de 10 corridas) | 0.801 |
| Esta réplica (media de 10 corridas) | 0.8018 ± 0.0108 |
Modelo con fines pedagógicos. Fue entrenado como ejemplo de fine-tuning y de replicación de resultados para un curso de posgrado. No está pensado para moderación de contenido ni para ningún uso en producción. Ver Sesgos, riesgos y limitaciones.
Detalles del modelo
- Desarrollado por: [Germán Rosati / CONICET - factor_data - EIDAES - UNSAM]
- Tipo de modelo: RoBERTa base (12 capas, 12 cabezas, dimensión oculta 768, vocabulario SentencePiece de 30K, ~108M parámetros) con cabeza de clasificación de secuencias, 2 clases
- Idioma: Español (variedad de Twitter; el corpus original tiene foco en España)
- Licencia: CC-BY-NC-4.0, heredada de HatEval. El uso comercial no está permitido.
- Fine-tuneado a partir de:
pysentimiento/robertuito-base-uncased
Fuentes
- Repositorio: https://github.com/gefero/factor_data_tuto_NLP_SICSS
- Modelo base: Pérez et al. (2022), RoBERTuito: a pre-trained language model for social media text in Spanish, LREC 2022 — https://aclanthology.org/2022.lrec-1.785/
- Datos: Basile et al. (2019), SemEval-2019 Task 5 — https://aclanthology.org/S19-2007/
Usos
Uso directo
Clasificación binaria de tuits en español como Hateful / Not hateful, siguiendo el esquema
de anotación de HatEval: odio dirigido a mujeres o personas migrantes.
Usos fuera de alcance
- Moderación de contenido o cualquier decisión automatizada sobre personas. El modelo se equivoca en aproximadamente uno de cada cinco tuits del test, y los errores no se distribuyen de manera uniforme entre grupos.
- Otros blancos de odio. HatEval anota únicamente misoginia y xenofobia. Contenido homofóbico, antisemita, capacitista o racista contra otros grupos no fue anotado como odio durante el entrenamiento y el modelo tenderá a no detectarlo.
- Otras variedades del español o textos que no sean tuits. El corpus proviene principalmente de Twitter en España, entre 2018 y 2019.
- Uso comercial, por la licencia de los datos.
Sesgos, riesgos y limitaciones
- El modelo aprende tema, no postura. El corpus se recolectó filtrando por palabras clave, así que los mensajes que hablan sobre migración o feminismo están sobrerrepresentados en ambas clases. Es esperable que el contradiscurso, la cita de mensajes de odio y la discusión neutral sobre esos temas produzcan falsos positivos.
- Sobre-predicción sistemática de odio. En las 10 corridas, la precisión sobre la clase positiva (0.727 ± 0.022) es unos 12 puntos menor que el recall (0.845 ± 0.019). Cerca de uno de cada cuatro tuits marcados como odio no lo es según los anotadores. Además, la precisión es la métrica más inestable de todas: su desvío duplica al del macro-F1.
- Generalización limitada. El macro-F1 cae de 0.885 en validación a 0.802 en test —8.3 puntos— pese a que ambas particiones tienen proporciones de clase similares (44.4% y 41.3%). La caída no se explica por desbalance sino por diferencias de contenido. Es razonable esperar caídas iguales o mayores en cualquier corpus distinto de HatEval.
- "Discurso de odio" no es una categoría natural. El modelo reproduce el esquema de anotación de HatEval, con sus criterios y sus desacuerdos, no una definición universal.
- Odio implícito. Ironía, eufemismos y dog whistles sin insultos explícitos se detectan mucho peor que el odio explícito.
- Desfase temporal. Los datos son de 2018-2019; el vocabulario del discurso de odio online cambia rápido.
- Calibración. El entrenamiento continúa varias épocas más allá del mínimo de la loss de validación. Las probabilidades están sobreconfiadas: sirven para ordenar ejemplos, no como estimaciones calibradas.
- Contenido. Los datos de entrenamiento contienen lenguaje abusivo real y sin filtrar.
Recomendaciones
Cualquier uso debería incluir supervisión humana, evaluación previa sobre datos de la población objetivo, y análisis de errores desagregado por subgrupo. El umbral de decisión es una elección de despliegue, no una propiedad del modelo: dado el desbalance sistemático entre precisión y recall, conviene ajustarlo según el costo relativo de cada tipo de error.
Cómo empezar
from transformers import pipeline
from pysentimiento.preprocessing import preprocess_tweet
pipe = pipeline("text-classification",
model="[COMPLETAR: usuario]/replicate-HatEval-robertuito-base-uncased")
texto = "Andate a tu país"
pipe(preprocess_tweet(texto, lang="es"))
Importante. Este modelo requiere el preprocesamiento de RoBERTuito. Sin él, la entrada no coincide con el formato de entrenamiento y el rendimiento cae. Ver Preprocesamiento.
Detalles de entrenamiento
Datos
HatEval 2019, Subtarea A, subconjunto en español, particiones oficiales del shared task
(valeriobasile/HatEval en el Hub, filtrando language == "es").
| Partición | Instancias | % clase Hateful |
|---|---|---|
| Entrenamiento | 4.500 | 41.3% |
| Validación | 500 | 44.4% |
| Test | 1.599 | 41.3% |
Etiqueta HS: 1 si el tuit contiene discurso de odio contra mujeres o personas migrantes, 0 en
caso contrario. El test oficial tiene 1.600 instancias; la copia del Hub contiene 1.599.
Procedimiento
Preprocesamiento
Se aplicó pysentimiento.preprocessing.preprocess_tweet(texto, lang="es") antes de tokenizar,
que es la normalización usada durante el preentrenamiento de RoBERTuito:
- handles de usuario →
@usuario - hashtags → token
hashtagseguido del texto segmentado - emojis → descripción textual entre tokens
emoji - repeticiones de caracteres limitadas a tres
Tokenización posterior con truncado y padding a max_length=128.
Hiperparámetros
| Learning rate | 2e-5, schedule lineal |
| Warmup | 10% de los pasos (141 de 1.410) |
| Batch size (train / eval) | 16 / 64 |
| Épocas | 5 (1.410 pasos de optimización) |
| Weight decay | 0.01 |
| Precisión | fp16 mixta |
| Optimizador | AdamW (default de Trainer) |
| Selección de época | Mejor macro-F1 en validación (load_best_model_at_end) |
| Semillas | 0, 1, 7, 13, 42, 100, 123, 2024, 31337, 65535 |
| Framework | transformers v5, PyTorch |
Difiere de la receta del paper original, que usa learning rate 5e-5. El resto (5 épocas, warmup del 10%, selección del mejor checkpoint por época según la métrica de la tarea) coincide.
Evaluación
Métricas
La métrica oficial de SemEval-2019 Task 5 es macro-F1, elegida porque la accuracy premia al clasificador trivial de clase mayoritaria en un corpus desbalanceado. Se reportan además el F1, la precisión y el recall sobre la clase positiva.
Resultados: 10 corridas sobre el test oficial (1.599 instancias)
| Semilla | Dev macro-F1 | Test macro-F1 | Accuracy | F1 (odio) | Precisión | Recall |
|---|---|---|---|---|---|---|
| 0 | 0.8889 | 0.8078 | 0.8111 | 0.7824 | 0.7459 | 0.8227 |
| 1 | 0.8766 | 0.8074 | 0.8105 | 0.7828 | 0.7429 | 0.8273 |
| 7 | 0.8765 | 0.8127 | 0.8161 | 0.7873 | 0.7535 | 0.8242 |
| 13 | 0.8791 | 0.8002 | 0.8024 | 0.7796 | 0.7222 | 0.8470 |
| 42 | 0.8891 | 0.8066 | 0.8093 | 0.7841 | 0.7357 | 0.8394 |
| 100 | 0.8893 | 0.7975 | 0.7992 | 0.7788 | 0.7143 | 0.8561 |
| 123 | 0.8897 | 0.7970 | 0.7980 | 0.7825 | 0.7042 | 0.8803 |
| 2024 | 0.8910 | 0.8136 | 0.8161 | 0.7921 | 0.7427 | 0.8485 |
| 31337 | 0.8812 | 0.7989 | 0.8011 | 0.7776 | 0.7221 | 0.8424 |
| 65535 | 0.8836 | 0.7765 | 0.7774 | 0.7623 | 0.6814 | 0.8652 |
La fila resaltada es el checkpoint publicado.
Resumen estadístico (test)
| Métrica | Media ± desvío | Rango |
|---|---|---|
| Macro-F1 | 0.8018 ± 0.0108 | [0.7765, 0.8136] |
| Accuracy | 0.8041 ± 0.0115 | [0.7774, 0.8161] |
| F1 (clase odio) | 0.7810 ± 0.0078 | [0.7623, 0.7921] |
| Precisión (clase odio) | 0.7265 ± 0.0222 | [0.6814, 0.7535] |
| Recall (clase odio) | 0.8453 ± 0.0185 | [0.8227, 0.8803] |
Esta es la cifra que reporta el experimento: 0.8018 ± 0.0108, no la del checkpoint publicado.
Selección del checkpoint publicado
Se publica la semilla con mejor macro-F1 en validación (semilla 2024, dev 0.8910). El conjunto de test no participó de esta decisión, de modo que la cifra de test del modelo publicado (0.8136) no está sesgada por selección.
Advertencia sobre el número del modelo publicado. El test macro-F1 de esta semilla, 0.8136, es también el máximo de las 10 corridas. Es coincidencia: la correlación entre dev y test en estas 10 corridas es prácticamente nula (Pearson r = −0.02, Spearman ρ = −0.14). Elegir por dev no ayuda a conseguir un buen test, solo evita el sesgo de haber elegido por test. Nótese que el máximo en test está 1.2 puntos por encima de la media: ese es exactamente el sesgo que se habría introducido al seleccionar por test.
Comparación con la bibliografía
Todas las cifras corresponden al test oficial de HatEval en español.
| Sistema | Macro-F1 |
|---|---|
| Mejor sistema de SemEval-2019 Task 5 | 0.730 |
| BETO cased (Pérez et al. 2022, media de 10 corridas) | 0.768 |
| RoBERTuito uncased (Pérez et al. 2022, media de 10 corridas) | 0.801 |
| Esta réplica (media de 10 corridas) | 0.8018 ± 0.0108 |
La media coincide con el valor publicado hasta el tercer decimal. La réplica usa learning rate 2e-5 en lugar del 5e-5 del trabajo original, lo que sugiere que el resultado no es especialmente sensible a ese hiperparámetro en este rango.
Baselines no incluidos. Esta ficha no reporta baselines (clase mayoritaria, TF-IDF + regresión logística). Sin ellos no es posible cuantificar cuánto aporta el fine-tuning de un modelo preentrenado respecto de métodos superficiales sobre este corpus.
Observaciones
- La variabilidad entre semillas es sustancial. El rango de macro-F1 en test abarca 3.7 puntos (0.7765 a 0.8136), con un desvío de 0.011. Cualquier diferencia menor a ~2 puntos entre configuraciones no es distinguible del ruido sin promediar varias corridas.
- La precisión es la métrica más inestable, con un desvío que duplica al del macro-F1. El recall se mantiene sistemáticamente alto: el modelo sobre-predice odio en todas las corridas.
- La brecha validación-test es de 8.3 puntos y consistente en las 10 corridas, con proporciones de clase similares en ambas particiones. La diferencia proviene del contenido, no del balance.
- Dev no predice test. Ver la advertencia arriba.
Impacto ambiental
- Hardware: [COMPLETAR: p.ej. 1× NVIDIA T4 en Google Colab]
- Horas de cómputo: ~0.7 h (10 corridas de ~4 minutos)
- Proveedor / región: [COMPLETAR]
- Emisiones estimadas: despreciables frente al preentrenamiento del modelo base, que requirió unas tres semanas de TPU v3-8.
Se puede estimar con la calculadora de impacto de ML de Lacoste et al. (2019).
Especificaciones técnicas
RoBERTa base preentrenado con MLM sobre unos 500 millones de tuits en español. Para esta tarea
se agrega un clasificador lineal sobre la representación del token [CLS], entrenado con
cross-entropy sobre dos clases.
Citación
Si usás este modelo, citá el modelo base y el corpus.
@inproceedings{perez2022robertuito,
title = {{RoBERTuito}: a pre-trained language model for social media text in {S}panish},
author = {P{\'e}rez, Juan Manuel and Furman, Dami{\'a}n A. and
Alonso Alemany, Laura and Luque, Franco},
booktitle = {Proceedings of the Thirteenth Language Resources and Evaluation Conference},
pages = {7235--7243},
year = {2022},
address = {Marseille, France},
publisher = {European Language Resources Association}
}
@inproceedings{basile2019semeval,
title = {{SemEval}-2019 Task 5: Multilingual Detection of Hate Speech Against
Immigrants and Women in {T}witter},
author = {Basile, Valerio and Bosco, Cristina and Fersini, Elisabetta and
Nozza, Debora and Patti, Viviana and Rangel Pardo, Francisco Manuel and
Rosso, Paolo and Sanguinetti, Manuela},
booktitle = {Proceedings of the 13th International Workshop on Semantic Evaluation},
pages = {54--63},
year = {2019},
publisher = {Association for Computational Linguistics}
}
Glosario
- Macro-F1: promedio no ponderado del F1 de cada clase. A diferencia de la accuracy, penaliza fuertemente a los modelos que ignoran la clase minoritaria. Es la métrica oficial del shared task.
- F1 (clase odio): F1 calculado únicamente sobre la clase positiva. En este modelo es sistemáticamente más bajo que el macro-F1 y no es comparable con las cifras publicadas.
Archivos adicionales
resultados_semillas.csv— métricas completas de las 10 corridas.
Autoría de la ficha
Germán Rosati
Contacto
- Downloads last month
- 7
Model tree for gefero/replicate-HatEval-robertuito-base-uncased
Base model
pysentimiento/robertuito-base-uncasedPaper for gefero/replicate-HatEval-robertuito-base-uncased
Evaluation results
- Macro F1 (media de 10 corridas) on HatEval 2019 (SemEval-2019 Task 5, Subtask A, Spanish)self-reported0.802
- Macro F1 (checkpoint publicado) on HatEval 2019 (SemEval-2019 Task 5, Subtask A, Spanish)self-reported0.814