
90% des données seraient des données non structurées. Parmi ces données on retrouve évidemment les données textuelles : articles, compte rendus, descriptions, avis, réseaux sociaux,… Aujourd’hui on ne peut pas doit pas passer à côté de ces données en tant que Data Scientist. Mais comment les exploiter? C’est le NLP (Natural Language Processing) qui regroupe des méthodes qui permettent de traiter et d’analyser les données textuelles. On entend aussi parler d’analyse de texte ou de textmining…
Au programme :
- Les données textuelles
- Préparer ses données
- Nettoyer (stop words, lemmatisation,…)
- Structurer (matrice document terme, n-grams, tfidf,…)
- Les algorithmes
Les données textuelles
En quoi les données textuelles sont-elles différentes des autres données?
- Non structurées : les données textuelles ne sont pas structurées, si je prends l’exemple d’une phrase … on est loin d’avoir un dataset classique.
- Contenu sémantique : Les mots et les phrases ne sont pas seulement une succession de lettres mais ils ont un sens, une signification.
Ces données sont donc bien différentes des datasets que nous avons l’habitude d’utiliser. L’étape de préparation des données est d’autant plus importante qu’elle permettra de les transformer en données exploitables. Elles pourront ensuite être utilisées avec n’importe quel algorithme de machine learning (Random Forest, Gradient Boosting, …)
Voyons ensemble comment faire.
Préparer ses données en NLP
En termes de dataprep pour le NLP il y a 2 choses essentielles à faire pour préparer des données textuelles :
- Les nettoyer : les textes ont besoin d’être normalisés, corrigés, transformés, certains mots qui n’apportent pas de valeur doivent être supprimés… On a un gros travail de nettoyage à faire dans les projets de NLP. Je vous listerai les étapes des traitements et je vous parlerai de 2 méthodes la lemmatisation et le stemming.
- Les structurer : dans un second temps il est nécessaire de transformer ces données sous un format que l’on a l’habitude d’utiliser, à savoir une ou plusieurs matrices de données. Je vous présenterai 2 méthodes : le bag of word et le word embedding.
Comment nettoyer les données textuelles ?
Je vais prendre un exemple de phrase qui va nous suivre tout au long de cet article pour vous aider à bien comprendre les traitements de données que nous allons appliquer :
« Très bonne expérience, originalité et bonne conservation des produits sur la semaine. »
J’utiliserai Python pour les traitement sur les données avec les librairies suivantes
import pandas as pd
import nltk
import string
import sklearn.feature_extraction.text
from sklearn.feature_extraction.text import CountVectorizer
import collections
import stop_words
import itertools
import spacy
nltk.download('punkt')
nltk.download('stopwords')
Suppression de la ponctuation et des majuscules
Les points, virgules, points d’exclamation,… autant de contenu qui n’apportent pas grand chose (à l’exception peut être quand même des points d’exclamation). La première étape consiste donc à les supprimer de notre texte. Les majuscules peuvent également être supprimées dans la plupart des cas. La seul exception que je vois c’est pour le Named Entity Recognition, les algorithmes qui détectent les noms, les lieux, …
text=text.lower()
print(text)
mauvaise expérience, un des produits était cassé...
translate_table = dict((ord(char), None) for char in string.punctuation)
text=text.translate(translate_table)
print(text)
mauvaise expérience un des produits était cassé
Notre phrase devient donc :
« très bonne expérience originalité et bonne conservation des produits sur la semaine »
Dans la réalité cette étape en Python n’est pas nécessaire parce qu’elle sera automatiquement réalisée avec la librairie SpaCy lorsque nous allons appliquer la lemmatisation.
Lemmatisation
Comment faire maintenant pour que notre algorithme comprenne que certaines déclinaisons de mots ont en fait le même sens? Par exemple « bonne » et « bon » ou alors « est » et « sera ».
Il existe 2 méthodes en NLP : le Stemming et la Lemmatisation
Le Stemming va conserver la racine du mot tandis que la Lemmatisation permet d’identifier leur forme canonique. Pour la langue française je trouve que la Lemmatisation est plus adaptée. C’est donc celle que je vous propose d’utiliser.
Pour l’utiliser nous allons utiliser une librairie de NLP : Spacy. Dans un premier temps il faut l’installer. Je l’ai fait à partir d’Anaconda en tapant le code suivant dans le prompt :
python -m spacy download fr_core_news_sm
Ensuite dans Python on charge le dictionnaire en français
#Chargement de la librairie Spacy
nlp=spacy.load('fr_core_news_sm')
Puis on applique la lemmatisation sur nos données
#Lemmatize
tokens_texte = nlp(text)
tokens=[]
for token in tokens_texte:
tokens.append(token.lemma_)
print(tokens)
Voici le résultat :
[‘très’, ‘bon’, ‘expérience’, ‘originalité’, ‘et’, ‘bon’, ‘conservation’, ‘un’, ‘produit’, ‘sur’, ‘le’, ‘semaine’]
Suppression des stop words
Les stop words ce sont tous ces mots qui sont présent fréquemment dans le texte mais qui n’apportent pas de valeur. Wikipédia parle de mot vide qui sont non significatifs. Cette liste de mot dépend bien évidemment de la langue et en Français on a par exemple : le, la, et, … Dans nos analyses de Machine learning ou de Deep Learning ces mots n’apporteront rien il est donc préférable de les supprimer, cela allégera notre dataset. De la même manière on peut supprimer les mots qui reviennent très souvent dans nos données même s’il ne s’agit pas de stop word classiques.
#Suppression des stop words
frech_stop_words=nltk.corpus.stopwords.words('French')
text_tokens=[word for word in tokens if word not in frech_stop_words]
print(text_tokens)
Voilà donc ce qu’il reste de notre phrase initiale :
[‘très’, ‘bon’, ‘expérience’, ‘originalité’, ‘bon’, ‘conservation’, ‘produit’, ‘semaine’]
Notre phrase initiale est maintenant découpée en plusieurs mots. Le nettoyage est terminé mais à ce stade il n’est toujours pas possible d’appliquer des algorithmes sur ce type de données. Il est nécessaire de structurer nos données.
Comment structurer les données de NLP ?
Nous allons voir ensemble la méthode Bag Of Word. Elle va permettre d’extraire des features à partir du texte dans un format matriciel qui pourra ensuite être utilisé par les algorithmes que vous connaissez (Random Forest, Gradient Boosting, …)
Jusque là notre exemple ne comprenait qu’une seule phrase, je vous propose de prendre maintenant un petit corpus :
"Très bonne expérience, originalité et bonne conservation des produits sur la semaine." "Les produits sont bons mais la livraison était trop lente." "Très original mais trop cher!" "Mauvaise expérience, un des produits était cassé..."
On applique les même traitements que dans la partie précédente ce qui nous donne :
['très', 'bon', 'expérience', 'originalité', 'bon', 'conservation', 'produit', 'semaine'] ['produit', 'être', 'bon', 'livraison', 'être', 'trop', 'lent'] ['très', 'original', 'trop', 'cher'] ['mauvais', 'expérience', 'produit', 'être', 'cassé']
La matrice document termes
Pour structurer nos données nous allons créer une matrice document terme. Dans un premier temps cette matrice va contenir des unigrams, c’est à dire des mots (je vous parle des n-grams un peu plus tard). La matrice document terme va présenter en colonne l’ensemble des mots présents dans notre vocabulaire. Pour chaque phrase, nous allons renseigner dans notre matrice si le mot est présent ou non.
Voilà ce que cela donnerait pour notre corpus de 4 textes :

