La performance de votre NLP est directement proportionnelle à la qualité de votre corpus d'entraînement. Pour le français africain avec ses dialectes et son code-switching, les datasets génériques ne suffisent pas. Vous devez construire votre propre corpus, adapté à votre marché et à vos cas d'usage.
Ce guide technique vous explique comment collecter, annoter, augmenter et utiliser un corpus NLP de qualité en français africain.
Pourquoi les datasets standard ne suffisent pas
Les grands datasets NLP en français (Common Crawl, Wikipedia, presse française) présentent plusieurs biais problématiques pour les chatbots africains :
Biais géographique : 95% des données françaises sont d'origine française, belge ou suisse. Le français africain, ses constructions syntaxiques et son vocabulaire sont marginaux.
Biais de formalité : Wikipedia et les articles de presse sont en français standard formel. Les messages WhatsApp sont informels, abrégés, avec des fautes et du code-switching.
Absence des langues locales : wolof, nouchi, darija, pidgin — aucun dataset mainstream ne les couvre correctement pour le français africain.
Biais de domaine : vos conversations WhatsApp parlent de livraisons, paiements mobile, produits locaux — pas des sujets couverts par les datasets génériques.
Sources de données pour votre corpus
Source 1 : Vos propres conversations WhatsApp (la plus précieuse)
Si vous avez un service client WhatsApp actif depuis 3+ mois, vous avez déjà un corpus en or. Ces données sont :
- Parfaitement adaptées à votre domaine
- Reflètent exactement le langage de vos clients
- Annotables avec l'aide de vos agents qui connaissent les bonnes réponses
Processus d'extraction :
# Export et préparation des conversations WhatsApp pour annotation
import json
import hashlib
from datetime import datetime
def prepare_conversations_for_annotation(raw_conversations, output_file):
"""
Prépare les conversations WhatsApp pour annotation NLP.
Anonymise les données personnelles (téléphone, noms, emails).
"""
prepared = []
for conv in raw_conversations:
for msg in conv['messages']:
if msg['role'] == 'customer' and len(msg['text']) > 5:
prepared.append({
'id': hashlib.md5(msg['text'].encode()).hexdigest()[:8],
'text': anonymize_pii(msg['text']),
'market': conv.get('market', 'unknown'),
'timestamp_hour': datetime.fromisoformat(msg['timestamp']).hour,
'intent': None, # À annoter
'entities': [], # À annoter
'language': None, # À annoter
'quality': None # À évaluer
})
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(prepared, f, ensure_ascii=False, indent=2)
print(f"Préparé {len(prepared)} messages pour annotation")
return prepared
def anonymize_pii(text):
"""Remplace les informations personnelles par des placeholders"""
import re
# Numéros de téléphone
text = re.sub(r'\+?[0-9]{8,15}', '[PHONE]', text)
# Emails
text = re.sub(r'[\w.-]+@[\w.-]+\.\w+', '[EMAIL]', text)
# Numéros de commande (mais garder le format)
text = re.sub(r'CMD-\d{4}-\d+', 'CMD-XXXX-XXXX', text)
return text
Source 2 : Collecte sur les réseaux sociaux africains
Les pages Facebook, les groupes WhatsApp publics et les commentaires Instagram des marchés africains sont des mines d'expressions authentiques.
Critères de sélection pour les données sociales :
- Pages de commerçants locaux avec beaucoup de commentaires clients
- Groupes d'entraide consommateurs (groupes "alerte consommateur" très actifs en Afrique)
- Commentaires sur les apps d'e-commerce locales
Source 3 : Augmentation de données synthétiques
Pour les intentions avec peu d'exemples, l'augmentation de données permet de multiplier votre corpus :
# Augmentation de données pour corpus africain
from openai import OpenAI
import json
client = OpenAI()
def augment_intent_examples(intent_name, existing_examples, market, n_augmented=50):
"""
Génère des exemples supplémentaires pour une intention en utilisant GPT.
Spécifique au contexte africain.
"""
market_contexts = {
'ci': "Côte d'Ivoire, clients qui peuvent utiliser du nouchi ivoirien",
'sn': "Sénégal, clients qui peuvent mixer français et wolof",
'ma': "Maroc, clients qui peuvent utiliser de la darija",
'cm': "Cameroun, clients bilingues français-anglais",
}
market_desc = market_contexts.get(market, "Afrique francophone")
prompt = f"""Tu es un expert en linguistique africaine. Génère {n_augmented} nouvelles formulations différentes pour l'intention "{intent_name}".
Contexte : messages WhatsApp de clients en {market_desc}.
Vary le niveau de formalité (formel, informel, argotique).
Include du code-switching naturel selon le marché.
Exemples existants :
{json.dumps(existing_examples[:5], ensure_ascii=False)}
Génère UNIQUEMENT les nouvelles formulations, une par ligne, sans numérotation."""
response = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}],
max_tokens=2000,
temperature=0.9 # Haute créativité pour la diversité
)
new_examples = [
line.strip()
for line in response.choices[0].message.content.split('\n')
if line.strip() and len(line.strip()) > 10
]
return new_examples[:n_augmented]
# Exemple d'utilisation
existing_order_tracking = [
"Je veux suivre ma commande",
"Où est ma livraison ?",
"Mon colis n'est pas arrivé",
]
augmented_examples = augment_intent_examples(
intent_name="suivi_commande",
existing_examples=existing_order_tracking,
market="ci", # Côte d'Ivoire
n_augmented=30
)
Processus d'annotation de qualité
L'annotation est l'étape la plus critique. Un corpus mal annoté est pire qu'un corpus absent.
Structure d'annotation recommandée
{
"annotation_schema": {
"intents": [
"suivi_commande",
"annulation",
"probleme_paiement",
"demande_information",
"reclamation",
"achat",
"retour",
"contact_agent",
"salutation",
"autre"
],
"entities": {
"ORDER_ID": "Numéro de commande",
"PRODUCT": "Produit mentionné",
"LOCATION": "Ville ou quartier",
"MONEY_AMOUNT": "Montant mentionné",
"DURATION": "Durée mentionnée",
"PAYMENT_METHOD": "Mode de paiement"
},
"languages": ["fr", "fr-ci", "fr-sn", "fr-ma", "fr-cm", "en"],
"quality": ["high", "medium", "low", "ambiguous"]
}
}
Consignes pour les annotateurs africains
GUIDE ANNOTATEURS — CORPUS NLP FRANÇAIS AFRICAIN
RÈGLE PRINCIPALE : Annotez l'INTENTION, pas les mots.
"J'attends mon truc depuis une semaine" = suivi_commande (même si "truc" est informel)
"Votre machin là, c'est quoi le prix ?" = demande_information
RÈGLES SPÉCIFIQUES AFRIQUE :
1. Les mots wolof/nouchi/darija sont normaux, pas des erreurs
2. Si le sens est clair malgré les fautes d'orthographe, annotez normalement
3. Les expressions d'insatisfaction culturelles ("c'est trop fort", "Dieu sait")
indiquent souvent une réclamation
4. "Inshallah", "waaw", "déedéet" sont des marqueurs de contexte, pas des intents
CAS AMBIGUS :
Si vous hésitez entre 2 intentions, annotez "ambiguous" avec les 2 options possibles.
Ne devinez jamais — l'ambiguïté bien documentée est précieuse.
QUALITÉ DES DONNÉES :
- high : message clair, intention évidente, aucun doute
- medium : intention probable, quelques ambiguïtés
- low : message très abrégé ou context insuffisant
Entraîner un modèle sur votre corpus
Une fois votre corpus annoté (minimum 200-300 exemples par intention), vous pouvez fine-tuner un modèle :
# Fine-tuning d'un modèle d'intention sur corpus africain
from transformers import AutoTokenizer, AutoModelForSequenceClassification, Trainer, TrainingArguments
import torch
from datasets import Dataset
def fine_tune_for_african_intent(corpus_path, model_name='cmarkea/distilcamembert-base', output_dir='./african-intent-model'):
"""
Fine-tune un modèle de classification d'intention sur corpus africain.
Utilise distilCamemBERT comme base (bon pour le français).
"""
# Charger le corpus annoté
with open(corpus_path, 'r', encoding='utf-8') as f:
corpus = json.load(f)
# Filtrer sur les annotations de haute qualité
quality_corpus = [item for item in corpus if item.get('quality') in ['high', 'medium']]
# Préparer les labels
intent_labels = list(set(item['intent'] for item in quality_corpus if item['intent']))
label2id = {label: i for i, label in enumerate(intent_labels)}
# Tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name)
def tokenize(examples):
return tokenizer(
examples['text'],
truncation=True,
padding='max_length',
max_length=128
)
# Dataset
dataset = Dataset.from_dict({
'text': [item['text'] for item in quality_corpus],
'label': [label2id[item['intent']] for item in quality_corpus]
}).map(tokenize)
# Modèle
model = AutoModelForSequenceClassification.from_pretrained(
model_name,
num_labels=len(intent_labels)
)
# Entraînement
training_args = TrainingArguments(
output_dir=output_dir,
num_train_epochs=5,
per_device_train_batch_size=16,
evaluation_strategy='epoch',
save_strategy='epoch',
load_best_model_at_end=True,
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset,
)
trainer.train()
return model, tokenizer, intent_labels
Pour approfondir, consultez notre article sur le NLP en français africain et notre guide sur la gestion des abréviations dans les chatbots.
FAQ
Q: Combien d'exemples annotés faut-il par intention pour un modèle performant ?
A: Pour un NLP de chatbot WhatsApp, les seuils empiriques sont : 50 exemples = performances très limitées, 200 exemples = performances acceptables (>75%), 500 exemples = bonnes performances (>85%), 1000+ exemples = très bonnes performances (>90%). La qualité prime sur la quantité : 200 bons exemples valent mieux que 1000 mal annotés.
Q: Peut-on utiliser ChatGPT pour annoter automatiquement un corpus ?
A: Oui, avec des précautions. GPT-4 peut annoter un corpus avec une précision de 80-85% pour le français standard. Pour les dialectes africains, la précision baisse à 65-75%. Utilisez l'annotation automatique comme premier pass, puis faites valider par des annotateurs humains les cas ambigus (score de confiance bas). Jamais d'annotation 100% automatique pour les données critiques.
Q: Comment gérer le déséquilibre de classes (certaines intentions ont beaucoup plus d'exemples) ?
A: L'oversampling (dupliquer les exemples des classes minoritaires) et l'undersampling (réduire les classes majoritaires) sont les techniques standard. L'augmentation de données avec GPT-4 est particulièrement utile pour équilibrer les classes rares. Dans les chatbots, la classe "autre" est souvent massive — sous-échantillonnez-la pour éviter que le modèle ne classe tout comme "autre".
Q: À quelle fréquence faut-il réentraîner le modèle avec de nouvelles données ?
A: Trimestriellement est une bonne cadence pour les modèles stables. Déclenchez un réentraînement plus fréquent si votre taux de fallback dépasse un seuil (>20%), si vous lancez dans un nouveau marché, ou après un changement important de votre business (nouveaux produits, nouveaux modes de paiement).
Investir dans un corpus NLP de qualité en français africain est l'une des décisions les plus impactantes pour la performance à long terme de votre chatbot WhatsApp.
Créez votre compte Whakup et accédez à nos outils d'intégration NLP pour tirer parti de votre corpus d'entraînement.

Co-fondateur et Chief Product Officer de Whakup, Pablo conçoit les fonctionnalités qui permettent aux marques africaines de maximiser leur impact sur WhatsApp.
Prêt à passer à l'action ?
Essayez Whakup gratuitement pendant 15 jours. Aucune carte bancaire requise.
Démarrer l'essai gratuitArticles similaires
Abandon de flows WhatsApp : comprendre et réduire le taux d'abandon
Analyser et réduire l'abandon de flows dans votre chatbot WhatsApp. Identifier les étapes problématiques, comprendre les causes et appliquer les corrections pour améliorer la complétion.
Benchmark WhatsApp Marketing en Afrique par secteur : données 2025
Benchmarks WhatsApp Marketing par secteur d'activité en Afrique : e-commerce, banque, santé, tourisme, immobilier. Taux d'ouverture, conversion et satisfaction pour vous situer.
Conversation analytics WhatsApp : créer un tableau de bord de pilotage
Construire un tableau de bord analytics pour piloter votre chatbot WhatsApp. Métriques clés, visualisations, alertes automatiques et reporting pour décideurs africains.