Contenu du cours
Introduction au NLP
Introduction au NLP
Sac de Mots
Comprendre le Modèle BoW
Comme nous l'avons déjà mentionné dans le chapitre précédent, le modèle bag of words (BoW) représente les documents sous forme de vecteurs où chaque dimension correspond à un mot unique. Chaque dimension peut représenter soit la présence d'un mot dans le document (1
si présent, 0
si absent) soit sa fréquence (nombre de mots). Par conséquent, les modèles BoW peuvent être soit binaires soit basés sur la fréquence.
Voyons comment la même phrase (document) est représentée par chaque type :
Comme vous pouvez le voir, un modèle binaire représente ce document sous la forme du vecteur [1, 1, 1], tandis que les modèles basés sur la fréquence le représentent sous la forme [2, 1, 2], en tenant compte de la fréquence des mots.
Implémentation de BoW
Plongeons maintenant dans l'implémentation du modèle BoW en Python. L'implémentation du modèle BoW peut être un processus simple, surtout avec l'aide de la bibliothèque sklearn
(Scikit-learn) et de sa classe CountVectorizer
.
Sans plus tarder, passons à un exemple de sac de mots binaire :
from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a binary Bag of Words model vectorizer = CountVectorizer(binary=True) # Generate a BoW matrix bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix into a dense array print(bow_matrix.toarray())
Chaque ligne de la matrice correspond à un document, et chaque colonne à un token (mot). Afin de la représenter visuellement, nous avons converti cette matrice creuse en un tableau 2D dense en utilisant la méthode .toarray()
.
Pour créer un modèle de sac de mots basé sur la fréquence, il suffit de supprimer le paramètre binary=True
puisque sa valeur par défaut est False
:
from sklearn.feature_extraction.text import CountVectorizer corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] # Create a frequency-based Bag of Words model vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) print(bow_matrix.toarray())
Conversion de la Matrice en DataFrame
Il peut être très pratique de convertir la matrice de sac de mots résultante en un pandas DataFrame
. De plus, l'instance CountVectorizer
offre la méthode get_feature_names_out()
, qui récupère un tableau de mots uniques (noms de caractéristiques) utilisés dans le modèle. Ces noms de caractéristiques peuvent être définis comme les colonnes du DataFrame
résultant, voici un exemple :
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) # Convert a sparse matrix to a DataFrame bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) print(bow_df)
Avec cette représentation, nous pouvons désormais accéder facilement non seulement au vecteur d'un document particulier, mais aussi au vecteur d'un mot particulier :
from sklearn.feature_extraction.text import CountVectorizer import pandas as pd corpus = [ 'Global climate change poses significant risks to global ecosystems.', 'Global warming and climate change demand urgent action.', 'Sustainable environmental practices support environmental conservation.', ] vectorizer = CountVectorizer() bow_matrix = vectorizer.fit_transform(corpus) bow_df = pd.DataFrame(bow_matrix.toarray(), columns=vectorizer.get_feature_names_out()) # Print the vector for 'global' as a NumPy array print(f"Vector for the word 'global': {bow_df['global'].values}")
Puisque chaque mot unique correspond à une colonne, accéder à un vecteur de mot est aussi simple que d'accéder à une colonne dans le DataFrame
en spécifiant le mot (par exemple, 'global'
). Nous utilisons également l'attribut values
pour obtenir un tableau au lieu d'une Series
comme résultat.
Merci pour vos commentaires !