Nettoyer un texte: approche bag-of-words (exercices)

Download nbviewer Onyxia
Binder Open In Colab githubdev

</p>

Cette page approfondit certains aspects présentés dans la partie introductive. Après avoir travaillé sur le Comte de Monte Cristo, on va continuer notre exploration de la littérature avec cette fois des auteurs anglophones :

  • Edgar Allan Poe, (EAP) ;
  • HP Lovecraft (HPL) ;
  • Mary Wollstonecraft Shelley (MWS).

Les données sont disponibles ici : spooky.csv et peuvent être requétées via l’url https://github.com/GU4243-ADS/spring2018-project1-ginnyqg/raw/master/data/spooky.csv.

Le but va être dans un premier temps de regarder dans le détail les termes les plus fréquemment utilisés par les auteurs, de les représenter graphiquement. On prendra appui sur l’approche bag of words présentée dans le chapitre précédent\[1\].

1. [^](#cite_ref-1)

L’approche bag of words est déjà, si on la pousse à ses limites, très intéressante. Elle peut notamment faciliter la mise en cohérence de différents corpus par la méthode des appariements flous (cf. Galiana et al. 2022. Le chapitre sur ElasticSearch présent dans cette partie du cours présente quelques éléments de ce travail sur les données de l’OpenFoodFacts

Ce notebook est librement inspiré de :

Les chapitres suivants permettront d’introduire aux enjeux de modélisation de corpus textuels. Dans un premier temps, le modèle LDA permettra d’explorer le principe des modèles bayésiens à couche cachés pour modéliser les sujets (topics) présents dans un corpus et segmenter ces topics selon les mots qui les composent.

Le dernier chapitre de la partie visera à prédire quel texte correspond à quel auteur à partir d’un modèle Word2Vec. Cela sera un pas supplémentaire dans la formalisation puisqu’il s’agira de représenter chaque mot d’un texte sous forme d’un vecteur de grande dimension, ce qui nous permettra de rapprocher les mots entre eux dans un espace complexe.

Librairies nécessaires

Cette page évoquera les principales librairies pour faire du NLP, notamment :

Il faudra également installer les librairies gensim et pywaffle

La liste des modules à importer est assez longue, la voici :

In [2]:
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from wordcloud import WordCloud
import base64
import string
import re
import nltk

from collections import Counter
from time import time
# from sklearn.feature_extraction.stop_words import ENGLISH_STOP_WORDS as stopwords
from sklearn.metrics import log_loss
import matplotlib.pyplot as plt
#!pip install pywaffle
from pywaffle import Waffle

from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
from sklearn.decomposition import NMF, LatentDirichletAllocation

nltk.download('stopwords')
nltk.download('punkt')
nltk.download('genesis')
nltk.download('wordnet')
nltk.download('omw-1.4')
[nltk_data] Downloading package stopwords to /github/home/nltk_data...
[nltk_data]   Package stopwords is already up-to-date!
[nltk_data] Downloading package punkt to /github/home/nltk_data...
[nltk_data]   Package punkt is already up-to-date!
[nltk_data] Downloading package genesis to /github/home/nltk_data...
[nltk_data]   Unzipping corpora/genesis.zip.
[nltk_data] Downloading package wordnet to /github/home/nltk_data...[nltk_data] Downloading package omw-1.4 to /github/home/nltk_data...
True

Données utilisées

Si vous ne faites pas l’exercice 1, pensez à charger les données en executant la fonction get_data.py :

In [8]:
import requests

url = 'https://raw.githubusercontent.com/linogaliana/python-datascientist/master/content/course/NLP/get_data.py'
r = requests.get(url, allow_redirects=True)
open('getdata.py', 'wb').write(r.content)

import getdata
train = getdata.create_train_dataframes()

Ce code introduit une base nommée train dans l’environnement.

Le jeu de données met ainsi en regard un auteur avec une phrase qu’il a écrite :

In [9]:
train.head()
Text Author ID
Id
id26305 This process, however, afforded me no means of... EAP 26305
id17569 It never once occurred to me that the fumbling... HPL 17569
id11008 In his left hand was a gold snuff box, from wh... EAP 11008
id27763 How lovely is spring As we looked from Windsor... MWS 27763
id12958 Finding nothing else, not even gold, the Super... HPL 12958

On peut se rendre compte que les extraits des 3 auteurs ne sont pas forcément équilibrés dans le jeu de données. Il faudra en tenir compte dans la prédiction.

In [12]:
g.figure.get_figure()

Fréquence d’un mot

Avant de s’adonner à une analyse systématique du champ lexical de chaque auteur, on se focaliser dans un premier temps sur un unique mot, le mot fear.

Premier wordcloud

Pour aller plus loin dans l’analyse du champ lexical de chaque auteur, on peut représenter un wordcloud qui permet d’afficher chaque mot avec une taille proportionnelle au nombre d’occurrence de celui-ci.

Aparté: la loi de Zipf

Nettoyage d’un texte

Les premières étapes dans le nettoyage d’un texte, qu’on a développé au cours du chapitre précédent, sont :

  • suppression de la ponctuation
  • suppression des stopwords

Cela passe par la tokenisation d’un texte, c’est-à-dire la décomposition de celui-ci en unités lexicales (les tokens). Ces unités lexicales peuvent être de différentes natures, selon l’analyse que l’on désire mener. Ici, on va définir les tokens comme étant les mots utilisés.

Plutôt que de faire soi-même ce travail de nettoyage, avec des fonctions mal optimisées, on peut utiliser la librairie nltk comme détaillé précédemment.

Ce petit nettoyage permet d’arriver à un texte plus intéressant en termes d’analyse lexicale. Par exemple, si on reproduit l’analyse précédente… :

In [31]: