--- language: - en license: mit tags: - hate-speech-detection - severity-prediction - text-classification - bert - explainable-ai datasets: - Hate-speech-CNERG/hatexplain metrics: - accuracy - f1 --- # Hate Speech Severity Predictor — BERT ## Model Description This is a fine-tuned BERT model (bert-base-uncased) for hate speech severity prediction, developed as part of an MSc research project at the University of Moratuwa, Sri Lanka. The model predicts hate speech severity across three levels: - Level 0 — Non-hate Speech - Level 1 — Mild / Offensive - Level 2 — Severe Hate Speech It also produces a continuous severity score S in [0,1]: S = 0.0 x P(Level 0) + 0.5 x P(Level 1) + 1.0 x P(Level 2) ## Model Details - Developed by: J.A.U.S. Jayakody (239817M), University of Moratuwa - Supervised by: Dr. Supunmali Ahangama - Base model: bert-base-uncased - Language: English - License: MIT ## Dataset Fine-tuned on HateXplain (Mathew et al., 2021): - 20,148 posts from Twitter and Gab - Stratified 70-15-15 train-validation-test split ## Training Details - Epochs: 3 (best checkpoint: Epoch 2) - Batch size: 16 - Learning rate: 2e-5 - Max sequence length: 128 tokens - Class weighting: Balanced - Hardware: Tesla T4 GPU ## Evaluation Results | Metric | SVM | BERT | |--------|-----|------| | Accuracy | 0.629 | 0.684 | | Macro F1 | 0.615 | 0.679 | Severity Prediction Metrics: - Spearman Correlation: 0.714 - Pearson Correlation: 0.720 - Mean Absolute Error: 0.212 - RMSE: 0.292 ## How to Use ```python from transformers import BertForSequenceClassification, BertTokenizer import torch import torch.nn.functional as F import numpy as np tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertForSequenceClassification.from_pretrained('UdaniSJ/hate-speech-severity-bert') model.eval() def predict_severity(text): inputs = tokenizer(text, return_tensors='pt', truncation=True, max_length=128) with torch.no_grad(): outputs = model(**inputs) probs = F.softmax(outputs.logits, dim=1).numpy()[0] score = 0.0*probs[0] + 0.5*probs[1] + 1.0*probs[2] level = int(np.argmax(probs)) names = {0:'Non-hate', 1:'Mild', 2:'Severe'} return {'level': names[level], 'score': round(float(score),3)} print(predict_severity("I love all people regardless of background")) ``` ## Live Demo https://huggingface.co/spaces/UdaniSJ/hate-speech-severity-predictor ## Limitations - Trained on English social media content only - May exhibit lexical over-reliance on identity terms - Context-aware adjustment partially mitigates reclaimed language misclassification ## References - Mathew et al. (2021). HateXplain. AAAI 2021. - Devlin et al. (2019). BERT. NAACL 2019. - Ribeiro et al. (2016). LIME. KDD 2016. - Lundberg and Lee (2017). SHAP. NeurIPS 2017.