File size: 5,600 Bytes
9993d17
17bc023
 
 
9993d17
17bc023
 
 
 
 
 
9993d17
17bc023
 
 
 
 
9993d17
 
17bc023
9993d17
17bc023
9993d17
17bc023
 
 
 
9993d17
17bc023
9993d17
17bc023
9993d17
17bc023
9993d17
17bc023
 
 
 
 
 
 
 
 
9993d17
17bc023
9993d17
17bc023
9993d17
17bc023
 
 
9993d17
17bc023
 
 
9993d17
17bc023
 
 
9993d17
17bc023
9993d17
17bc023
9993d17
17bc023
 
 
 
 
 
9993d17
17bc023
9993d17
17bc023
 
 
 
 
 
 
 
 
9993d17
17bc023
9993d17
17bc023
9993d17
17bc023
 
 
9993d17
17bc023
 
 
 
 
 
9993d17
17bc023
9993d17
17bc023
9993d17
17bc023
9993d17
17bc023
 
 
 
 
 
 
 
 
9993d17
17bc023
 
 
 
9993d17
17bc023
9993d17
17bc023
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9993d17
17bc023
9993d17
17bc023
9993d17
17bc023
 
 
 
 
 
 
 
 
 
9993d17
17bc023
9993d17
 
 
17bc023
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
---
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 🇲🇦*