Cette pondération par 0 ou 1 qui indique si le mot est présent ou pas dans le texte va vite atteindre ses limites. Notamment pour les textes plus longs, elle ne permettra pas de faire la différence entre un texte qui ne mentionne qu’une seule fois le mot vs un texte qui le mentionne plusieurs fois. Il faut aussi prendre en compte le fait que les textes peuvent être de taille différente.
Il existe plusieurs métriques pour compléter cette matrice document terme. Une des plus utilisées est le TF-IDF qui permet de connaitre l’importance relative de chaque mot dans les textes.
La pondération tf-idf
Dans la partie précédente nous avons simplement utilisé une indicatrice (0 ou 1) pour indiquer si le mot était présent ou non dans le document (= la phrase). Quand on travaille avec des données plus conséquente cela peut poser problème de donner autant de poids à un mot qui n’apparait qu’une seule fois par rapport à d’autres qui seraient plus fréquents. Pour éviter ces problèmes vous pouvez utiliser la pondération TF-IDF : Term Frequency – Inverse Document Frequency. Il s’agit de la combinaison de :
- TF qui mesure l’importance d’un mot dans un texte. Voici la formule pour le TF du mot i

- IDF qui mesure l’importance du mot dans l’ensemble du corpus

Enfin pour avoir le TF-IDF il suffit de multiplier les 2 mesures. On peut alors remplir la matrice document terme non plus avec des 0 et des 1 mais avec les valeurs de TF-IDF pour chaque cellule i,j.
Calculer des n-grams
Votre matrice document terme contient l’ensemble des mots (ceux qui restent après la data prep). Chaque mot est sélectionné seul, on peut parler de 1-gram. Mais pour certaines problématiques, le fait de ne considérer que les mots séparément peut biaiser les résultats. Par exemple si je découpe « pas content » en 1-gram, le mot content pourrait être mal interprété. Pour éviter cela vous pouvez enrichir votre matrice document terme avec des n-grams.
Par exemple des 2-grams qui va considérer les mots pris 2 à 2.
Attention ça pourrait être tentant d’ajouter beaucoup de données et d’aller vers des 3-grams, 4-grams. Dans les faits vous risquez de vous retrouver avec des combinaisons très spécifiques et un volume de données très important. Trop important.
Les algorithmes de NLP
Vous êtes passé de données textuelles inexploitables à des données textuelles préparées et structurées. Quelles sont les prochaines étapes ?
Avant de passer aux algorithmes il peut être intéressant de faire une étape de réduction de dimension si votre matrice document terme est très importante. Je peux vous parler de 2 méthodes pour la réduction de dimension :
- Réduire la dimension en filtrant certains mots. Les mots très fréquents ne seront pas intéressants pour vos analyses. Vous avez déjà supprimé les stop words mais il se peut qu’il y ait des mots fréquents liés au domaine analysé. De même, les mots très rares ne seront pas non plus intéressants.
- Utiliser la méthode SVD (Singular Value Decomposition) qui permet de factoriser la matrice.
Pour finir, maintenant que vos données sont prêtes, vous allez enfin pouvoir les exploiter en appliquant un algorithme. Tout est permis à partir d’ici. Vous pouvez tester Random Forest, Gradient Boosting ou la régression logistique qui sont des algorithmes qui fonctionnent bien en général sur des problématiques de NLP.
Ce qu’il faut retenir en NLP
Une petite fiche synthétique des étapes essentielles dans un projet de NLP ou de textmining. Retrouvez ci-dessous les étapes pour nettoyer et structurer les données. Concernant les algorithmes supervisés il n’y a pas de spécificités. Pour les algorithmes non supervisés il existe des méthodes spécifiques comme le topic modeling.

A vous de jouer !