Polydesk-logotype
Polydesk.ai — Header

Text Classification (Classification de Texte)

La text classification (ou classification de texte, aussi appelée text categorization) est une tâche de traitement automatique du langage naturel qui consiste à attribuer automatiquement une ou plusieurs catégories prédéfinies à un document, une phrase ou un segment de texte.

Vous recevez 10 000 tickets de support. Il faut les router : problème technique, facturation, demande commerciale, retour produit. Manuellement, c’est des heures de travail. Un classifieur de texte le fait en quelques secondes avec un taux de précision qui dépasse souvent 95%.

La text classification est probablement la tâche NLP la plus déployée en production. Elle couvre un spectre très large d’applications : filtrage de spam, analyse de sentiment, catégorisation d’actualités, modération de contenu, détection de fake news, routage de tickets, classification de documents juridiques, triage médical, et bien d’autres. Chaque fois que vous assignez un texte à une catégorie, c’est de la text classification.

Text Classification en bref
Catégorie
Tâche NLP fondamentale (classification supervisée)
Input
Texte brut (document, phrase, paragraphe, email, tweet…)
Output
Une ou plusieurs catégories avec scores de confiance
Types
Single-label, multi-label, hiérarchique
Benchmarks clés
AG News (4 classes), DBpedia (14 classes), TREC (6/50 classes), GLUE
SOTA
~95,5% accuracy sur AG News (BERT fine-tuné + variantes)
Outils
Hugging Face Transformers, scikit-learn, spaCy, FastText

Types de classification de texte

Toutes les tâches de text classification ne sont pas identiques. On distingue trois grands types selon le nombre et la structure des catégories.

Classification single-label (mono-étiquette)

Chaque texte est assigné à exactement une catégorie parmi un ensemble fini. C’est le cas le plus courant. Exemples : un email est soit « spam » soit « non-spam » (classification binaire), un article d’actualité appartient à une seule rubrique (monde, sport, économie, technologie), un ticket de support est routé vers un seul département.

Classification multi-label (multi-étiquette)

Un texte peut être assigné simultanément à plusieurs catégories. Exemple : un article de blog peut être tagué « intelligence artificielle », « productivité » et « tutoriel » en même temps. Un document juridique peut relever du droit du travail et du droit des contrats. Le modèle doit prédire un ensemble (éventuellement vide) de labels pour chaque texte.

La multi-label est nettement plus complexe que la single-label car le nombre de combinaisons possibles de labels explose. Un ensemble de 20 labels possibles produit 2^20 = 1 048 576 combinaisons théoriques.

Classification hiérarchique

Les catégories sont organisées en arborescence. Exemple : « Sport > Football > Ligue 1 » ou « Technologie > IA > NLP > Classification de texte ». Le modèle doit respecter la hiérarchie : si un texte est classé dans « Ligue 1 », il doit aussi être classé dans « Football » et « Sport ». Des architectures spécifiques comme les réseaux hiérarchiques avec attention (HAN) ou les approches par contrastive learning hiérarchique (HGCLR) sont conçues pour cette tâche.

Classification zero-shot

Un cas particulier de plus en plus utilisé : classifier un texte dans des catégories pour lesquelles le modèle n’a reçu aucun exemple d’entraînement. Les LLM et les modèles d’inférence textuelle (NLI) comme BART-large-mnli permettent de le faire en formulant la classification comme une tâche d’entailment. C’est extrêmement pratique quand vous n’avez pas de données annotées, mais les performances sont inférieures à un modèle fine-tuné sur le domaine.


Les méthodes de text classification

Approche par règles

La forme la plus simple : des règles if/then basées sur des mots-clés ou des expressions régulières. Si l’email contient « viagra » ou « gain money fast », c’est du spam. Si le ticket mentionne « facture » ou « paiement », routez vers la comptabilité.

Les systèmes à base de règles sont transparents, ne nécessitent pas de données d’entraînement, et sont rapides. Mais ils sont fragiles (une faute d’orthographe contourne la règle), coûteux à maintenir (chaque nouveau cas nécessite une nouvelle règle), et ne capturent pas les nuances de contexte. Ils restent utiles comme première couche de filtrage ou comme complément d’un modèle ML.

