Contexte :
Pour ce premier TP, nous allons travailler sur un jeu de données simple mais très intéressant. Il s’agit d’un corpus de tweets, pour lesquels il s'agit de prédire s’ils font référence à une “catastrophe” ou non.
Il s’agit d’une compétition Kaggle. Pour ceux qui ne connaissent pas encore Kaggle, c’est LA plateforme web orientée Data Science. Elle héberge des datasets, des notebooks et des compétitions. C’est aussi un réseau social, sur lequel vous pouvez notamment publier vos notebooks.
Le jeu de données peut être trouvé à cette adresse : données à télécharger
Consignes :
Le TP se décompose en 2 parties :
1 - Exploratory Data Analysis : il vous est demandé de faire un premier notebook afin de comprendre, d’explorer et d’effectuer un premier nettoyage des données. Vous devez notamment être capable de répondre aux questions suivantes :
Quelle est la forme du Dataframe ?
Y a t-il des valeurs manquantes ou des valeurs dupliquées ?
Quelles sont les colonnes qui vont nous intéresser ?
Y a-t-il des données aberrantes ou des incohérences majeures dans les données ?
Y a t-il des tweets anormalement longs / courts ? Peut-on les considérer comme des outliers ?
Quel est le ratio tweet qui parlent de “catastrophes” / tweet normaux ?
En regardant quelques tweets au hasard, peut-on deviner facilement la “target” ?
Peut-on déjà détecter des “patterns” ou des mots clés dans les tweets?
A votre avis quel serait l’accuracy score qu’un humain pourrait obtenir s’il prédisait les données “à la main” ?
2 - Text Processing : Il vous est demandé d’effectuer un premier traitement des données textuelles (colonne ‘text’). Il s’agira de transformer les données textuelles en tokens et de réduire la dimensionnalité du corpus en réduisant le vocabulaire (le nombre de tokens différents). L’enjeu est complexe, il en faut ni trop, ni trop peu… Pour vous aider dans ce travail, essayez de répondre aux questions suivantes :
Pouvez-vous écrire une fonction qui : tokenize un document, supprime les stopwords, supprime les tokens de moins de 3 lettres ?
Comment peut-on reconstituer le corpus (c'est-à dire un texte avec l’ensemble des documents) ?
Une fois ce corpus constitué, combien de tokens uniques le constitue? Ce nombre vous apparaît-il faible, important, gigantesque ?
Comment réduire ce nombre de tokens uniques, ou autrement dit “comment réduire la taille du vocabulaire” de ce corpus ?
Combien de tokens sont présents une seule fois ? Ces tokens nous seront-ils utiles ?
Appliquer une méthode de stemmatisation ou de lemmatisation peut-elle nous aider à réduire la dimensionnalité du corpus ?
Comment visualiser graphiquement, par un WordCloud par exemple, les tokens les plus présents ?
Pouvez vous appliquer tous les traitements évoqués afin de créer une nouvelle colonne “text” qui serait plus pertinente ?
Un exemple de traitement :
Pour l'EDA :
Pour le Text Processing :
Aller plus loin :
Nous n’avons volontairement pas évoqué dans le cadre de ce TP plusieurs sujets. Nous vous laissons le soin de poursuivre librement les pistes évoquées ci dessous :
Nous avons choisi de ne garder que les “mots” au sens grammatical du terme. Mais est-ce bien judicieux ? En effet, l’utilisation d’un emoji ou de certains caractères de ponctuation peut être très impactant. Par exemple: “ terrorist attack downtown !!! 😱😱😱”
Nous avons choisi de transformer les documents avec la méthode .lower(). Mais est-ce bien judicieux ? En effet, les lettres capitales sont peut-être plus utilisées dans des textes ayant un impact fort. Par exemple : OMG, THE BUILDING IS BURNING !!!
Nous n’avons pas évoqué la notion de bi-gramme ou de tri-gramme (groupe de 2 ou 3 mots se faisant suite). Existe-t-il des bi ou tri-grammes qui seraient intéressants ?
Le stemmer et le lemmentizer de NLTK ne sont pas très “puissants”. Est-ce que la librairie spacy nous propose des outils plus intéressants ?
Qu'est-ce que le POS (part of speech) ? Spacy peut-il nous aider à ne garder que les tokens faisant référence aux adjectifs ou aux verbes? Cela peut-il avoir un impact sur la taille de notre vocabulaire ?
Ressources complémentaires :
Voici une liste non exhaustive de ressources complémentaires pour poursuivre votre travail :
Une vidéo de freecodecamp sur NLTK : lien vidéo (en anglais)
Une vidéo de freecodecamp sur Spacy : lien vidéo (en anglais)
Une vidéo de David Louapre sur le SOA (State Of Art) du NLP : lien vidéo .
ATTENTION : la vidéo couvre des notions beaucoup plus complexes que celles présentées dans la première partie de cours. Ces notions seront couvertes dans les chapitres suivants.
Quelques notebooks Kaggle à lire : un premier notebook, un deuxième notebook, un troisième notebook (en anglais)
ATTENTION : certaines notions présentes dans ces notebooks sont beaucoup plus complexes que celles présentées dans la première partie de cours. Ces notions seront couvertes dans les chapitres suivants.
Commentaires, suggestions ou questions :
N’hésitez pas à nous faire un retour : nous contacter