ML Learning Hub
Appliquéintermédiaire

NLP : Pipeline de Classification de Texte

Apprendre aux machines à lire — du sac de mots aux transformers

Pipeline NLP complet : tokenisation, vectorisation TF-IDF, classification (NB/LR/SVM), évaluation F1, embeddings de mots et sentence-transformers.

45 min
10 diagrammes
7 Concepts Couverts

Prérequis

Neural Networks
Naïve Bayes

Concepts Couverts

TokenizationTF-IDFBag of WordsN-gramsCosine SimilarityWord2VecSentence Transformers

Formules Clés

TF-IDF

Fréquence du terme × inverse de la fréquence du document — élevé quand le mot est fréquent dans le doc mais rare globalement

Similarité Cosinus

Mesure de similarité des documents indépendante de la longueur du document

Perplexité

Qualité du modèle de langage — perplexité plus faible = meilleure prédiction du prochain mot

Simulation Interactive

Loading visualization…
🎯

La Révolution du NLP

motivation

En 2017, GPT-3 n'existait pas. En 2023, les LLMs écrivent du code, réussissent des examens médicaux et résument des documents juridiques. La fondation de tout le NLP — des filtres anti-spam bag-of-words aux LLMs transformeurs — est la même : représenter le texte numériquement pour que les modèles puissent le traiter. Comprendre le pipeline NLP classique (tokeniser → vectoriser → modèle → évaluer) vous donne le modèle mental pour comprendre pourquoi les transformeurs modernes fonctionnent et en quoi ils diffèrent.

Le rapport technique GPT-4 montre que le modèle entraîné sur 100× plus de texte que GPT-3 bénéficie encore du prétraitement NLP classique (tokenisation, déduplication, filtrage de la qualité des données). Les fondamentaux comptent à l'échelle.

💡

Le Pipeline NLP : 5 Étapes

intuition

Le texte brut n'est que des octets Unicode — sans signification pour un modèle. Le pipeline NLP le convertit en nombres : Tokenisation (diviser le texte en tokens — mots, sous-mots ou caractères), Construction du vocabulaire (assigner un entier ID à chaque token unique), Vectorisation (convertir les IDs de tokens en représentations numériques denses — one-hot, TF-IDF, ou word embeddings), Entraînement du modèle (classer, regrouper, générer ou récupérer), Évaluation (précision, F1, BLEU, perplexité selon la tâche).

TF-IDF : Le Vectoriseur Classique

math

Fréquence du Terme (TF) : à quelle fréquence le mot t apparaît-il dans le document d ? Fréquence du Document (DF) : combien de documents contiennent t ? IDF inverse : log(N/DFt) — les mots qui apparaissent dans chaque document (le, est, de) obtiennent un IDF presque nul. Les mots spécifiques à quelques documents obtiennent un IDF élevé. TF-IDF = TF × IDF. Le résultat est une matrice creuse de forme (n_docs × vocab_size) où chaque entrée reflète combien ce mot est caractéristique de ce document.

IDF lissé (+1 évite la division par zéro)
🔬

Du Sac de Mots aux Embeddings de Mots

deepdive

TF-IDF traite chaque mot comme indépendant — 'banque' et 'établissement financier' sont complètement non liés. Les word embeddings (Word2Vec, GloVe, FastText) apprennent des représentations vectorielles denses où les mots similaires sont proches dans l'espace vectoriel : roi - homme + femme ≈ reine. Ces vecteurs de 300 dimensions capturent des relations sémantiques que TF-IDF ne peut pas. Les transformeurs de phrases modernes (SBERT, all-MiniLM-L6-v2) produisent des vecteurs de longueur fixe pour des phrases entières, permettant la recherche sémantique, le clustering et la classification zéro-shot.

Pour la classification de texte en production en 2025 : commencer par TF-IDF + LogisticRegression comme référence, essayer ensuite les embeddings sentence-transformers + classificateur, puis affiner un BERT/DistilBERT pré-entraîné si la qualité est insuffisante.

⚙️

Pipeline de Classification de Texte

algorithm
1

Mise en minuscules, suppression de la ponctuation, suppression optionnelle des mots vides

2

Tokenisation : word_tokenize ou sous-mot (BPE/WordPiece pour les transformeurs)

3

Vectorisation : CountVectorizer → TfidfVectorizer → word2vec → embeddings BERT

4

Modèle : MultinomialNB (référence rapide), LogisticRegression (linéaire fort), SVM, BERT affiné

5

Évaluation : macro-F1 pour les classes équilibrées, F1-pondéré pour les déséquilibrées, AUC-ROC

6

Analyse d'erreurs : inspecter les échantillons mal classifiés → améliorer les caractéristiques ou l'étiquetage

</>

Pipeline de Classification NLP Complet

code
python58 lines
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import ComplementNB
from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.metrics import classification_report
import numpy as np