Machine learning classique

Les approches ML classiques transforment le texte en vecteurs numériques puis entraînent un classifieur supervisé.

Représentation du texte : Bag-of-Words (BoW) compte la fréquence de chaque mot. TF-IDF pondère les mots par leur importance relative dans le corpus. Les n-grams (bigrammes, trigrammes) capturent les séquences de mots courantes.

Naive Bayes : classifieur probabiliste rapide et simple. Le Multinomial Naive Bayes avec features TF-IDF est une baseline solide qui atteint souvent 85-90% d’accuracy sur des tâches de classification standard. Idéal pour un premier prototype.

SVM (Support Vector Machine) : le SVM linéaire avec features TF-IDF a longtemps été le standard industriel. Il excelle dans les espaces de haute dimension (typique du texte) et gère bien les datasets déséquilibrés avec une bonne régularisation.

Logistic Regression : simple, interprétable (les coefficients indiquent quels mots pèsent le plus dans chaque classe), et souvent compétitive avec les SVM. C’est un excellent choix quand l’explicabilité est importante.

Random Forest / XGBoost : les méthodes ensemblistes fonctionnent bien sur des features tabulaires mais sont généralement moins performantes que les SVM linéaires sur du texte brut avec TF-IDF. Elles deviennent intéressantes quand on combine des features textuelles avec des features structurées (métadonnées, features numériques).

FastText

FastText, développé par Facebook Research (Meta), est un classifieur de texte ultra-rapide basé sur des word embeddings et des n-grams de sous-mots. Il entraîne un modèle en quelques secondes sur des millions de documents et atteint des performances proches des CNN pour une fraction du coût de calcul. C’est la solution de choix quand la vitesse d’entraînement et d’inférence prime sur la dernière fraction de pourcentage d’accuracy.

# Installation et entraînement FastText en ligne de commande
pip install fasttext
# Format : __label__categorie texte du document
# Exemple de fichier train.txt :
# __label__sport Le PSG remporte le match 3-0
# __label__tech Apple lance son nouveau processeur

fasttext supervised -input train.txt -output model -epoch 25 -lr 1.0 -wordNgrams 2

Deep learning

TextCNN (Kim, 2014) : applique des convolutions 1D sur les séquences de word embeddings avec des fenêtres de tailles différentes (typiquement 3, 4, 5 mots) pour capturer les patterns locaux discriminants. Rapide à entraîner, efficace pour les textes courts. Accuracy typique sur AG News : ~92%.

RNN / BiLSTM : les réseaux récurrents et LSTM bidirectionnels capturent les dépendances séquentielles et le contexte longue distance. Plus lents que les CNN mais meilleurs sur les documents longs. L’ajout d’un mécanisme d’attention (Hierarchical Attention Network) améliore la performance en pondérant les mots et phrases les plus informatifs.

Transformers pré-entraînés : BERT, RoBERTa, DeBERTa, XLNet et leurs variantes dominent tous les benchmarks de text classification. Le paradigme est simple : prendre un modèle pré-entraîné sur un large corpus, ajouter une couche de classification sur le token [CLS], et fine-tuner sur les données de la tâche cible. BERT fine-tuné atteint ~94,5% d’accuracy sur AG News, surpassant les SVM d’environ 9 points.

MéthodeAG News (accuracy)DBpedia (accuracy)VitesseUsage recommandé
Naive Bayes + TF-IDF~88%~96%Très rapidePrototype, baseline
SVM linéaire + TF-IDF~91%~98%RapideProduction à haut volume, interprétabilité
FastText~92%~98%Très rapideGros volume, latence faible
TextCNN~92%~98%RapideTextes courts, compromis vitesse/précision
BiLSTM + Attention~93%~99%MoyenDocuments longs
BERT-base fine-tuné~94,5%~99,3%LentPrécision maximale, datasets moyens
RoBERTa / DeBERTa~95,5%~99,4%LentSOTA, recherche
Combien d’exemples pour dépasser un LLM en zero-shot ? Une étude présentée à EMNLP 2025 a montré qu’environ 100 exemples annotés suffisent pour qu’un petit modèle spécialisé fine-tuné (type BERT-base) dépasse un grand LLM en zero-shot/few-shot sur des tâches de classification de texte standard. Au-delà de 500 exemples, l’écart se creuse nettement en faveur du modèle fine-tuné. Moralité : si vous avez des données annotées, fine-tunez un petit modèle plutôt que de payer des requêtes LLM.

