Sac de mots
Glissez pour afficher le menu
Comprendre le modèle BoW
Le modèle sac de mots (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 d'occurrences du mot). Ainsi, les modèles BoW peuvent être soit binaires, soit basés sur la fréquence.
Voici comment la même phrase (document) est représentée par chaque type :
Un modèle binaire représente ce document par le vecteur [1, 1, 1], tandis qu'un modèle basé sur la fréquence le représente par [2, 1, 2], en tenant compte de la fréquence des mots.
Implémentation du BoW
L’implémentation du modèle BoW est un processus simple, en particulier avec l’aide de la bibliothèque sklearn (scikit-learn) et de sa classe CountVectorizer.
Voici une implémentation du modèle binaire sac de mots :
12345678910111213from 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())
from sklearn.feature_extraction.text import CountVectorizer
Cette ligne importe la classe CountVectorizer depuis sklearn.
corpus = [
'Global climate change poses significant risks to global ecosystems.',
'Global warming and climate change demand urgent action.',
'Sustainable environmental practices support environmental conservation.',
]
Ces lignes définissent une liste nommée corpus qui contient trois éléments chaîne de caractères. Chaque chaîne représente un document texte.
vectorizer = CountVectorizer(binary=True)
Cette ligne crée une instance de la classe CountVectorizer. Le paramètre binary=True indique que le modèle doit utiliser des comptages binaires.
bow_matrix = vectorizer.fit_transform(corpus)
La méthode ajuste d'abord le modèle aux données, apprend le vocabulaire du corpus, puis transforme les documents texte en une matrice creuse de comptages de tokens (matrice sac de mots).
print(bow_matrix.toarray())
Cette ligne convertit la matrice creuse bow_matrix en un tableau dense (numpy.ndarray) à l’aide de la méthode .toarray() et l’affiche.
Chaque ligne de la matrice correspond à un document, et chaque colonne à un jeton (mot). Afin de la représenter visuellement, nous avons converti cette matrice creuse en un tableau 2D dense à l'aide de la méthode .toarray().
Une matrice creuse est une matrice dans laquelle la plupart des éléments sont nuls. Elle est utilisée pour représenter et traiter efficacement des données contenant un grand nombre de valeurs nulles, en économisant de la mémoire et des ressources de calcul en ne stockant que les éléments non nuls.
Pour créer un modèle sac de mots basé sur la fréquence, il suffit de retirer le paramètre binary=True puisque sa valeur par défaut est False :
1234567891011from 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 du sac de mots obtenue en un DataFrame de DataFrame. De plus, l’instance CountVectorizer propose la méthode get_feature_names_out(), qui permet de récupérer un tableau de mots uniques (noms de caractéristiques) utilisés dans le modèle. Ces noms de caractéristiques peuvent ensuite être utilisés comme colonnes du DataFrame :
12345678910111213from 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, il est désormais facile d'accéder non seulement au vecteur d'un document particulier, mais aussi au vecteur d'un mot particulier :
12345678910111213from 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 revient simplement à accéder à une colonne dans le DataFrame en spécifiant le mot (par exemple, 'global'). On utilise également l'attribut values pour obtenir un tableau au lieu d'une Series en résultat.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion