Exploration de données et analyse de sentiments
Introduction
Le propos du présent chapitre est de travailler avec un réel jeu de données (dataset) en entrée. Préalablement à une tâche d’analyse de sentiments avec l’entraînement associé du modèle, nous procéderons à une exploration approfondie du dataset.
Nous allons utiliser un dataset destiné à être utilisé pédagogiquement par des étudiants, autour de l’analyse de sentiments. Il s’agit d’un jeu de données de plus de 1 million et demi de tweets, disponible et téléchargeable librement (85 Mo) sur le site de Kaggle (https://www.kaggle.com/datasets/kazanova/sentiment140).
Il vous faudra simplement créer un compte Kaggle, afin de télécharger le jeu de données. En l’occurrence, le fichier téléchargé est un fichier ZIP qui contient le fichier training.1600000.processed.noemoticon.csv.
Dans ce dataset, pour chaque tweet, nous avons sa date/heure, le nom d’utilisateur émetteur du tweet, ainsi qu’une note relative au sentiment (entre négatif et positif).
Nous commencerons par une exploration complète du jeu de données, avant de procéder à un entraînement de modèle, relativement à l’analyse de sentiments.
Exploration approfondie du jeu de données
Nous faisons le choix ici d’utiliser un notebook Jupyter, mais bien évidemment, le code équivalent dans un fichier Python, exécuté depuis la ligne de commande, conduit à un résultat parfaitement identique. On crée donc un notebook dans le répertoire dans lequel se trouve le fichier CSV du dataset.
1. Lecture et découverte du dataset
On utilise la bibliothèque pandas, en particulier pour bénéficier de sa structure de dataframe particulièrement souple et utile.
Un dataframe, dans pandas, est une structure de données tabulaire bidimensionnelle, similaire à une feuille de calcul ou à une table de base de données. Il est constitué de lignes et de colonnes, où chaque colonne peut contenir un type de données différent (entiers, flottants, chaînes, etc.). Les dataframes offrent une manipulation de données puissante et flexible, ce qui les rend particulièrement adaptés à l’analyse et à la manipulation de données dans le domaine de la science des données et de l’apprentissage automatique.
On commence par créer le dataframe en lisant le fichier CSV, grâce à pd.read_csv :
import pandas as pd
df =
pd.read_csv('training.1600000.processed.noemoticon.csv',encoding =
'latin',header=None)
Puis on affiche le nombre de colonnes et de lignes grâce à df.shape :
# Obtenir le nombre de lignes et de colonnes
nb_lignes, nb_colonnes = df.shape
print("\nNombre de lignes :", nb_lignes)
print("Nombre de colonnes : ", nb_colonnes)
On obtient ce résultat :
Nombre de lignes : 1600000
Nombre de colonnes : 6
On a donc six colonnes et un million six cent mille lignes, et donc tweets.
On cherche à présent à obtenir des informations sur les colonnes elles-mêmes, sur leurs types notamment, grâce à df.info() :
print("\nInformations sur les colonnes : ")
infos_colonnes = df.info()
On obtient :
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1600000 entries, 0 to 1599999
Data columns (total 6 columns):
# Column Non-Null Count Dtype ...
Analyse de sentiments
1. Entraînement du modèle
On entraîne à présent un modèle à partir de ce jeu de données, de manière à prédire si un tweet donné est plutôt connoté positivement ou négativement.
Nous avons déjà pu parler de façon approfondie d’analyse des sentiments dans cet ouvrage. En plongeant dans cette thématique, nous sommes capables de décoder la tonalité sous-jacente d’un texte, qu’il s’agisse de positivité, de négativité, ou de nuances plus subtiles telles que la neutralité, l’ironie, ou l’enthousiasme. Cette discipline trouve des applications variées, de la surveillance de la réputation en ligne à l’amélioration des services client, en passant par la prédiction de tendances du marché.
a. Imports de bibliothèques
On ajoute un certain nombre de modules ou bibliothèques dont nous allons avoir besoin :
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report,
confusion_matrix
from nltk.tokenize import word_tokenize
b. TF-IDF
On utilise la classe TfidfVectorizer de la bibliothèque scikit-learn en Python pour convertir une collection de tweets (contenue dans la colonne ’tweet’ du dataframe df) en une représentation numérique à l’aide de la méthode TF-IDF (Term Frequency-Inverse Document Frequency). La variable cible ’feeling’ est également extraite et stockée dans la variable y.
Le TF-IDF est une technique de représentation de texte qui prend en compte la fréquence des termes dans un document tout en compensant leur fréquence globale dans le corpus.
En résumé, ce code prépare les données pour une tâche d’apprentissage automatique où les tweets (X) sont représentés numériquement à l’aide de la méthode TF-IDF, et les étiquettes associées aux sentiments (y) sont extraites pour être utilisées comme données d’entraînement ou de test dans un modèle...
Ensemble du code du chapitre
import pandas as pd
df = pd.read_csv('training.1600000.processed.noemoticon.csv',
encoding = 'latin',header=None)
# Obtenir le nombre de lignes et de colonnes
nb_lignes, nb_colonnes = df.shape
print("\nNombre de lignes :", nb_lignes)
print("Nombre de colonnes : ", nb_colonnes)
print("\nInformations sur les colonnes : ")
infos_colonnes = df.info()
# Afficher les premières statistiques du DataFrame
stats = df.describe()
print("\nStatistiques du DataFrame : ")
print(stats)
# Afficher un extrait du DataFrame
print("\nExtrait du DataFrame : ")
extrait = df.head()
print(extrait)
df['feeling'].unique()
import matplotlib.pyplot as plt
import seaborn as sns
val_count=df["feeling"].value_counts()
plt.figure(figsize= (5,5))
sns.countplot(data = df, x= 'feeling')
plt.title(f'Distribution négatif/positif
\n{val_count.to_string(index=False, header=None)}')
from nltk.corpus import stopwords
import re
# Valeur True et False
df["feeling"] = df["feeling"].replace({4: True, 0: False})
# Fonction de nettoyage de la colonne 'tweet'
stop_words...