LLM pour la classification

Les grands modèles de langage comme GPT, Claude et Gemini peuvent classifier du texte en zero-shot via un simple prompt : « Classifie ce texte dans l’une des catégories suivantes : sport, politique, technologie, culture. » C’est la solution la plus rapide à mettre en place (pas de données d’entraînement, pas de fine-tuning).

L’approche SALSA (présentée à AAAI 2026) illustre la tendance récente : mapper chaque label de classe sur un token de sortie distinct, construire des prompts structurés, et projeter la sortie du modèle uniquement sur les logits des tokens de classe pertinents. Cela permet une classification efficace en un seul forward pass.

En pratique, les LLM en zero-shot atteignent 85-92% d’accuracy sur les benchmarks standard de classification, ce qui est excellent pour un prototypage sans données. Mais pour la production à haut volume, un modèle spécialisé fine-tuné est plus précis, plus rapide et nettement moins coûteux.


Benchmarks de référence

DatasetClassesTrain / TestTypeUsage
AG News4 (World, Sports, Business, Sci/Tech)120 000 / 7 600Single-labelBenchmark principal pour la catégorisation d’actualités
DBpedia14 catégories ontologiques560 000 / 70 000Single-labelClassification de topic, large échelle
TREC-6 / TREC-506 ou 50 types de questions5 452 / 500Single-labelClassification de questions
IMDb2 (positif/négatif)25 000 / 25 000BinaireSentiment analysis
SST-22 (positif/négatif)~67 000 / 1 800BinaireSentiment analysis (phrases)
20 Newsgroups20 groupes thématiques11 314 / 7 532Single-labelClassification de documents, corpus classique
Yelp Reviews5 (1-5 étoiles)650 000 / 50 000Single-labelClassification fine-grained de sentiment
GoEmotions27 émotions + neutre~43 000 / ~5 400Multi-labelDétection d’émotions fines

Les résultats sur ces benchmarks sont utiles pour comparer les architectures, mais attention : les performances sur AG News ou DBpedia (textes courts, catégories bien séparées) ne prédisent pas les performances sur vos données métier (vocabulaire spécifique, catégories ambiguës, textes bruités).


Applications concrètes

Détection de spam

L’application historique de la text classification. Les filtres de spam modernes combinent des règles (listes noires, patterns d’URL), des features statistiques (ratio de majuscules, nombre de liens) et des modèles ML/DL pour classifier les emails entrants. Les taux de détection dépassent 99% avec des taux de faux positifs inférieurs à 0,1%.

Routage de tickets de support

Classifier automatiquement les tickets entrants (technique, facturation, retour produit, demande commerciale) pour les router vers la bonne équipe. Réduit le temps de première réponse de 40 à 60% en éliminant le tri manuel. Un classifieur BERT fine-tuné sur quelques milliers de tickets historiques annotés suffit généralement.

Modération de contenu

Classifier les commentaires, posts et messages comme conformes, toxiques, haineux, violents ou sexuellement explicites. Les plateformes sociales utilisent des classifieurs multi-label massifs entraînés sur des millions d’exemples annotés. La modération automatique gère le volume, mais la vérification humaine reste nécessaire pour les cas limites.

Catégorisation de documents

Organiser automatiquement une base documentaire (contrats, rapports, correspondance) dans une taxonomie prédéfinie. Essentiel pour les cabinets juridiques, les administrations, et les entreprises avec un gros volume documentaire. La classification hiérarchique est particulièrement pertinente ici.

Détection d’intention (intent classification)

Dans les chatbots et assistants IA, la première étape est de classifier l’intention de l’utilisateur : veut-il poser une question, faire une réclamation, prendre un rendez-vous, annuler une commande ? La détection d’intention est une forme de text classification sur des textes courts, souvent avec des dizaines voire des centaines de classes d’intention.

Détection de fake news

