Bag of Words: du texte brut au vecteur
Qu’est-ce que le Bag of Words (BoW)?
Le
Bag of Words (BoW) (traduit sac de mots) est une approche basique mais fondamentale de l’extraction de caractéristiques en NLP.
L’idée du BoW consiste à représenter un document textuel sous forme de vecteur en considérant uniquement la présence ou la fréquence des mots qui le composent indépendamment de leur ordre ou de leur structure grammaticale.
Rappelons que l’
extraction de caractéristiques est le processus qui consiste à transformer des données brutes (le texte dans le cas du NLP) en représentations numériques (vecteurs) pertinentes et exploitables par des algorithmes d’apprentissage automatique.
Concrètement, on construit un vocabulaire à partir de l’ensemble des textes, puis chaque document est transformé en une liste de valeurs indiquant combien de fois chaque mot du vocabulaire apparaît. Cette méthode simplifie considérablement la complexité du langage naturel et permet d’alimenter des algorithmes classiques de classification ou de recherche d’information. Bien qu’elle ignore le contexte et la sémantique, le Bag of Words reste une étape de compréhension essentielle car il illustre comment un texte brut peut être converti en données numériques exploitables, ouvrant la voie à des techniques plus avancées comme le TF-IDF, ou le Word Embedding.
Mode de fonctionnement de Bag of Words
Le Bag of Words (BoW) fonctionne en transformant des phrases ou des documents en vecteurs numériques basés sur la fréquence des mots.
Imaginons deux phrases:
"Le chat dort sur le canapé" et
"Le chien surveille le chat à travers la fenêtre".
La première étape consiste à construire un vocabulaire unique à partir de l’ensemble des mots rencontrés. Donc:
{'canapé', 'chat', 'chien', 'dort', 'fenêtre', 'la', 'le', 'sur', 'surveille', 'travers'}
Ensuite, chaque phrase est représentée par un vecteur indiquant combien de fois chaque mot du vocabulaire apparaît.
Ainsi, la première phrase devient
[1 1 0 1 0 0 2 1 0 0] (car elle contient "le", "chat", "dort", "sur" et "canapé"), tandis que la seconde devient
[0 1 1 0 1 1 2 0 1 1] (car elle contient "Le", "chien", "surveille", "chat", "travers", "fenêtre").
Ce procédé illustre la logique du BoW qui consiste à réduire un texte à une simple liste de fréquences de mots sans tenir compte de l’ordre ni de la syntaxe.
Bien que le BoW soit rudimentaire, cette représentation permet déjà d’alimenter des modèles de classification ou d’analyse de similarité, et constitue une étape clé pour comprendre l’évolution vers des méthodes plus sophistiquées comme le TF-IDF ou les embeddings.
Limite de l'approche BoW
Le Bag of Words présente une limite importante lorsqu’il est appliqué à de grands corpus. En effet, la taille du vocabulaire explose rapidement, ce qui conduit à des vecteurs très longs et majoritairement remplis de zéros.
Techniquement, chaque document n’utilise qu’une petite fraction des mots disponibles et la matrice BoW devient donc extrêmement creuse (sparse). Cette représentation occupe beaucoup d’espace mémoire si elle est stockée sous forme dense et peut ralentir les calculs, car la majorité des positions ne contiennent aucune information utile. C’est pourquoi on utilise des structures optimisées pour les matrices creuses et que, dans la pratique, on préfère des méthodes plus compactes et contextuelles (comme TF-IDF ou les embeddings) pour traiter efficacement de grands ensembles textuels.
Exemple pratique de l'approche BoW
Applications du BoW en NLP
Voyons ce code qui illustre concrètement la mise en œuvre du Bag of Words avec la bibliothèque scikit-learn:
from sklearn.feature_extraction.text
import CountVectorizer
documents = [
"Le chat dort sur le canapé",
"Le chien surveille le chat à travers la fenêtre"
]
vectorizer = CountVectorizer()
bow_matrix = vectorizer.fit_transform(documents)
print(bow_matrix.toarray())
print(vectorizer.get_feature_names_out())
Expliquons rapidement le rôles des fonctiontions-clés présentes dans le code:
- La classe CountVectorizer() donne naissance à un objet capable de transformer des textes en vecteurs de fréquences de mots.
- La méthode fit_transform(documents) construit le vocabulaire à partir de ces phrases (liste documents), puis génère une matrice BoW où chaque ligne correspond à un document et chaque colonne à un mot du vocabulaire. Les valeurs indiquent combien de fois chaque mot apparaît.
- L’instruction print(bow_matrix.toarray()) affiche la matrice sous forme de tableau numérique (par exemple [1,0,2,...]).
- L'instruction print(vectorizer.get_feature_names_out()) montre le vocabulaire extrait automatiquement (les mots distincts rencontrés dans les documents).
La méthode toarray() (dans bow_matrix.toarray())sert à convertir la matrice sparse générée par CountVectorizer en un tableau NumPy dense, plus lisible et directement interprétable, où chaque ligne représente un document et chaque colonne un mot du vocabulaire avec sa fréquence.
L'exécution du code précédent produit ce résultat:
[[1 1 0 1 0 0 2 1 0 0]
[0 1 1 0 1 1 2 0 1 1]]
['canapé' 'chat' 'chien' 'dort' 'fenêtre' 'la' 'le' 'sur' 'surveille' 'travers']
Le mot "à" n’apparaît pas dans le vocabulaire extrait car, par défaut, CountVectorizer applique une tokenisation basée sur les séparateurs et les caractères alphanumériques. Les mots très courts ou considérés comme des caractères isolés (comme certaines prépositions ou accents) peuvent être filtrés automatiquement.