DOI: 10.6084/m9.figshare.25669038.v2
title: Algoritmo de clasificación de expresiones de odio por tipos en español (Algorithm for classifying hate expressions by type in Spanish)

description: Modelo de Clasificación de Tipos de Discurso de OdioEste código implementa un sistema de clasificación de tipos de discurso de odio utilizando el modelo RoBERTuito (una versión en español de RoBERTa) para detectar y categorizar diferentes tipos de discurso de odio en textos.Arquitectura del ModeloEl modelo se basa en <code>pysentimiento/robertuito-base-uncased</code> con las siguientes modificaciones:Se añadió una capa de clasificación densa sobre el modelo baseUtiliza IDs de entrada y máscaras de atención como entradasGenera una clasificación multi-clase con 5 categorías de odioDataset<b>Conjunto de Datos HATEMEDIA</b>: Conjunto de datos personalizado de discurso de odio con categorización por tipos:<b>Etiquetas</b>: 5 categorías de tipos de odio (0-4)<b>Preprocesamiento</b>:Eliminación de valores nulos en texto y etiquetasReindexación y reetiquetado (las etiquetas originales se ajustan restando 1)Exclusión de la categoría 2 durante el entrenamientoConversión de la categoría 5 a categoría 2Proceso de EntrenamientoConfiguración<b>Batch size</b>: 128<b>Épocas</b>: 5<b>Learning rate</b>: 2e-5 con warmup steps del 10%<b>Early stopping</b> con paciencia=2<b>Pesos de clase</b>: Balanceados para manejar desequilibrio de clasesMétricas PersonalizadasRecall para clases específicas (focus en clase 2)Precision para clases específicas (focus en clase 3)F1-score (weighted)AUC-PRRecall at precision=0.6 (clase 3)Precision at recall=0.6 (clase 2)Métricas de EvaluaciónEl modelo se evalúa utilizando:Macro recall, precision, and F1-scoreOne-vs-Rest AUCAccuracyMétricas por claseMatriz de confusiónClassification report completoCaracterísticas TécnicasPreprocesamiento de Datos<b>Tokenización</b>: Máxima longitud de 128 tokens (truncamiento y padding)<b>Codificación de etiquetas</b>: One-hot encoding para clasificación multi-clase<b>División de datos</b>: 80% entrenamiento, 10% validación, 10% pruebaOptimización<b>Optimizador</b>: Adam con schedule de warmup lineal<b>Función de pérdida</b>: Categorical Crossentropy (from_logits=True)<b>Manejo de desbalance</b>: Class weights computados automáticamenteRequerimientosSe requieren los siguientes paquetes de Python:TensorFlowTransformersscikit-learnpandasdatasetsmatplotlibseabornnumpyUso<b>Formato de datos</b>:Archivo CSV o DataFrame de PandasNombre de columna obligatorio: <code>text</code> (tipo cadena)Nombre de columna obligatorio: Etiqueta de tipo de odio (tipo entero, 0-4) - ppcional para evaluación<b>Preprocesamiento de texto</b>:Tokenización automática con longitud máxima de 128 tokensLos textos largos se truncarán automáticamenteManejo de caracteres especiales, URLs y emojis incluido<b>Codificación de etiquetas</b>:El modelo clasifica en 5 categorías de tipos de discurso de odio (0-4)<code>0</code>: Odio político: Expresiones contra individuos o colectivos por motivos de orientación política.<code>1</code>: Odio general o indiferenciado: Expresiones de odio, sin un claro dominio de uno de los tipos específicos considerados en este monitor, pudiendo contener en este tipo de mensajes más de un tipo de odio.<code>2</code>: Odio sexual: Expresiones dirigidas contra personas o colectivos por su orientación sexual.<code>3</code>: Odio xenófono: Expresiones dirigidas contra personas o colectivos, por motivo de origen (e.j. extranjero e inmigrante).<code>4</code>: Odio misógino: Expresiones dirigidas contra mujeres o rasgos asociados a ellas.<b>Estructura de Archivos</b>El código genera y guarda:Pesos del modelo entrenado (.h5)Tokenizer configuradoHistorial de entrenamiento en CSVArchivo de requirements<b>Notas Importantes</b>El modelo excluye la categoría 2 durante el entrenamientoImplementa transfer learning desde un modelo preentrenado en detección binaria de odioIncluye callbacks de early stopping para prevenir overfittingUtiliza class weighting para manejar desbalance en las categoríasEl proceso de creación de este algoritmo se expone en el informe técnico localizado en: Blanco-Valencia, X., De Gregorio-Vicente, O., Ruiz Iniesta, A., & Said-Hung, E. (2025). Algoritmos de detección de odio/no odio, tipo e intensidad – Hatemedia V.2.0 (Version 2). Hatemedia Project. https://doi.org/10.5281/zenodo.16996080Autores:Daniel Pérez PalauXiomara BlancoAlmudena RuizOscar De GregorioJuan José CubillasElias Said-HungJulio Montero-DíazFinanciado por: MCIN/AEI /10.13039/501100011033Como citar: Pérez Palau, D., Blanco Valencia, X., Ruiz-Iniesta, A., De Gregorio Vicente, O., José Cubillas, J., Said-Hung, E. y Montero-Diaz, J. (2023). Algoritmo de clasificación de expresiones de odio por tipos en español [Algorithm for classifying hate expressions by type in Spanish]. https://doi.org/10.6084/m9.figshare.25892815.v1.Más información:https://www.hatemedia.es/ o contactar con: elias.said@unir.netEste algoritmo está relacionado con el algoritmo de clasificación de odio/no odio, desarrollado también por los autores: https://github.com/esaidh266/Algorithm-for-detection-of-hate-speech-in-SpanishEste algoritmo está relacionado con el algoritmo de clasificación de expresiones de odio por intensidades en español, desarrollado también por los autores: https://github.com/esaidh266/Algorithm-for-classifying-hate-expressions-by-intensities-in-SpanishHate Speech Type Classification ModelThis code implements a hate speech type classification system using the RoBERTuito model (a Spanish version of RoBERTa) to detect and categorize different types of hate speech in texts.Model ArchitectureThe model is based on <code>pysentimiento/robertuito-base-uncased</code> with the following modifications:A dense classification layer was added over the base modelUses input IDs and attention masks as inputsGenerates a multi-class classification with 5 hate categoriesDataset<b>HATEMEDIA Dataset</b>: Custom hate speech dataset with categorization by type:<b>Labels</b>: 5 hate type categories (0-4)<b>Preprocessing</b>:Null values ​​removed from text and labelsReindexing and relabeling (original labels are adjusted by subtracting 1)Exclusion of category 2 during trainingConversion of category 5 to category 2Training ProcessConfiguration<b>Batch size</b>: 128<b>Epoches</b>: 5<b>Learning rate</b>: 2e-5 with 10% warmup steps<b>Early stopping</b> with patience=2<b>Class weights</b>: Balanced to handle class imbalanceCustom MetricsRecall for specific classes (focus on class 2)Precision for specific classes (focus on class 3)F1-score (weighted)AUC-PRRecall at precision=0.6 (class 3)Precision at recall=0.6 (class 2)Evaluation MetricsThe model is evaluated using:Macro recall, precision, and F1-scoreOne-vs-Rest AUCAccuracyPer-class metricsConfusion matrixFull classification reportTechnical FeaturesData Preprocessing<b>Tokenization</b>: Maximum length of 128 tokens (truncation and padding)<b>Encoding of labels</b>: One-hot encoding for multi-class classification<b>Data split</b>: 80% training, 10% validation, 10% testingOptimization<b>Optimizer</b>: Adam with linear warmup scheduling<b>Loss function</b>: Categorical Crossentropy (from_logits=True)<b>Imbalance handling</b>: Class weights computed automaticallyRequirementsThe following Python packages are required:TensorFlowTransformersscikit-learnpandasdatasetsmatplotlibseabornnumpyUsage<b>Data format</b>:CSV file or Pandas DataFrameRequired column name: <code>text</code> (string type)Required column name: Data type label (integer type, 0-4) - optional for evaluation<b>Text preprocessing</b>:Automatic tokenization with a maximum length of 128 tokensLong texts will be automatically truncatedHandling of special characters, URLs, and emojis included<b>Label encoding</b>:The model classifies hate speech into 5 categories (0-4)<code>0</code>: Political hatred: Expressions directed against individuals or groups based on political orientation.<code>1</code>: General or undifferentiated hatred: Expressions of hatred without a clear dominance of one of the specific types considered in this monitor, and these types of messages may contain more than one type of hatred.<code>2</code>: Sexual hatred: Expressions directed against individuals or groups based on their sexual orientation.<code>3</code>: Xenophonic hatred: Expressions directed against individuals or groups based on their origin (e.g., foreigners and immigrants).<code>4</code>: Misogynistic hate: Expressions directed against women or traits associated with them.<b>File Structure</b>The code generates and saves:Weights of the trained model (.h5)Configured tokenizerTraining history in CSVRequirements file<b>Important Notes</b>The model excludes category 2 during trainingImplements transfer learning from a pre-trained model for binary hate detectionIncludes early stopping callbacks to prevent overfittingUses class weighting to handle category imbalancesThe process of creating this algorithm is explained in the technical report located at: Blanco-Valencia, X., De Gregorio-Vicente, O., Ruiz Iniesta, A., & Said-Hung, E. (2025). Algoritmos de detección de odio/no odio, tipo e intensidad – Hatemedia V.2.0 (Version 2). Hatemedia Project. https://doi.org/10.5281/zenodo.16996080Authors:Daniel Pérez PalauXiomara BlancoAlmudena RuizOscar De GregorioJuan José CubillasElias Said-HungJulio Montero-DíazFunded by: MCIN/AEI/10.13039/501100011033How to cites: Pérez Palau, D., Blanco Valencia, X., Ruiz-Iniesta, A., De Gregorio Vicente, O., José Cubillas, J., Said-Hung, E. and Montero-Diaz, J. (2023). Algoritmo de clasificación de expresiones de odio por tipos en español [Algorithm for classifying hate expressions by types in Spanish]. https://doi.org/10.6084/m9.figshare.25669038.More information:https://www.hatemedia.es/ or contact: elias.said@unir.netThis algorithm is related to the hate/non-hate classification algorithm, also developed by the authors: https://github.com/esaidh266/Algorithm-for-detection-of-hate-speech-in-SpanishThis algorithm is related to the algorithm for classifying hate expressions by intensities in Spanish, also developed by the authors: https://github.com/esaidh266/Algorithm-for-classifying-hate-expressions-by-intensities-in-Spanish