- Outils Traitement Corpus
J'aimerais bien me lancer dans un projet d'analyse de sentiments car ça m'intéresse beaucoup et j'ai envie de comprendre mieux comment ça fonctionne.
J'ai décidé de mettre sur le git le fichier de la dataset de Kaggle parce que ce dépôt git est plus qu'un projet en cours, c'est aussi un dépôt sur lequel je veux revenir souvent et améliorer au fur et à mesure en apprenant de nouvelles choses plus tard.
J'ai donc des fichiers qui sont pour mon enrichissement personnel, des fichiers tests qui ne sont pas utiles pour le cours et j'ai décidé de les garder sur le git mais de les mettre dans mon .gitignore temporairement pour la correction.
J'ai trouvé un dataset sur Kaggle qui correspond totalement à mon projet ! Le dataset se nomme Emotions et permet d'analyser de courts messages postés en ligne selon 6 types d'émotions :
- tristesse (0)
- joie (1)
- amour (2)
- colère (3)
- peur (4)
- surprise (5)
Ces émotions sont classées de 0 à 5 selon l'émotion primaire qui ressort du message.
Les données ici ont été récoltées sur Twitter, le réseau social très populaire. Il y a 416 808 phrases au total et elles ont toutes la même forme : "I [VERB] [..]". Voici un exemple du début du document que j'ai pu télécharger sur Kaggle.
- Analyse de sentiment
- Classification des émotions
- Analyse textuelle
J'ai pu voir que ce dataset a été réutilisée par 39 autres personnes, c'est aussi l'un des plus populaire de ce site. Ces notebooks vont m'être très utiles par la suite. Je crois que c'est un dataset assez récent car il a été modifié pour la dernière fois il y a 2 mois, donc il n'y a pas encore beaucoup de modèles qui ont pu l'utiliser.
Voici un exemple de comment ça fonctionne.
On voit bien qu'il y a le message sous forme de chaînes de caractères et la classification de l'émotion sous forme de chiffre de 0 à 5 comme on l'avait vu au-dessus.
Threads n’a pas d’API publique, donc j’ai décidé d’utiliser PlayWright
pour parser le site. Comme je ne pouvais pas l'utiliser dans mon Jupyter Notebook, je suis passée sur un fichier python classique.
Un problème s’est alors posé devant moi : quels commentaires je prends ? Comme je ne peux pas parser tout le site sans le faire planter ou me faire bannir, je dois fixer des limites.
J'ai voulu prendre des données en français mais je n'ai pas réussi. J'ai tenté de
récolter les commentaires avec l'attribut lang dans la balise html lang="fr"
dans le code source, mais le site ne possède que la balise lang="en"
, même lorsque c'est en français.
Pour pouvoir exploiter les données correctement, il va falloir commencer le nettoyage des données. En lançant le script qui récupère les threads, je vais tout d'abord repérer les choses qu'il va falloir nettoyer ci-dessous :
- tout mettre en minuscule
- supprimer toute forme de ponctuation
- et les $ ?
- les nombres aussi ?
- enlever les URLs
- enlever aussi celles sans le https (instagram.com/p/c6-qrpgsm0h/)
- vérifier la langue (prendre que le français)
- enlever les hastags (mais garder le texte ? -> oui)
- supprimer les \n
- corriger les chaînes de caractères vides
- corriger les chaînes sans mots (par exemple : " ... ")
- enlever les mentions (qui commencent par un @)
- ne prendre que les phrases de 3 mots ou plus (pour que l'analyse soit plus juste)
J'ai utilisé le modèle DistilCamemBERT pour analyser automatiquement les sentiments des données scrappées, car je ne pouvais pas le faire directement via le scraping. Bien que le modèle puisse ne pas être entièrement fiable, surtout étant donné qu'il a été entraîné sur des données en français, l'annotation manuelle pour évaluer sa performance aurait été trop longue en raison de la grande quantité de données. Comme ici la qualité des données n'est pas le plus important, je suis restée sur cette décision.
J'ai analysé la distribution des longueurs des commentaires pour voir si elle suit une distribution particulière et pour mieux comprendre la répartition des longueurs.
J'ai visualisé la répartition des différentes émotions dans les commentaires pour avoir une idée de la fréquence de chaque émotion dans le dataset.
J'ai appliqué la loi de Zipf aux données pour vérifier si les fréquences des mots suivent cette loi, ce qui est une caractéristique courante des langages naturels.
Pour éviter les conflits de version, nous allons créer un environnement virtuel. Pour créer un environnement virtuel, vous pouvez procéder comme suit :
python3 -m venv nom_du_venv
Ensuite, il va vous falloir activer l’environnement.
source nom_du_venv/bin/activate
Lorsque c’est fait, vous verrez entre parenthèse le nom de votre environnement tout à gauche de la ligne de commande.
N’oubliez pas de désactiver l’environnement lorsque vous avez terminé.
deactivate
Avant de pouvoir lancer les scripts, il faut que vous ayez les bons modules installés dans votre environnement virtuel. Pour cela, il vous suffit simplement de lancer la commande suivante :
pip install -r requirements.txt
Pour lancer le scraping du web, le nettoyage des données et sauvegarder les données dans un format tabulaire, il suffit simplement de lancer le fichier tabulaire.py. Vous pouvez le faire de cette manière :
python3 tabulaire.py
Grâce à la fonction main et à l'importation des fichiers, les trois scripts se lancent en même temps. Ce script permet de scraper des posts et réponses sur Threads, de les nettoyer et de les organiser dans un fichier CSV tabulaire. Il effectue les étapes suivantes :
- Scraping des données à partir du site Threads.
- Nettoyage des données pour enlever les URLs, émojis, retours chariots, noms d'utilisateur, hashtags, ponctuation, chaînes vides, espaces en trop et caractères spéciaux.
- Traitement des textes pour enlever les stop words et effectuer la lemmatisation.
- Classification des émotions dans les textes en utilisant un modèle de classification des émotions.
- Sauvegarde des données nettoyées et classifiées dans un fichier CSV.