Classifier les articles et posts comme fiables ou trompeurs en analysant le style d’écriture, les sources citées, le ton, et les patterns linguistiques caractéristiques de la désinformation. Un domaine actif de recherche où les LLM montrent des résultats prometteurs, mais où la robustesse aux techniques d’évasion reste un défi.

Triage médical

Classifier les comptes-rendus médicaux, les notes cliniques, ou les messages patients par spécialité, urgence, ou pathologie probable. Des modèles spécialisés comme BioBERT ou ClinicalBERT sont fine-tunés sur du texte biomédical pour cette tâche.


Pipeline complète de text classification

Voici les étapes d’un projet de text classification de bout en bout.

Étape 1 : Définir la taxonomie

Avant de toucher au code, définissez précisément vos catégories. Chaque catégorie doit être mutuellement exclusive (en single-label), clairement définie, et accompagnée de guidelines d’annotation avec des exemples positifs et négatifs. Un nombre de catégories entre 3 et 20 est gérable. Au-delà de 50, envisagez une classification hiérarchique.

Étape 2 : Collecter et annoter les données

Visez un minimum de 100 exemples par classe pour un premier modèle, idéalement 500 à 2 000 par classe pour un modèle robuste. Faites annoter par au moins 2 personnes et mesurez l’accord inter-annotateurs (kappa de Cohen > 0,7 est un bon seuil). Si vous n’avez pas de données, commencez avec un LLM en zero-shot pour pré-annoter, puis corrigez manuellement.

Étape 3 : Choisir et entraîner le modèle

Le choix dépend de vos contraintes :

ContrainteModèle recommandéPourquoi
Pas de données annotéesLLM zero-shot ou BART-large-mnliFonctionne sans entraînement
Peu de données (< 500 exemples)SetFit ou few-shot fine-tuningEfficace avec peu d’exemples
Données moyennes (500-10 000)BERT/CamemBERT fine-tunéMeilleur rapport précision/effort
Gros volume / latence critiqueFastText ou DistilBERTInférence ultra-rapide
Interprétabilité requiseLogistic Regression + TF-IDFCoefficients explicables
Précision maximaleRoBERTa/DeBERTa fine-tunéSOTA, mais plus lourd

Étape 4 : Évaluer rigoureusement

Ne vous fiez pas uniquement à l’accuracy globale, surtout si vos classes sont déséquilibrées. Utilisez le F1-score pondéré, la matrice de confusion, et la précision/rappel par classe. Un modèle avec 95% d’accuracy globale peut avoir 60% de rappel sur une classe minoritaire critique.

Étape 5 : Déployer et monitorer

Le modèle déployé doit être monitoré en continu. Le data drift (changement de la distribution des textes entrants) dégrade les performances au fil du temps. Mettez en place un échantillonnage régulier des prédictions avec vérification humaine, et réentraînez le modèle quand les métriques se dégradent.


Tutoriel : text classification en Python

Approche 1 : scikit-learn (ML classique)

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_split

# Données d'exemple
textes = [
    "Le PSG remporte la Ligue des Champions",
    "Apple lance un nouveau MacBook Pro",
    "La Bourse de Paris en hausse de 2%",
    "Mbappé marque un triplé historique",
    "Google dévoile son nouveau modèle d'IA",
    "Le CAC 40 atteint un record historique",
    # ... ajoutez vos données
]
labels = ["sport", "tech", "economie", "sport", "tech", "economie"]

X_train, X_test, y_train, y_test = train_test_split(
    textes, labels, test_size=0.2, random_state=42)

# Pipeline TF-IDF + Logistic Regression
pipeline = Pipeline([
    ('tfidf', TfidfVectorizer(max_features=10000, ngram_range=(1, 2))),
    ('clf', LogisticRegression(max_iter=1000, C=1.0))
])

pipeline.fit(X_train, y_train)
predictions = pipeline.predict(X_test)
print(classification_report(y_test, predictions))

Approche 2 : Hugging Face Transformers (BERT fine-tuning)

from transformers import (AutoTokenizer, AutoModelForSequenceClassification,
                          TrainingArguments, Trainer)
from datasets import load_dataset
import numpy as np
from sklearn.metrics import accuracy_score, f1_score

