BERTal / README.md
MedAdil's picture
Upload README.md with huggingface_hub
17bc023 verified
|
Raw
History Blame Contribute Delete
5.6 kB
---
language:
- ar
- fr
tags:
- text-classification
- darija
- arabic
- moroccan-arabic
- arabizi
- nlp
- lora
- peft
- bertouch
license: mit
base_model: AbderrahmanSkiredj1/BERTouch
pipeline_tag: text-classification
---
# 🇲🇦 BERTal — Classification Sémantique de Messages en Darija Marocaine
> **Comprendre la Darija, l'Arabizi et le Français — là où les modèles classiques échouent.**
BERTal est un modèle de classification de texte fine-tuné sur **BERTouch** via la méthode **LoRA**,
spécialisé dans la compréhension sémantique des messages rédigés en **Darija marocaine**,
en **Arabizi** (écriture latine du dialecte) et en **Français** — y compris leurs mélanges
(*Code-switching*), phénomène omniprésent dans la communication numérique marocaine.
---
## 🎯 Tâche
Classification automatique de messages en **7 catégories métier** :
| Catégorie | Description |
|---|---|
| 🔵 Recrutement | Offres d'emploi, CV, entretiens, stages |
| 🟢 Personnel | Famille, amis, échanges informels |
| 🟠 Commercial | Vente, achat, prix, promotions |
| 🟣 Administratif | Documents officiels, CNSS, CIN, commune |
| 🩵 Education | Examens, cours, université, concours |
| 🔴 Santé | Médecin, pharmacie, hôpital, médicaments |
| ⚫ Autre | Sport, divertissement, actualités |
---
## 🧠 Pourquoi BERTal ?
La **Darija marocaine** est l'une des langues les plus parlées au Maghreb,
utilisée quotidiennement par plus de **40 millions de personnes**,
mais quasi absente des ressources NLP existantes. Elle présente trois défis majeurs :
-**Aucune orthographe standardisée** — chaque locuteur écrit à sa façon
-**Arabizi omniprésent** — mélange de chiffres et de lettres latines (`3`, `7`, `9`)
-**Code-switching permanent** — Darija + Français dans la même phrase
BERTal relève ces défis en s'appuyant sur **BERTouch**, le seul modèle BERT
pré-entraîné nativement sur la Darija marocaine, et en l'adaptant via **LoRA**
sur un dataset multilingue de **351 573 phrases** couvrant les trois scripts.
---
## 📊 Performances
| Évaluation | Score |
|---|---|
| Accuracy (validation, 52 736 phrases) | **81.34%** |
| Accuracy (jeu de test inédit 70 phrases multilingues) | **74.3%** |
| Baseline sans fine-tuning | 11.4% |
| Gain total | **+62.9 points** |
### Résultats par catégorie (jeu de test 70 phrases)
| Catégorie | Score |
|---|---|
| Recrutement | 90% |
| Santé | 90% |
| Commercial | 80% |
| Autre | 80% |
| Personnel | 60% |
| Administratif | 60% |
| Education | 60% |
---
## 🗂️ Dataset d'entraînement
Le modèle a été entraîné sur un dataset multilingue construit en 4 versions itératives
à partir du corpus [ATLASIA](https://huggingface.co/datasets/atlasia/moroccan_darija_domain_classifier_dataset),
enrichi par génération synthétique via **Gemini 2.5 Flash**.
| Script | Lignes | % |
|---|---|---|
| Arabe (Darija) | 191 654 | 54.5% |
| Arabizi | 107 567 | 30.6% |
| Français | 52 352 | 14.9% |
| **Total** | **351 573** | **100%** |
Déséquilibre inter-classes : **1.35x** (quasi équilibré naturellement).
---
## ⚙️ Configuration LoRA
```python
LoraConfig(
task_type = TaskType.SEQ_CLS,
r = 16,
lora_alpha = 32,
lora_dropout = 0.1,
target_modules = ["query", "value"]
)
```
- **Paramètres entraînables** : 595 207 / 135 793 934 (**0.44%**)
- **Époques** : 3
- **GPU** : Tesla T4 (Google Colab)
- **Batch size** : 32
---
## 🚀 Utilisation
```python
import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModelForSequenceClassification
from peft import PeftModel
CATEGORIES = [
'Recrutement', 'Personnel', 'Commercial',
'Administratif', 'Education', 'Sante', 'Autre'
]
label2id = {label: idx for idx, label in enumerate(CATEGORIES)}
id2label = {idx: label for idx, label in enumerate(CATEGORIES)}
# Charger le modèle
tokenizer = AutoTokenizer.from_pretrained("MedAdil/BERTal")
base_model = AutoModelForSequenceClassification.from_pretrained(
"AbderrahmanSkiredj1/BERTouch",
num_labels = 7,
id2label = id2label,
label2id = label2id,
ignore_mismatched_sizes = True
)
model = PeftModel.from_pretrained(base_model, "MedAdil/BERTal")
model.eval()
# Classifier un message
def classifier(texte: str) -> dict:
inputs = tokenizer(texte, return_tensors="pt", truncation=True, max_length=128)
with torch.no_grad():
logits = model(**inputs).logits
probas = F.softmax(logits, dim=-1)[0]
scores = {id2label[i]: round(float(p), 4) for i, p in enumerate(probas)}
label_predit = max(scores, key=scores.get)
return {"label": label_predit, "confidence": scores[label_predit], "scores": scores}
# Exemples
print(classifier("bghit nkhdem f had chrika IT"))
# → {'label': 'Recrutement', 'confidence': 0.9935, ...}
print(classifier("خصني رونديفو عند الطبيب"))
# → {'label': 'Sante', 'confidence': 0.9904, ...}
print(classifier("Je cherche un appartement à Oujda"))
# → {'label': 'Commercial', 'confidence': 0.9942, ...}
```
---
## 📝 Citation
```bibtex
@misc{mani2026bertal,
author = {Mohammed Adil MANI},
title = {BERTal: LoRA Fine-tuning of BERTouch for Multilingual
Moroccan Darija Message Classification},
year = {2026},
publisher = {Hugging Face},
url = {https://huggingface.co/MedAdil/BERTal}
}
```
---
*BERTal — Bringing NLP to the language of millions 🇲🇦*