Stopwords (Mots vides)
Les stopwords (ou mots vides) sont les mots les plus fréquents d’une langue qui portent peu de valeur sémantique et sont généralement filtrés lors du prétraitement de texte en NLP : articles (« le », « un »), prépositions (« de », « à »), conjonctions (« et », « mais »), pronoms (« je », « il ») et verbes auxiliaires (« être », « avoir »).
Dans un texte français typique, les stopwords représentent 30 à 50 % du volume total de mots. Les supprimer permet de réduire drastiquement la taille du vocabulaire, d’accélérer le traitement et de concentrer l’analyse sur les termes porteurs de sens. Cependant, il n’existe pas de liste universelle de stopwords : chaque librairie NLP utilise sa propre liste, et chaque cas d’usage peut nécessiter des adaptations spécifiques.
- Catégorie
- Prétraitement texte / NLP
- Type
- Filtrage de vocabulaire
- Taille liste (anglais)
- NLTK : 179 mots | spaCy : 326 mots | scikit-learn : 318 mots
- Taille liste (français)
- NLTK : ~157 mots | spaCy : ~315 mots
- Librairies
- NLTK, spaCy, Gensim, scikit-learn, Elasticsearch
- Impact
- Réduction de 30-50 % du vocabulaire
Pourquoi supprimer les stopwords
Prenez la phrase « The quick brown fox jumps over the lazy dog ». En supprimant les stopwords (« the », « over »), il reste « quick brown fox jumps lazy dog ». Le contenu sémantique essentiel est préservé. Les mots retirés n’ajoutaient rien à la compréhension du sens.
La suppression des stopwords apporte trois bénéfices concrets. Premièrement, la réduction de la dimensionnalité : un corpus de 150 000 mots uniques tombe à environ 75 000 après filtrage, ce qui accélère l’entraînement des modèles et réduit la consommation mémoire. Deuxièmement, l’amélioration de la pertinence : dans un modèle TF-IDF ou bag-of-words, les stopwords diluent les poids des termes réellement informatifs. Troisièmement, le gain de vitesse : le traitement est 30 à 40 % plus rapide avec un vocabulaire réduit.
Le concept n’est pas récent. La première concordance hébraïque, le Me’ir Nativ d’Isaac Nathan ben Kalonymus (XVe siècle), contenait déjà une page de mots non indexés (prépositions et conjonctions sans valeur substantive). L’informatique a simplement formalisé cette pratique.
Quels mots sont des stopwords
Les catégories grammaticales typiquement considérées comme stopwords incluent les articles (le, la, les, un, une, des), les prépositions (de, à, en, dans, par, pour, sur), les conjonctions (et, ou, mais, donc, car, ni), les pronoms (je, tu, il, elle, nous, vous, ils, elles, on, ce, qui, que), les verbes auxiliaires (être, avoir, dans toutes leurs conjugaisons), et les adverbes très courants (ne, pas, plus, très, tout).
En français, la liste NLTK inclut notamment toutes les formes conjuguées de « être » et « avoir » : ai, aie, aient, aies, ait, as, au, aura, aurai, auraient, aurais, etc. C’est une particularité des langues à morphologie riche : les listes de stopwords sont plus longues car un même mot possède de nombreuses formes fléchies.
Les listes de stopwords par librairie
NLTK
NLTK fournit des listes de stopwords pour plus de 20 langues. La liste anglaise contient 179 mots, la liste française environ 157 mots (principalement les conjugaisons de « être » et « avoir », les articles, les prépositions et les pronoms).
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
# Liste des langues disponibles
print(stopwords.fileids())
# ['arabic', 'azerbaijani', 'basque', 'bengali', 'catalan',
# 'chinese', 'danish', 'dutch', 'english', 'finnish', 'french',
# 'german', 'greek', 'hebrew', 'hinglish', 'hungarian',
# 'indonesian', 'italian', 'kazakh', 'nepali', 'norwegian',
# 'portuguese', 'romanian', 'russian', 'slovene', 'spanish',
# 'swedish', 'tajik', 'turkish']
# Stopwords français
sw_fr = set(stopwords.words('french'))
print(f"Nombre de stopwords français : {len(sw_fr)}")
# Exemples : {'ai', 'aie', 'aient', 'au', 'aura', 'avait', ...}
spaCy
spaCy intègre des listes de stopwords plus complètes que NLTK. La liste anglaise contient 326 mots, la liste française environ 315 mots. spaCy marque chaque token avec un attribut booléen is_stop, ce qui rend le filtrage très naturel dans le pipeline.
import spacy
nlp = spacy.load("fr_core_news_sm")
# Voir les stopwords
print(len(nlp.Defaults.stop_words))
# ~315
# Vérifier si un mot est un stopword
doc = nlp("Les enfants jouent dans le jardin")
for token in doc:
print(f"{token.text:12} is_stop: {token.is_stop}")
# Les is_stop: True
# enfants is_stop: False
# jouent is_stop: False
# dans is_stop: True
# le is_stop: True
# jardin is_stop: False
Gensim et scikit-learn
Gensim propose la liste la plus complète pour l’anglais (337 stopwords via gensim.parsing.preprocessing.STOPWORDS). scikit-learn fournit 318 stopwords anglais via sklearn.feature_extraction.text.ENGLISH_STOP_WORDS. Pour le français, scikit-learn ne propose pas de liste native : vous devez la fournir manuellement ou utiliser le projet stopwords-iso qui agrège les listes les plus complètes pour chaque langue.
| Librairie | Stopwords anglais | Stopwords français | Langues | Personnalisable |
|---|---|---|---|---|
| NLTK | 179 | ~157 | 20+ | Oui |
| spaCy | 326 | ~315 | 60+ | Oui |
| Gensim | 337 | Non natif | Anglais | Oui |
| scikit-learn | 318 | Non natif | Anglais | Oui |
| stopwords-iso | Complet | Complet | 50+ | Open source |
Suppression des stopwords en Python
Avec NLTK
import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
nltk.download('stopwords')
nltk.download('punkt')
texte = "L'intelligence artificielle transforme le monde du travail"
stop_words = set(stopwords.words('french'))
tokens = word_tokenize(texte, language='french')
tokens_filtres = [mot for mot in tokens if mot.lower() not in stop_words]
print("Original :", tokens)
print("Filtré :", tokens_filtres)
# Original : ["L'", 'intelligence', 'artificielle', 'transforme', 'le', 'monde', 'du', 'travail']
# Filtré : ["L'", 'intelligence', 'artificielle', 'transforme', 'monde', 'travail']
Avec spaCy
import spacy
nlp = spacy.load("fr_core_news_sm")
doc = nlp("L'intelligence artificielle transforme le monde du travail")
tokens_filtres = [token.text for token in doc if not token.is_stop]
print(tokens_filtres)
# ["L'", 'intelligence', 'artificielle', 'transforme', 'monde', 'travail']
Personnaliser la liste
En production, vous devrez presque toujours adapter la liste de stopwords à votre domaine. Voici comment ajouter et supprimer des mots avec spaCy :
import spacy
nlp = spacy.load("fr_core_news_sm")
# Ajouter un stopword
nlp.Defaults.stop_words.add("cependant")
# Ajouter plusieurs stopwords
nlp.Defaults.stop_words |= {"toutefois", "néanmoins", "donc"}
# Supprimer un stopword (si "pas" est important pour votre tâche)
nlp.Defaults.stop_words.remove("pas")
# Supprimer plusieurs stopwords
nlp.Defaults.stop_words -= {"ne", "pas", "plus"}
Et avec NLTK :
from nltk.corpus import stopwords
sw = set(stopwords.words('french'))
# Ajouter des mots domaine-spécifiques
sw.update(["cependant", "toutefois", "néanmoins"])
# Retirer des mots importants
sw.discard("pas")
sw.discard("ne")
Quand NE PAS supprimer les stopwords
C’est le point le plus important de cette page. La suppression des stopwords n’est pas toujours bénéfique. Dans plusieurs cas, elle dégrade les performances.
Analyse de sentiment
Le mot « not » (ou « ne…pas » en français) est classé comme stopword par la plupart des librairies. Le supprimer transforme « this movie is not good » en « movie good », inversant complètement le sentiment. Si vous faites de l’analyse de sentiment, retirez au minimum « not », « ne », « pas », « jamais », « rien » de votre liste de stopwords. Mieux encore, ne supprimez aucun stopword et laissez le modèle apprendre leur importance.
Reconnaissance d’entités nommées (NER)
Les stopwords contribuent à la structure syntaxique que les modèles de NER utilisent pour identifier les entités. Supprimer « the » dans « The New York Times » peut empêcher la détection de l’entité. Gardez les stopwords pour les tâches de NER.
Question-réponse et traduction
Les systèmes de question-réponse ont besoin de la structure complète de la question pour la comprendre. « What is the capital of France? » sans stopwords devient « capital France? », ce qui perd le mot interrogatif et la relation grammaticale. Même chose pour la traduction automatique : les mots fonctionnels sont essentiels à la construction grammaticale.
Modèles transformers et LLM
Les modèles modernes comme BERT, GPT et les LLM n’ont pas besoin de suppression de stopwords. Ils utilisent des mécanismes d’attention qui apprennent automatiquement à ignorer ou à pondérer chaque mot selon le contexte. Supprimer des mots en amont peut même dégrader leurs performances en détruisant le contexte syntaxique dont ils ont besoin.
La tendance générale en NLP va clairement vers la réduction, voire l’abandon, de la suppression de stopwords. Historiquement, les systèmes de recherche utilisaient des listes de 200 à 300 termes. Puis les listes se sont réduites à 7-12 termes. Aujourd’hui, de nombreux systèmes n’utilisent plus aucune liste.
Les stopwords en français : particularités
Le français présente des défis spécifiques pour la gestion des stopwords.
Les élisions compliquent la détection. « L’homme » contient l’article élidé « l’ » qui doit être identifié comme stopword séparément de « homme ». Le tokenizer doit correctement séparer « l’ » de « homme » avant que le filtrage ne s’applique. spaCy gère bien ce cas, NLTK nécessite parfois un traitement supplémentaire.
Les conjugaisons gonflent les listes. En français, « être » possède plus de 40 formes conjuguées (suis, es, est, sommes, êtes, sont, étais, était, étions, étiez, étaient, fus, fut, fûmes, fûtes, furent, serai, seras, sera, serons, serez, seront, sois, soit, soyons, soyez, soient…). Chaque forme doit être dans la liste, sinon elle ne sera pas filtrée. NLTK inclut ces conjugaisons dans sa liste française.
Les contractions sont nombreuses. « du » (de + le), « au » (à + le), « aux » (à + les), « des » (de + les) sont des formes contractées qui servent de stopwords composites. Elles doivent être incluses dans la liste en plus des prépositions et articles de base.
Stopwords dans Elasticsearch
Elasticsearch gère les stopwords via ses analyseurs de texte. L’analyseur français (french) inclut par défaut un filtre de stopwords et un filtre d’élisions.
PUT /mon_index
{
"settings": {
"analysis": {
"filter": {
"french_stop": {
"type": "stop",
"stopwords": "_french_"
},
"french_elision": {
"type": "elision",
"articles_case": true,
"articles": ["l", "m", "t", "qu", "n", "s", "j", "d", "c"]
}
},
"analyzer": {
"mon_analyseur_fr": {
"type": "custom",
"tokenizer": "standard",
"filter": ["french_elision", "lowercase", "french_stop"]
}
}
}
}
}
Le paramètre "stopwords": "_french_" charge la liste par défaut d’Elasticsearch pour le français. Vous pouvez aussi fournir votre propre liste avec "stopwords": ["le", "la", "les", ...] ou référencer un fichier avec "stopwords_path".
Pour la recherche, Elasticsearch permet aussi de combiner la suppression de stopwords à l’indexation avec la conservation des stopwords pour le matching de phrases. L’analyseur Snowball, couramment utilisé, intègre la gestion des stopwords dans son pipeline de stemming.
Stopwords et SEO
En SEO, la question des stopwords a considérablement évolué. Les moteurs de recherche modernes ne suppriment plus les stopwords de manière agressive. Google a confirmé par la voix de John Mueller (2021) qu’il ne faut pas se préoccuper des stopwords dans les URL ou le contenu : les moteurs analysent bien plus que les mots individuels et comprennent les phrases dans leur intégralité.
La recherche « denim jeans » et « denim in jeans » retournent des résultats différents car Google interprète la préposition « in » comme porteuse de sens. La phrase « to be or not to be » retourne des résultats sur Shakespeare, pas des pages aléatoires. Les stopwords contribuent au sens de la requête et Google les prend en compte.
En pratique pour le SEO : écrivez naturellement, n’essayez pas de supprimer les stopwords de vos titres, URLs ou méta-descriptions. L’ère où les URLs « /blog/best-python-frameworks » étaient préférées à « /blog/the-best-python-frameworks » est révolue.
Bonnes pratiques en production
Analysez la distribution de fréquence de votre corpus avant de choisir une liste. Les mots les plus fréquents ne sont pas toujours des stopwords dans votre domaine. Utilisez la normalisation (minuscules) avant le filtrage, sinon « The » et « the » seront traités différemment. Gérez les contractions et élisions (pour le français, traitez « l’ », « d’ », « n’ » comme des stopwords séparés). Testez systématiquement l’impact de la suppression sur vos métriques : lancez votre modèle avec et sans stopwords, comparez les résultats. Pour les langues agglutinantes (finnois, turc) ou sans espaces (chinois, japonais, thaï), la gestion des stopwords est fondamentalement différente et nécessite des approches adaptées.
NVIDIA NeMo Curator, utilisé pour la préparation de données d’entraînement de LLM, intègre des listes de stopwords pour évaluer la densité de mots vides dans les textes. Les paragraphes avec une densité de stopwords trop faible (texte généré, spam) ou trop élevée (texte sans contenu substantiel) sont filtrés. C’est un usage inversé : les stopwords servent ici d’indicateur de qualité du texte, pas de bruit à supprimer.
Questions fréquentes sur les stopwords
Qu’est-ce qu’un stopword exactement ?
Un stopword est un mot très fréquent dans une langue qui apporte peu d’information sémantique et est donc filtré avant ou après le traitement NLP. Ce sont typiquement les articles (le, la, un), les prépositions (de, à, pour), les conjonctions (et, ou, mais) et les pronoms. Il n’existe pas de liste universelle : chaque librairie et chaque projet peut définir sa propre liste selon les besoins.
Faut-il toujours supprimer les stopwords en NLP ?
Non. La suppression est bénéfique pour le topic modeling (LDA), le TF-IDF, l’extraction de mots-clés et les moteurs de recherche classiques. Elle est contre-productive pour l’analyse de sentiment (« not good » → « good »), la NER, la traduction, le question-réponse et les modèles transformers/LLM qui apprennent automatiquement l’importance de chaque mot. La tendance moderne va vers des listes plus courtes, voire aucune suppression.
Quelle liste de stopwords choisir en français ?
Pour un usage général, la liste spaCy (~315 mots) est plus complète que NLTK (~157 mots) et couvre mieux les conjugaisons françaises. Pour un projet open source ou multilingue, le projet stopwords-iso agrège les listes les plus complètes. Dans tous les cas, personnalisez la liste en fonction de votre domaine : ajoutez les mots fréquents mais non informatifs de votre corpus, retirez les mots qui portent du sens dans votre contexte (« pas », « ne » pour l’analyse de sentiment).
Les LLM et BERT ont-ils besoin de suppression de stopwords ?
Non. Les modèles basés sur les transformers (BERT, GPT, Claude, Gemini) utilisent des mécanismes d’attention qui apprennent à pondérer chaque mot selon le contexte. Supprimer les stopwords en amont détruit le contexte syntaxique dont ces modèles ont besoin. Ne supprimez pas les stopwords si vous alimentez un LLM, que ce soit pour l’entraînement, le fine-tuning ou l’inférence.
Comment les stopwords sont-ils gérés dans Elasticsearch ?
Elasticsearch intègre des listes de stopwords via le filtre stop dans ses analyseurs. Pour le français, utilisez "stopwords": "_french_" pour charger la liste par défaut. Vous pouvez fournir une liste personnalisée ou un fichier externe. L’analyseur français par défaut combine le filtre d’élisions (pour gérer l’, d’, etc.), la mise en minuscules, le filtre de stopwords et le stemmer. Pour la recherche de phrases exactes, Elasticsearch conserve les positions des tokens même après filtrage, ce qui permet le phrase matching.