# Charger le dataset AG News depuis Hugging Face
dataset = load_dataset("ag_news")

# Préparer le tokenizer
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)

def tokenize(batch):
    return tokenizer(batch["text"], padding="max_length",
                     truncation=True, max_length=128)

dataset = dataset.map(tokenize, batched=True)
dataset = dataset.rename_column("label", "labels")
dataset.set_format("torch", columns=["input_ids", "attention_mask", "labels"])

# Charger le modèle avec 4 classes
model = AutoModelForSequenceClassification.from_pretrained(
    model_name, num_labels=4)

def compute_metrics(eval_pred):
    preds = np.argmax(eval_pred.predictions, axis=1)
    acc = accuracy_score(eval_pred.label_ids, preds)
    f1 = f1_score(eval_pred.label_ids, preds, average="weighted")
    return {"accuracy": acc, "f1": f1}

training_args = TrainingArguments(
    output_dir="./bert-ag-news",
    num_train_epochs=3,
    per_device_train_batch_size=32,
    per_device_eval_batch_size=64,
    learning_rate=2e-5,
    weight_decay=0.01,
    eval_strategy="epoch",
    save_strategy="epoch",
    load_best_model_at_end=True,
)

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset["train"],
    eval_dataset=dataset["test"],
    compute_metrics=compute_metrics,
)

trainer.train()
# Accuracy attendue : ~94-95% sur AG News

Approche 3 : Classification zero-shot (sans données d’entraînement)

from transformers import pipeline

# Classifieur zero-shot basé sur NLI (Natural Language Inference)
classifier = pipeline("zero-shot-classification",
                      model="facebook/bart-large-mnli")

texte = "La Fed maintient ses taux d'intérêt inchangés"
categories = ["sport", "politique", "économie", "technologie", "culture"]

result = classifier(texte, categories)
for label, score in zip(result["labels"], result["scores"]):
    print(f"{label:15} {score:.3f}")

# économie        0.892
# politique       0.076
# culture         0.017
# technologie     0.010
# sport           0.005
Astuce : SetFit pour le few-shot Si vous avez entre 8 et 100 exemples par classe, SetFit (Sentence Transformers Fine-Tuning) de Hugging Face est remarquablement efficace. Il fine-tune un modèle Sentence Transformer avec du contrastive learning puis entraîne un classifieur sur les embeddings. Avec seulement 8 exemples par classe, SetFit atteint souvent des performances proches d’un BERT fine-tuné sur des centaines d’exemples.

Text classification pour le français

L’écosystème français est bien servi pour la classification de texte.

CamemBERT : modèle BERT pré-entraîné sur le corpus français OSCAR. C’est le backbone recommandé pour fine-tuner un classifieur en français. Il capture les spécificités du français (accord, élision, morphologie riche) mieux que les modèles multilingues.

FlauBERT : alternative à CamemBERT avec des performances comparables. Disponible en versions base et large.

Modèles multilingues : XLM-RoBERTa fonctionne correctement en français sans fine-tuning spécifique. Pratique quand vous devez classifier des textes dans plusieurs langues avec un seul modèle.

FastText : supporte nativement le français avec des word vectors pré-entraînés. Excellent pour la classification à grande échelle quand la vitesse est prioritaire.

Recommandation pour le français Pour un projet de classification en français avec au moins 500 exemples annotés par classe, fine-tunez CamemBERT. Avec moins de données, utilisez SetFit avec un Sentence Transformer multilingue, ou un LLM en zero-shot pour constituer un premier jeu de données d’entraînement.

Bonnes pratiques

Commencez simple. Un Logistic Regression + TF-IDF entraîné en 30 secondes est un excellent point de départ. Si les performances sont suffisantes pour votre cas d’usage, inutile de déployer un Transformer. La complexité doit être justifiée par un gain mesurable.

Gérez le déséquilibre des classes. Si votre classe « fraude » représente 1% des exemples, un modèle naïf qui prédit toujours « non-fraude » aura 99% d’accuracy mais sera inutile. Utilisez le suréchantillonnage (SMOTE), le sous-échantillonnage, les poids de classe dans la loss function, ou le F1-score comme métrique plutôt que l’accuracy.

