--- 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 🇲🇦*