Data Science & ML · L3 · Section 6/12
Traitement du langage — intro
Progression
#Introduction au NLP
Le traitement automatique du langage applique le machine learning au texte. Les difficultés sont structurelles: ambiguïté lexicale (une même forme, plusieurs sens), dépendance au contexte (l'ordre des mots porte du sens), variabilité linguistique (fautes, argot, langues mélangées), et données volumineuses mais non structurées.
#Prérequis et objectifs
Prérequis: page « Pipeline et features » (vectorisation, split sans fuite), pages « Apprentissage supervisé » et « Évaluation et généralisation » (métriques, validation croisée), manipulations de chaînes en Python.
Objectifs d'apprentissage:
- dérouler un pipeline NLP de base: tokenisation, normalisation, vectorisation, modèle;
- comparer BoW, TF-IDF et embeddings et savoir ce que chacun ne capture pas;
- intégrer le NLP dans un protocole d'évaluation supervisé honnête (split avant vectorisation, classes déséquilibrées);
- situer les transformers pré-entraînés et le fine-tuning dans la chaîne de valeur.
#Pipeline NLP
#Tokenisation
La tokenisation découpe le texte en unités de base. Trois familles:
Par mots: simple, mais vocabulaire ouvert: mots inconnus au test (OOV) et formes fléchies jamais vues à l'entraînement.
Par sous-mots (BPE, WordPiece): décompose les mots rares en morceaux fréquents; vocabulaire fermé et de taille maîtrisée. C'est le choix de BERT et GPT.
Par caractères: aucun mot inconnu, mais séquences longues et représentations moins sémantiques.
Observation attendue: le split naïf garde « super! » et « c'est » comme blocs uniques; la version regex + minuscules produit des tokens propres et reproductibles. La normalisation (minuscules, suppression d'accents, stopwords) doit être décidée en amont et appliquée à l'identique au train et au test.
#Représentation vectorielle
#Sac de mots (BoW)
Chaque document devient un vecteur de comptages. Le vocabulaire est ajusté sur les données: pour un modèle supervisé, on ajuste le vectoriseur sur le train uniquement; un mot vu seulement au test est ignoré (ou mappé à un token spécial), ce qui dégrade légèrement, honnêtement, la performance.
Observation attendue: trois vecteurs de longueur 7 (sept mots uniques: « chat », « dort », « fromage », « la », « le », « mange », « souris »). Les deux premières phrases partagent « mange », « la », « le »; BoW les rapproche sans distinguer qui mange quoi.
#TF-IDF
TF-IDF pondère un mot par sa fréquence dans le document (TF) et sa rareté dans le corpus (IDF). Les mots omniprésents (articles, prépositions) reçoivent un poids proche de zéro; les mots discriminants ressortent.
Observation attendue: « chat » et « dort » ressortent avec un poids élevé, mais « le » et « la », présents dans les trois documents, reçoivent un TF-IDF plus faible; « maison » et « dort », uniques au document, dominent.
#Word embeddings
Les embeddings plongent les mots dans un espace vectoriel dense où la similarité cosine traduit la proximité sémantique, apprise sur de grands corpus non étiquetés.
Word2Vec: apprend à prédire un mot depuis son contexte (CBOW) ou le contexte depuis le mot (Skip-gram). Représentation statique: « avocat » (métier) et « avocat » (fruit) partagent le même vecteur.
GloVe: factorise la matrice de co-occurrences globale du corpus.
FastText: enrichit chaque mot par ses n-grammes de caractères; gère mieux les mots rares, les fautes et l'orthographe variable.
L'arithmétique vectorielle « roi - homme + femme proche de reine » illustre la régularité de l'espace; c'est une tendance statistique, pas une règle exacte, et l'exemple canonique, choisi parmi les cas qui marchent, n'est pas neutre.
#Transformers et modèles pré-entraînés
Les transformers utilisent l'attention: chaque position pondère l'influence de toutes les autres, en parallèle, sans récurrence. Pré-entraînés sur d'énormes corpus (masked language modeling pour BERT, prédiction du token suivant pour GPT), ils se spécialisent par fine-tuning sur la tâche cible.
BERT: encodeur bidirectionnel; excellent en classification et extraction, non génératif.
GPT: décodeur autorégressif; génère du texte token par token.
T5 et successeurs: seq2seq, toutes tâches formulées comme texte vers texte.
1from transformers import pipeline2 3classifier = pipeline("sentiment-analysis")4result = classifier("J'adore ce cours, il est très clair!")5print(result) # [{'label': 'POSITIVE', 'score': 0.99}]Deux garde-fous de rigueur: un pipeline d'inférence exécuté sur les données de test n'est pas une évaluation (il faut un protocole avec jeu de test réservé et métriques); et le modèle renvoie un label appris sur ses données d'entraînement, calibré pour sa langue et son domaine d'origine, pas une vérité universelle.
#Classification de texte avec protocole honnête
Observation attendue: avec StratifiedKFold(n_splits=5, shuffle=True), chaque fold de validation contient un document positif et un négatif, et les mots marqueurs (« excellent », « recommande » contre « déçu », « défectueux ») reviennent dans plusieurs documents de leur classe: le classifieur a de l'évidence dans chaque fold d'entraînement. Les folds tombent typiquement à 1.0 ou 0.5 ([1. 0.5 0.5 1. 1.] ici): avec dix exemples, une seule erreur coûte 0.5. Remplacez le découpage par cv=5 (KFold contigu, sans stratification): quatre folds de validation sur cinq ne contiennent alors qu'une seule classe ([1 1], [1 1], [0 0], [0 0]) — un fold mono-classe mesure le hasard du découpage, pas la capacité à séparer les classes. Dernière leçon: le score moyen bouge avec random_state (entre 0.70 et 0.90 sur ce jouet); sur un vrai corpus, visez des centaines d'exemples par classe avant d'interpréter le moindre écart entre modèles.
#Tâches NLP courantes
Classification de texte: détection de spam, analyse de sentiment, routage de tickets. La métrique dépend du coût des erreurs (précision contre rappel), voir la page « Évaluation et généralisation ».
Reconnaissance d'entités nommées (NER): extraire personnes, lieux, dates, montants; évaluée en exactitude par entité (entity-level F1), pas par token.
Question-réponse sur document: localiser un passage en réponse à une question, évaluée par chevauchement (F1 exact-match et partiel).
Résumé: évaluation automatique par chevauchement n-grammes (ROUGE), complétée par un jugement humain, la métrique automatique n'étant qu'indicative.
Traduction: score BLEU sur n-grammes, là aussi avec ses limites documentées (paraphrases pénalisées).
#Exercice vérifiable: mesurer l'impact de l'ordre des mots
Partez du playground de classification. Ajoutez deux documents contradictoires qui partagent leur vocabulaire: "livraison rapide mais qualité décevante" étiqueté 0 et "qualité décevante mais livraison rapide"... impossible à distinguer en BoW: c'est le point. Version opérable: ajoutez plutôt "retardée livraison excellente et" (0) et "excellente livraison et rapide" (1), relancez la CV, et comparez avec TfidfVectorizer(ngram_range=(1,2)). Corrigé: sur ce mini-corpus, les scores des folds ne changent pratiquement pas entre unigrammes et bigrammes (typiquement 0.77 dans les deux cas): douze documents, c'est trop peu pour que les collocations pèsent. Ce que vous observez en revanche: la longueur des vecteurs explose avec les bigrammes, pour un gain nul ici. Conclusion observable: l'ordre porte de l'information que le sac de mots jette, les n-grammes en récupèrent une partie — mais leur bénéfice ne se mesure que sur un corpus assez grand pour que les collocations soient significatives; à coût de vocabulaire explosé, ils ne sont pas gratuits.