|
|
--- |
|
|
language: |
|
|
- tr |
|
|
tags: |
|
|
- text-classification |
|
|
- bert |
|
|
- offensive-language-detection |
|
|
- turkish |
|
|
- boun-tabilab |
|
|
datasets: |
|
|
- offenseval-tr |
|
|
metrics: |
|
|
- accuracy |
|
|
- f1 |
|
|
model-index: |
|
|
- name: atahanuz/bert-offensive-classifier |
|
|
results: |
|
|
- task: |
|
|
type: text-classification |
|
|
name: Text Classification |
|
|
dataset: |
|
|
name: OffensEval-2020-TR |
|
|
type: offenseval-tr |
|
|
metrics: |
|
|
- name: Accuracy |
|
|
type: accuracy |
|
|
value: 0.936 |
|
|
- name: F1 |
|
|
type: f1 |
|
|
value: 0.912 |
|
|
base_model: boun-tabilab/TabiBERT |
|
|
--- |
|
|
|
|
|
# Turkish Offensive Language Classifier (BERT) |
|
|
|
|
|
This model is a fine-tuned version of [**boun-tabilab/TabiBERT**](https://huggingface.co/boun-tabilab/TabiBERT) trained on the **OffensEval-2020-TR** dataset. It is designed to perform binary classification to detect offensive language in Turkish text. |
|
|
|
|
|
## 📊 Model Details |
|
|
|
|
|
| Feature | Description | |
|
|
| :--- | :--- | |
|
|
| **Model Architecture** | BERT (Base Uncased Turkish - TabiBERT) | |
|
|
| **Task** | Binary Text Classification (Offensive vs. Not Offensive) | |
|
|
| **Language** | Turkish (tr) | |
|
|
| **Dataset** | OffensEval 2020 (Turkish Subtask) | |
|
|
| **Trained By** | atahanuz | |
|
|
|
|
|
## 🚀 Usage |
|
|
|
|
|
The easiest way to use this model is via the Hugging Face `pipeline`. |
|
|
|
|
|
### Method 1: Using the Pipeline (Recommended) |
|
|
|
|
|
```python |
|
|
from transformers import pipeline |
|
|
|
|
|
classifier = pipeline("text-classification", model="atahanuz/bert-offensive-classifier") |
|
|
|
|
|
text = "Bu harika bir filmdi, çok beğendim." |
|
|
result = classifier(text)[0] |
|
|
|
|
|
label = "Offensive" if result['label'] == "LABEL_1" else "Not Offensive" |
|
|
|
|
|
print(f"Prediction: {label} (Score: {result['score']:.4f})") |
|
|
|
|
|
# Prediction: Not Offensive (Score: 1.0000) |
|
|
``` |
|
|
|
|
|
### Method 2: Manual PyTorch Implementation |
|
|
|
|
|
If you need more control over the tokens or logits, use the standard `AutoModel` approach: |
|
|
|
|
|
```python |
|
|
from transformers import AutoTokenizer, AutoModelForSequenceClassification |
|
|
import torch |
|
|
|
|
|
# 1. Load model and tokenizer |
|
|
model_name = "atahanuz/bert-offensive-classifier" |
|
|
tokenizer = AutoTokenizer.from_pretrained(model_name) |
|
|
model = AutoModelForSequenceClassification.from_pretrained(model_name) |
|
|
|
|
|
# 2. Define label mapping |
|
|
id2label = {0: "NOT", 1: "OFF"} |
|
|
|
|
|
# 3. Tokenize and predict |
|
|
text = "Bu harika bir filmdi, çok beğendim." # Example text |
|
|
inputs = tokenizer(text, return_tensors="pt", truncation=True) |
|
|
|
|
|
with torch.no_grad(): |
|
|
logits = model(**inputs).logits |
|
|
|
|
|
# 4. Get results |
|
|
predicted_class_id = logits.argmax().item() |
|
|
predicted_label = id2label[predicted_class_id] |
|
|
confidence = torch.softmax(logits, dim=1)[0][predicted_class_id].item() |
|
|
|
|
|
print(f"Text: {text}") |
|
|
print(f"Prediction: {predicted_label} (Confidence: {confidence:.4f})") |
|
|
``` |
|
|
|
|
|
## 🏷️ Label Mapping |
|
|
|
|
|
The model outputs the following labels: |
|
|
|
|
|
| Label ID | Label Name | Description | |
|
|
| :--- | :--- | :--- | |
|
|
| `0` | **NOT** | **Not Offensive** - Normal, non-hateful speech. | |
|
|
| `1` | **OFF** | **Offensive** - Contains insults, threats, or inappropriate language. | |
|
|
|
|
|
## 📝 Example Predictions |
|
|
|
|
|
| Text | Label | Prediction | |
|
|
| :--- | :--- | :--- | |
|
|
| "Bu filmi çok beğendim, oyunculuklar harikaydı." | **NOT** | Non-Offensive | |
|
|
| "Beynini kullanmayı denesen belki anlarsın." | **OFF** | Offensive | |
|
|
| "Maalesef bu konuda sana katılamıyorum." | **NOT** | Non-Offensive | |
|
|
| "Senin gibi aptal insanlar yüzünden bu haldeyiz." | **OFF** | Offensive | |
|
|
|
|
|
## 📈 Performance |
|
|
|
|
|
The model was evaluated on the test split of the OffensEval-2020-TR dataset (approx. 3,500 samples). |
|
|
|
|
|
- **Accuracy:** `93.6%` |
|
|
- **F1 Score:** `91.2%` |
|
|
|
|
|
### Dataset Statistics |
|
|
- **Training Samples:** 31,277 |
|
|
- **Test Samples:** 3,529 |
|
|
|
|
|
## ⚠️ Limitations and Bias |
|
|
|
|
|
* **Context Sensitivity:** Like many BERT models, this classifier may struggle with sarcasm or offensive language that depends heavily on context not present in the input sentence. |
|
|
* **Dataset Bias:** The model is trained on social media data (OffensEval). It may reflect biases present in that specific dataset or struggle with formal/archaic Turkish. |
|
|
* **False Positives:** Certain colloquialisms or "tough love" expressions might be misclassified as offensive. |
|
|
|
|
|
## 📚 Citation |
|
|
|
|
|
If you use this model, please cite the TabiLAB model and OffensEval paper: |
|
|
|
|
|
```bibtex |
|
|
@misc{Türker2025Tabibert, |
|
|
title={TabiBERT: A Large-Scale ModernBERT Foundation Model and Unified Benchmarking Framework for Turkish}, |
|
|
author={Melikşah Türker and Asude Ebrar Kızıloğlu and Onur Güngör and Susan Üsküdarlı}, |
|
|
year={2025}, |
|
|
eprint={2512.23065}, |
|
|
archivePrefix={arXiv}, |
|
|
primaryClass={cs.CL}, |
|
|
url={https://arxiv.org/abs/2512.23065}, |
|
|
} |
|
|
``` |
|
|
|
|
|
```bibtex |
|
|
@inproceedings{zampieri-etal-2020-semeval, |
|
|
title = "{SemEval}-2020 Task 12: Multilingual Offensive Language Identification in Social Media ({OffensEval} 2020)", |
|
|
author = "Zampieri, Marcos and |
|
|
Nakov, Preslav and |
|
|
Rosenthal, Sara and |
|
|
Atanasova, Pepa and |
|
|
Karadzhov, Georgi and |
|
|
Mubarak, Hamdy and |
|
|
Derczynski, Leon and |
|
|
Pym, Z", |
|
|
booktitle = "Proceedings of the Fourteenth Workshop on Semantic Evaluation", |
|
|
year = "2020", |
|
|
publisher = "International Committee for Computational Linguistics", |
|
|
} |
|
|
``` |