Soignez vos données plus que votre modèle. Nettoyer vos données, corriger les annotations incohérentes, et ajouter des exemples difficiles bien annotés apportera presque toujours un gain supérieur à changer d’architecture de modèle.

Utilisez la validation croisée. Sur des datasets de petite taille, une seule split train/test peut donner des résultats trompeurs. La validation croisée k-fold (k=5 ou k=10) donne une estimation plus fiable de la performance.

Testez le zero-shot avant de collecter des données. Un classifieur BART-large-mnli ou un prompt LLM bien structuré peut atteindre 85-90% sans aucune donnée annotée. Évaluez cette baseline avant d’investir dans l’annotation.

Pensez au coût total. Un BERT fine-tuné est gratuit à l’inférence (hors infrastructure). Un LLM via API coûte à chaque requête. Sur 100 000 classifications par mois, la différence se chiffre en centaines d’euros.


Questions fréquentes sur la text classification

Quelle est la différence entre text classification et NER ?

La text classification assigne une catégorie à un texte entier (ou à un segment). La NER (Named Entity Recognition) identifie et étiquette des entités spécifiques à l’intérieur du texte (personnes, lieux, organisations). Concrètement, la text classification dirait « cet article parle de sport », tandis que la NER identifierait « Mbappé » comme une personne et « PSG » comme une organisation dans ce même article. Les deux tâches sont complémentaires et souvent combinées dans les pipelines NLP.

Combien d’exemples annotés faut-il pour entraîner un classifieur de texte ?

Cela dépend de la méthode. En zero-shot (LLM ou NLI) : 0. Avec SetFit : 8 à 64 exemples par classe suffisent souvent. Avec un modèle BERT fine-tuné : 100 à 500 exemples par classe pour un premier modèle fonctionnel, 1 000 à 5 000 pour des performances robustes. Avec du ML classique (SVM + TF-IDF) : plus de données sont nécessaires, typiquement 1 000+ exemples par classe. La recherche EMNLP 2025 montre que le seuil de rentabilité se situe autour de 100 exemples : au-delà, un petit modèle fine-tuné bat systématiquement un gros LLM en zero-shot.

Comment gérer la classification multi-label en pratique ?

Deux approches principales. La transformation en problème binaire (Binary Relevance) : entraîner un classifieur indépendant pour chaque label (le texte est-il « sport » ? oui/non. Est-il « politique » ? oui/non.). C’est simple mais ignore les corrélations entre labels. La seconde approche utilise un modèle unique avec une sortie sigmoid par label (au lieu d’un softmax). Avec Hugging Face, passez problem_type="multi_label_classification" dans la configuration du modèle et utilisez la BCEWithLogitsLoss. Les Transformers gèrent bien la multi-label car le token [CLS] encode une représentation globale du document qui peut être projetée simultanément sur plusieurs labels.

Quelle est la meilleure approche pour classifier des textes très courts (tweets, SMS) ?

Les textes très courts (moins de 20 mots) manquent de contexte, ce qui rend la classification plus difficile. Les CNN (TextCNN) sont historiquement performants sur les textes courts car ils capturent des patterns locaux discriminants. Les Transformers restent compétitifs mais leur avantage (capture du contexte longue distance) est moins marqué sur des textes courts. Pour les tweets spécifiquement, des modèles comme Twitter-RoBERTa (pré-entraîné sur des millions de tweets) sont optimisés pour le langage informel, les emojis, les hashtags et les abréviations.

Comment expliquer les prédictions d’un classifieur de texte ?

Plusieurs techniques existent. Pour les modèles linéaires (Logistic Regression, SVM linéaire), les coefficients du modèle indiquent directement quels mots contribuent le plus à chaque classe. Pour les modèles profonds, LIME (Local Interpretable Model-agnostic Explanations) et SHAP génèrent des explications en perturbant l’entrée et en observant l’impact sur la prédiction. Les Transformers offrent aussi l’attention visualization : examiner les poids d’attention du modèle pour voir quels mots il « regarde » lors de la classification. L’outil Captum (PyTorch) fournit des méthodes d’attribution intégrées pour les modèles Hugging Face.

Polydesk.ai — Footer