class="tok-comment"># ── Données texte dclass="tok-str">'exemple ────────────────────────────────────────────
corpus = [
    "algorithmes apprentissage automatique python science données",
    "réseau neuronal deep learning pytorch tensorflow",
    "traitement langage naturel classification texte bert",
    "vision par ordinateur reconnaissance image convolutif",
    "apprentissage par renforcement récompense politique agent",
    "prétraitement données ingénierie caractéristiques pipeline",
] * class="tok-num">40   class="tok-comment"># class="tok-num">240 exemples, class="tok-num">6 classes
X_texte = corpus
y = np.array(list(range(class="tok-num">6)) * class="tok-num">40)
X_train, X_test, y_train, y_test = train_test_split(
    X_texte, y, test_size=class="tok-num">0.2, stratify=y, random_state=class="tok-num">42)
idx_train = np.arange(len(X_train))
idx_test  = np.arange(len(X_test))

class="tok-comment"># ── Référence : TF-IDF + Régression Logistique ────────────────────
pipeline_lr = Pipeline([
    ('tfidfclass="tok-str">', TfidfVectorizer(
        ngram_range=(class="tok-num">1,class="tok-num">2),
        max_features=100_000,
        sublinear_tf=True,          class="tok-comment"># log(class="tok-num">1+tf) amortit les hautes fréquences
        strip_accents='unicodeclass="tok-str">',
        analyzer='wordclass="tok-str">',
        token_pattern=r'\w{class="tok-num">2,}class="tok-str">',  class="tok-comment"># ignorer les tokens d'un caractère
        min_df=class="tok-num">2,                   class="tok-comment"># ignorer les mots très rares
    )),
    (class="tok-str">'clf', LogisticRegression(C=class="tok-num">1.0, max_iter=class="tok-num">1000, class_weight=class="tok-str">'balanced')),
])

class="tok-comment"># ── Alternative : TF-IDF + LinearSVC (rapide, excellent pour le texte) ──
pipeline_svm = Pipeline([
    (class="tok-str">'tfidf', TfidfVectorizer(ngram_range=(class="tok-num">1,class="tok-num">2), max_features=100_000, sublinear_tf=True)),
    (class="tok-str">'clf',   LinearSVC(C=class="tok-num">0.5, class_weight=class="tok-str">'balanced', max_iter=class="tok-num">2000)),
])

class="tok-comment"># ── Évaluer les deux avec validation croisée ─────────────────────
for nom, pipeline in [(class="tok-str">'LR', pipeline_lr), (class="tok-str">'SVM', pipeline_svm)]:
    scores = cross_val_score(pipeline, X_texte, y, cv=class="tok-num">5, scoring=class="tok-str">'f1_macro', n_jobs=-class="tok-num">1)
    print(fclass="tok-str">"{nom}: macro-F1 = {scores.mean():.3f} ± {scores.std():.3f}")

class="tok-comment"># ── Approche moderne : embeddings de phrases ─────────────────────
from sentence_transformers import SentenceTransformer
from sklearn.linear_model import LogisticRegression

encodeur = SentenceTransformer(class="tok-str">'all-MiniLM-L6-v2')
X_emb = encodeur.encode(X_texte, batch_size=class="tok-num">256, show_progress_bar=True)
clf = LogisticRegression(max_iter=class="tok-num">1000).fit(X_emb[idx_train], y[idx_train])
print(fclass="tok-str">"Précision Sentence-BERT : {clf.score(X_emb[idx_test], y[idx_test]):.3f}")
⚠️

Pièges du Pipeline NLP

pitfall

Ajuster TfidfVectorizer sur l'ensemble de données complet fuit le vocabulaire de test dans l'entraînement — les valeurs IDF sont calculées avec les fréquences de documents de test. Toujours ajuster dans un Pipeline appliqué uniquement aux données d'entraînement. Deuxième : utiliser max_features sans min_df — les mots très rares sont bruiteux mais inclus. Définir min_df=2 ou min_df=0,001. Troisième : ignorer le déséquilibre des classes — une classe majoritaire à 95% rend la précision inutile ; utiliser macro-F1 et class_weight='balanced'. Quatrième : ne pas stemmer/lemmatiser pour les petits ensembles de données — 'courir', 'courant', 'couru' devraient mapper vers la même caractéristique.

Pour le texte non anglais, utiliser des tokeniseurs spécifiques à la langue et des modèles multilingues pré-entraînés (mBERT, XLM-RoBERTa) plutôt que des pipelines centrés sur l'anglais. De nombreuses bibliothèques NLP utilisent silencieusement le comportement anglophone par défaut.

?Vérification des Connaissances

La progression est sauvegardée dans votre navigateur — aucun compte requis.

Besoin d'un ingénieur IA ou data scientist ?

Je conçois des modèles ML sur mesure, des agents IA, de la vision par ordinateur et de l'automatisation — de l'idée à la production.