kabyle-emotion-xlmr / README.md
boffire's picture
Update README.md
a19a3e3 verified
---
language:
- kab
- ber
license: mit
library_name: transformers
tags:
- kabyle
- tamazight
- emotion-classification
- sentiment-analysis
- xlm-roberta
- low-resource
- cross-lingual-transfer
datasets:
- tatoeba
base_model: xlm-roberta-base
metrics:
- f1
- accuracy
---
# Kabyle Emotion Classifier
A fine-tuned XLM-RoBERTa model for **7-class emotion recognition in Kabyle** (Taqbaylit), a low-resource Afro-Asiatic and Amazigh language spoken in Algeria.
## Model Details
| Attribute | Value |
|-----------|-------|
| **Base model** | `xlm-roberta-base` (fine-tuned from `boffire/kabyle-emotion-xlmr`) |
| **Architecture** | XLM-RoBERTa for Sequence Classification |
| **Parameters** | ~278 M |
| **Languages** | Kabyle (`kab`) |
| **Task** | Text Classification (Emotion Detection) |
| **Classes** | 7 — `anger`, `disgust`, `fear`, `joy`, `sadness`, `surprise`, `neutral` |
## Training Data
The model was trained via **cross-lingual label transfer** from English to Kabyle using parallel sentence pairs:
1. **Round-trip parallel corpus** (`eng_kab_roundtrip_good.tsv`) — 131,301 English–Kabyle sentence pairs with back-translation quality scores.
2. **Tatoeba parallel corpus** — 138,353 additional English–Kabyle linked sentences downloaded from [tatoeba.org](https://tatoeba.org).
**Labeling pipeline:**
- English sentences were labeled with [`j-hartmann/emotion-english-distilroberta-base`](https://huggingface.co/j-hartmann/emotion-english-distilroberta-base).
- Labels were transferred to the Kabyle side via sentence alignment.
- Low-confidence predictions (`< 0.75`) were filtered out.
- The `neutral` class was capped at 2,000 examples to reduce imbalance.
**Final balanced dataset:**
- **Total labeled rows (raw):** 225,036
- **Final training set:** 54,486 rows
- joy: 12,539 | disgust: 11,983 | sadness: 9,666 | surprise: 6,418 | fear: 6,334 | anger: 5,546 | neutral: 2,000
- **Train / Val / Test split:** 40,864 / 5,449 / 8,173
## Performance
### Test Set Results (8,173 samples)
| Emotion | Precision | Recall | F1-Score | Support |
|---------|-----------|--------|----------|---------|
| anger | 0.70 | 0.75 | **0.73** | 832 |
| disgust | 0.81 | 0.64 | **0.72** | 1,797 |
| fear | 0.72 | 0.74 | **0.73** | 950 |
| joy | 0.82 | 0.80 | **0.81** | 1,881 |
| sadness | 0.72 | 0.77 | **0.75** | 1,450 |
| surprise | 0.87 | 0.87 | **0.87** | 963 |
| neutral | 0.22 | 0.39 | **0.28** | 300 |
- **Accuracy:** 0.74
- **Weighted Avg F1:** **0.75**
- **Macro Avg F1:** 0.69
## How to Use
### Quick inference with `transformers`
```python
from transformers import pipeline
classifier = pipeline(
"text-classification",
model="boffire/kabyle-emotion-xlmr",
device=0 # use -1 for CPU
)
# Example sentences
examples = [
"Tafyirt 1", # → sadness (0.98)
"Tafyirt tis 2", # → joy (0.72)
"Tafyirt tis 3", # → neutral / sadness
]
for text in examples:
result = classifier(text, top_k=None)
top = sorted(result[0], key=lambda x: x["score"], reverse=True)[0]
print(f"{text} → {top['label']} ({top['score']:.3f})")
```
### Loading the model directly
```python
from transformers import AutoTokenizer, AutoModelForSequenceClassification
tokenizer = AutoTokenizer.from_pretrained("boffire/kabyle-emotion-xlmr")
model = AutoModelForSequenceClassification.from_pretrained("boffire/kabyle-emotion-xlmr")
# Tokenize and predict
inputs = tokenizer("Imir-a, Muiriel tesɛa 20 n yiseggasen.", return_tensors="pt", truncation=True)
outputs = model(**inputs)
```
## Training Details
| Hyperparameter | Value |
|----------------|-------|
| Epochs | 6 (with early stopping, patience=2) |
| Batch size | 32 per device (effective 64 with gradient accumulation) |
| Learning rate | 2e-5 |
| Max sequence length | 96 |
| Weight decay | 0.01 |
| Warmup steps | ~10% of total steps |
| Mixed precision | FP16 |
| Class weights | Balanced (`sklearn.utils.class_weight.compute_class_weight`) |
| Optimizer | AdamW (Hugging Face default) |
| Best checkpoint | Epoch 6 (loaded automatically via `load_best_model_at_end`) |
## Limitations & Caveats
1. **Silver labels:** Ground-truth emotions were projected from an English classifier. Some labels may not perfectly capture Kabyle cultural or emotional nuance.
2. **Neutral class weakness:** The `neutral` class performs poorly (F1 ~0.28) because it contains many low-confidence English predictions. Consider treating it as a "no strong emotion" fallback rather than a reliable label.
3. **Translation quality:** The parallel corpus includes round-trip translated sentences. Imperfect translations may introduce label noise.
4. **No native speaker validation:** The test set was held out from the same silver-labeled pool. A small native-annotated benchmark would give a more accurate human ceiling.
5. **Imbalanced source:** Tatoeba data is skewed toward simple, short sentences. Performance may degrade on longer, more complex Kabyle text (social media, literature, etc.).
## Intended Use
- **Research** in low-resource NLP and Afro-Asiatic language processing.
- **Downstream applications** requiring coarse emotion signals in Kabyle text (e.g., content moderation, mental-health screening, customer feedback analysis).
- **Baseline** for future Kabyle emotion models trained on native annotations.
## Citation
If you use this model, please cite:
```bibtex
@misc{boffire_kabyle_emotion_xlmr,
title = {Kabyle Emotion Classifier},
author = {Boffire},
year = {2026},
howpublished = {\url{https://huggingface.co/boffire/kabyle-emotion-xlmr}},
note = {Fine-tuned XLM-RoBERTa for 7-class emotion detection in Kabyle via cross-lingual label transfer from English}
}
```
## License
This model is released under the **Apache 2.0** license. The base XLM-RoBERTa weights and the English emotion classifier (`j-hartmann/emotion-english-distilroberta-base`) are subject to their respective original licenses.
## Acknowledgments
- [Tatoeba Project](https://tatoeba.org) for the English–Kabyle parallel corpus.
- [j-hartmann](https://huggingface.co/j-hartmann) for the English emotion classifier used for label projection.
- Hugging Face `transformers`, `datasets`, and `accelerate` teams for the training infrastructure.