1. ANALYSEDESTWEETSDETWITTER
République du Sénégal
Un peuple-Un but-Une foi
**************************
Agence Nationale de la Statistique et de la
Démographie
*****************************
Ecole nationale de la statistique et de l’analyse
éconmique Pierre Ndiaye
PRESENTATION DU PROJET ii DE NLP
Présenté par:
DEKOU VESSOU
Jeff-Maruis
Sous la supervision
de M.:
M.GOMIS
MARS 2023
3. 02/03/2023 3
Introduction
Aujourd’hui, Twitter est utilisé par des centaines de millions de personnes dans le monde entier. Plus
précisément, l'estimation actuelle s'élève à environ 330 millions d'utilisateurs actifs mensuels et 145 millions
d'utilisateurs actifs quotidiens sur Twitter. Autre chiffre intéressant : 63 % des utilisateurs de Twitter dans le
monde ont entre 35 et 65 ans. L’objectif de cet article est de réaliser une analyse exploratoire et visuelle des
tweets présents dans notre jeu de données. Dans un second temps, le but sera de parvenir à classifier à l’aide
de différents modèles disponibles en Python, les sentiments des tweets selon qu’ils soient plutôt positifs,
neutres ou négatifs. Autrement dit réunir sentiment analysis et NLP.
4. 4
PresentationdeNotreDataset
02/03/2023
Comme nous pouvons l’apercevoir, ce jeu de données recensant au total 74681
tweets, contient une colonne intitulée positive [pour le moment] attribuant la
modalité positive si le sentiment du tweet est positif et autres modalités si c’est pas
positif
7. 7
PresentationdeNotreDataset
02/03/2023
-Visualisation desmots
#Définition des mots à exclure
stopwords = set(STOPWORDS)
stopwords.update(['and', 'or', 'in', 'the', 'I', 'That', 'these', 'those','am'])
# Définition de l'image de masque
#mask = np.array(Image.open('/content/gdrive/My Drive/logo.png'))
# Création du WordCloud
wordcloud = WordCloud(background_color='white', max_words=2000, stopwords=stopwords)
# Génération du nuage de mots
wordcloud.generate(text)
# Affichage du nuage de mots
plt.figure(figsize=(10,10))
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
10. 02/03/2023 10
TRAITEMENTS DES DONNEES
from tensorflow.keras.layers import Embedding
import io
import numpy as np
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow . keras . preprocessing . sequence import pad_sequences
import pandas as pd
import nltk
import re
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.layers import Dropout
from tensorflow.keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.metrics import accuracy_score
11. 02/03/2023 11
TRAITEMENTS DES DONNEES
Faire une copie de nos donnees dans df
Important afin de garder les données initiales en bon etat sans erreurs/tr
aitements plus sécurisé et pas de pertes de base
df=data.copy()
indexes=[]
for i in range(74681):
if(df['Sentiment'][i]=='Irrelevant'):
indexes.append(i)
df=df.drop(indexes,axis=0)
print(df.shape)
#(61691, 4)
Supressions de irrelevant
Nous sommes seulement intéressés par positives, negatives et neutre et on supprime irrelevant
12. 02/03/2023 12
TRAITEMENTS DES DONNEES
nombres de valeurs manquantes si elles existent pour chaque variable
df.isna().sum()
#2401 0
#Borderlands 0
#Sentiment 0
#Tweet 571
#Effacer ces valeurs manquantes
df=df.dropna()
#(61120, 4)
#Transformer nos variables en variables catégorielles
df['Sentiment']=df['Sentiment'].map({'Positive':2,'Neutral':1,'Negative':0})
#Supressions de la colonne 2401 et borderlands
df=df.drop(['2401','Borderlands'],axis=1)
15. 02/03/2023 15
ANALYSE DES SENTIMENTS
x=df['Tweet']
y=df['Sentiment']
Choix des données d’entrées
nltk.download('stopwords')
Telechargements des stops words
Le code nltk.download('stopwords') télécharge le corpus stopwords de la bibliothèque Natural Language Toolkit (NLT
K). Les stopwords sont des mots couramment utilisés dans une langue mais qui sont généralement considérés comm
e ayant peu de valeur lors de l'analyse de données textuelles. Des exemples de stopwords en français incluent "le", "l
a", "les", "de", "du", "des", etc.
En téléchargeant le corpus de stopwords, vous pouvez l'utiliser pour supprimer ces mots courants de vos données te
xtuelles. Cela peut être utile pour diverses tâches de traitement du langage naturel, telles que l'analyse de sentiment
ou la modélisation de sujets.
16. 02/03/2023 16
ANALYSE DES SENTIMENTS
x=df['Tweet']
y=df['Sentiment']
Choix des données d’entrées
nltk.download('stopwords')
Telechargements des stops words
Le code nltk.download('stopwords') télécharge le corpus stopwords de la bibliothèque Natural Language Toolkit (NLT
K). Les stopwords sont des mots couramment utilisés dans une langue mais qui sont généralement considérés comm
e ayant peu de valeur lors de l'analyse de données textuelles. Des exemples de stopwords en français incluent "le", "l
a", "les", "de", "du", "des", etc.
En téléchargeant le corpus de stopwords, vous pouvez l'utiliser pour supprimer ces mots courants de vos données te
xtuelles. Cela peut être utile pour diverses tâches de traitement du langage naturel, telles que l'analyse de sentiment
ou la modélisation de sujets.
17. 02/03/2023 17
ANALYSE DES SENTIMENTS
#Cleaning text data
ps=PorterStemmer()
corpus=[]
for i in range(len(x)):
rev=re.sub('[^a-zA-Z]',' ',df['Tweet'][i])
rev=rev.lower()
rev=rev.split()
rev=[ps.stem(word) for word in rev if not word in stopwords.words('english')]
rev=' '.join(rev)
corpus.append(rev)
Choix du corpus
Explication du code
18. 02/03/2023 18
ANALYSE DES SENTIMENTS
Explication du code
Le code nous permet d' effectuer le nettoyage des données textuelles à l'aide de l'algorithme de stemming de Porter et
supprime les stopwords de la langue anglaise à l'aide de la bibliothèque NLTK.
ps=PorterStemmer(): crée une instance de l'algorithme de stemming de Porter de la bibliothèque NLTK.
corpus=[]: crée une liste vide appelée corpus pour stocker les données textuelles nettoyées.
for i in range(len(x)):: itère à travers chaque élément dans une liste x (qui n'est pas définie dans l'extrait de code que
vous avez fourni).
rev=re.sub('[^a-zA-Z]',' ',df['Tweet'][i]): supprime tous les caractères qui ne sont pas des lettres de la chaîne dans la
colonne 'Tweet' du DataFrame df à l'index i.
rev=rev.lower(): convertit toutes les lettres de la chaîne en minuscules.
rev=rev.split(): divise la chaîne en une liste de mots.
rev=[ps.stem(word) for word in rev if not word in stopwords.words('english')]: applique l'algorithme de stemming de
Porter à chaque mot de la liste de mots, et supprime tous les mots qui se trouvent dans le corpus de stopwords de la
langue anglaise de NLTK.
rev=' '.join(rev): rassemble la liste de mots en une chaîne, séparée par des espaces.
corpus.append(rev): ajoute la chaîne nettoyée à la liste corpus.
22. 02/03/2023 22
ANALYSE DES SENTIMENTS
Préparation de la base pour la modélisation logistique
#Ecodage du tableau y
#Y en vecteur binaire (1, 0)
y= to_categorical(y)
print(y)
#converting data to numpy array
x_array=np.array(padded)
y_array=np.array(y)
Convertir en tableau
23. 02/03/2023 23
ANALYSE DES SENTIMENTS
Séparation de la base en base d’entrainement , de test et de validations
x_train,x_t,y_train,y_t=train_test_split(x_array,y_array,random_state=42)
# les base validation = 35% de la base x_t et y_t et les bases test 65%
x_valid=x_t[:int(x_t.shape[0]*0.35)]
y_valid=y_t[:int(y_t.shape[0]*0.35)]
x_test=x_t[int(x_t.shape[0]*0.35):]
y_test=y_t[int(y_t.shape[0]*0.35):]
24. 02/03/2023 24
ANALYSE DES SENTIMENTS
Modélisation et entrainement
Nous allons faire à ce niveau un modèle de classification multi classe . Ce type de modèle est
utilisé lorsque les données d'entraînement sont catégorielles et que le modèle doit prédire une ou
plusieurs classes pour chaque échantillon. D’où les précédentes transformations
Raison de ce choix
-Des bonnes prédictions
-Un bon score
-Mieux que le modèle binaire selon les tests effectués dans mon cas
26. 02/03/2023 26
ANALYSE DES SENTIMENTS
early_stopping=EarlyStopping(monitor='val_loss',min_delta=0,patience=3,verbose=1)
reduce_lr=ReduceLROnPlateau(monitor='val_loss', factor=0.2, pateince=3,
verbose=1, min_delta=0.0001)callbacks_list=[early_stopping,reduce_lr]
Contrôle du surapprentissage(a cause du modele multiclasse utilsé surtout)
Qu’est ce que ce code fait
27. 02/03/2023 27
ANALYSE DES SENTIMENTS
Contrôle du surapprentissage(a cause du modele multiclasse utilsé surtout)
EarlyStopping : Cette fonction surveille la perte de validation pendant l'entraînement et arrête le processus d'entraînement plus
tôt si la perte de validation ne s'améliore plus, selon les paramètres spécifiés. Les paramètres utilisés sont les suivants :
•monitor='val_loss' : surveiller la perte de validation
•min_delta=0 : la différence minimale requise pour considérer qu'il y a eu une amélioration de la perte de validation
•patience=3 : le nombre d'époques pour lesquelles la perte de validation ne s'améliore pas avant que l'entraînement ne soit arrêté
•verbose=1 : afficher des messages d'informations pendant l'entraînement
ReduceLROnPlateau : Cette fonction ajuste le taux d'apprentissage du modèle si la perte de validation ne s'améliore plus
après un certain nombre d'époques, selon les paramètres spécifiés. Les paramètres utilisés sont les suivants :
•monitor='val_loss' : surveiller la perte de validation
•factor=0.2 : le facteur de réduction du taux d'apprentissage (nouveau taux d'apprentissage = taux d'apprentissage actuel *
facteur)
•patience=3 : le nombre d'époques pour lesquelles la perte de validation ne s'améliore pas avant que le taux d'apprentissage ne
soit ajusté
•verbose=1 : afficher des messages d'informations pendant l'entraînement
•min_delta=0.0001 : la différence minimale requise pour considérer qu'il y a eu une amélioration de la perte de validation.
29. 02/03/2023 29
ANALYSE DES SENTIMENTS
Evolution de notre score par rapport aux epoques
plt.plot(h.history['accuracy'],label='Accuracy')
plt.plot(h.history['val_accuracy'],label='Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
30. 02/03/2023 30
ANALYSE DES SENTIMENTS
Predication de notre modele
#Predictions on test set
preds=model.predict(x_test)
preds_max=np.argmax(preds,axis=1)
y_test_values=np.argmax(y_test,axis=1)
print(preds_max[:10])
print(y_test_values[:10])
Verfications entre valeurs prédites et valeurs à observés
31. 02/03/2023 31
ANALYSE DES SENTIMENTS
Matrice de classifications
Le score du modèle
print('Accuracy: {:.2f}'.format(accuracy_score(y_test_values, preds_max)))