Aller au contenu principal
Guides & Stratégie• 8 min de lecture

Corpus d'entraînement NLP en français africain : construire et enrichir

Construire un corpus d'entraînement NLP en français africain pour WhatsApp. Sources de données, annotation, augmentation et entraînement de modèles adaptés aux marchés africains.

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.

#whatsapp-business-api-guide#automatisation-whatsapp-flows#chatbot-whatsapp-guide
Pablo Lenormand
Pablo LenormandCo-fondateur & CPO

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 gratuit