Du NLP avec Python NLTK - datacorner par Benoit Cayla (2024)

Dans un précédent article nous avons vu comment la librairie SpaCy pouvait nous aider à analyser et surtout exploiter des données textuelles. Nous allons voir dans cet article comment utiliser l’autre librairie (quelque peu concurrente, mais pas tant que ça finalement) NLTK de Python.

Index

Installation de NLTK

Pour commencer nous devons installer la librairie. Pour celà vous devez bien sur déjà disposer de Python sur votre machine et ensuite utiliser PIP (package installer for Python) pour installer la librairie nltk :

ShellSession

pip install nltk

Ce n’est pas vraiment fini, car une fois la librairie installée, il faut maintenant télécharger tout le corpus NLTK afin de pouvoir utiliser ses fonctionnalités correctement.

Un corpus est un ensemble de documents, artistiques ou non (textes, images, vidéos, etc.), regroupés dans une optique précise.

Wikipédia

Dans notre cas, on n’entend par corpus que les éléments textuels.

Pour installer ces fameux corpus NLTK, et si comme moi vous utilisez Jupyter tapez simplement :

Python

import nltknltk.download()

Attendez quelques secondes et une fenêtre devrait s’ouvrir :

Nous n’allons pas être sélectif et tout prendre pour ce tuto. Sélectionnez «All» et cliquez sur le bouton Download dans le coin inférieur gauche de la fenêtre. Puis patientez jusqu’à ce que tout soit téléchargé dans votre dossier de destination …

Commençons !

Maintenant que notre environnement NLTK est prêt, nous allons voir ensemble les fonctions de base de cette librairie. Pour celà nous allons utiliser ce texte :

Wikipédia est un projet wiki d’encyclopédie collective en ligne, universelle, multilingue et fonctionnant sur le principe du wiki. Aimez-vous l’encyclopédie wikipedia ?

Ensuite importons les librairies qui nous seront nécessaire:

Python

from nltk.corpus import stopwordsfrom nltk import word_tokenizefrom nltk.tokenize import sent_tokenizeimport redata = u"""Wikipédia est un projet wiki d’encyclopédie collective en ligne, universelle, multilingue et fonctionnant sur le principe du wiki. Aimez-vous l'encyclopédie wikipedia ?"""

Les «stops words»

Avant toute chose il faudra retirer tous les mots qui n’apportent pas vraiment de valeurs à l’analyse globale du texte. On appelle ces mots les «stop words» et bien sur cette liste est propre à chaque langue. Bonne nouvelle, NLTK propose une liste de stop words en Français (toutes les langues ne sont en effet pas disponibles) :

Python

french_stopwords = set(stopwords.words('french'))filtre_stopfr = lambda text: [token for token in text if token.lower() not in french_stopwords]

Grâce à la fonction lambda de Python on créé une petite fonction qui nous permettra en une seule ligne de filtrer un texte à partir de la liste des stop words français.

french_stopwords = set(stopwords.words(‘french’)) filtre_stopfr = lambda text: [token for token in text if token.lower() not in french_stopwords]

Grâce à la fonction lambda de Python on créé une petite fonction qui nous permettra en une seule ligne de filtrer un texte à partir de la liste des stop words français.

Python

filtre_stopfr( word_tokenize(data, language="french") )
['Wikipédia', 'projet', 'wiki', '’', 'encyclopédie', 'collective', 'ligne', ',', 'universelle', ',', 'multilingue', 'fonctionnant', 'principe', 'wiki', '.', 'Aimez-vous', "l'encyclopédie", 'wikipedia', '?']

Voilà tous les mots (du genre articles, etc.) on été supprimés de la liste globale de mots. Cette fonction est vraiment utile, comparez par exemple avec un filtre qui n’utiliserait que des RegEx :

Python

sp_pattern = re.compile( """[\.\!\"\s\?\-\,\']+""", re.M).splitsp_pattern(data)

Tokenisation

Avec NLTK on peut découper par mot avec la fonction word_tokenize(…) ou par phrase sent_tokenize(…). Commençons par un découpage par phrase :

Python

sent_tokenize(data, language="french")
['Wikipédia est un projet wiki d’encyclopédie collective en ligne, universelle, multilingue et fonctionnant sur le principe du wiki.', "Aimez-vous l'encyclopédie wikipedia ?"]

Intéressant mais la tokenization par mot l’est encore plus bien sur :

Python

word_tokenize(data, language="french")
['Wikipédia', 'est', 'un', 'projet', 'wiki', 'd',... 'Aimez-vous', "l'encyclopédie", 'wikipedia', '?']

Et si on combine cette fonction avec le filtre des stops words vu précédemment, c’est encore plus intéressant :

Python

filtre_stopfr( word_tokenize(data, language="french") )
['Wikipédia', 'projet', 'wiki', '’', 'encyclopédie', 'collective', 'ligne', ',', 'universelle', ',', 'multilingue', 'fonctionnant', 'principe', 'wiki', '.', 'Aimez-vous', "l'encyclopédie", 'wikipedia', '?']

Fréquence de distribution des valeurs

Il peut être intéressant d’avoir la fréquence de distribution des valeurs, pour celà il existe bien entendu une fonction FreqDist():

Python

fd = nltk.FreqDist(phfr) print(fd.most_common())
[('wiki', 2), (',', 2), ('Wikipédia', 1), ('projet', 1), ('’', 1), ('encyclopédie', 1), ('collective', 1), ('ligne', 1), ('universelle', 1), ('multilingue', 1), ('fonctionnant', 1), ('principe', 1), ('.', 1), ('Aimez-vous', 1), ("l'encyclopédie", 1), ('wikipedia', 1), ('?', 1)]

Cette fonction renvoit un Tableau a deux dimensions dans lequel on trouve chaque valeur du corpus avec sa fréquence de distribution. A titre d’exemple le mot wiki est placé 2 fois dans le texte.

Stemmatisation

Maintenant il serait interressant de regrouper les mots ayant la même racine synthaxique, pour cela nous allons utiliser la fonction de stemmatisation de NLTK : stem(). Bonne nouvelle encore il existe une fonction pour le français FrenchStemmer() ! nous allons bien sur l’utiliser ici :

Python

example_words = ["donner","don","donne","donnera","dons","test"]stemmer = FrenchStemmer()for w in example_words: print(stemmer.stem(w))
dondondondondontest

La fonction de stemmatisation a bien retrouvé les racines du mot «don». Honnêtement ça ne marche pas toujours aussi bien malheureusem*nt, mais cette fonction peut néanmoins s’avérer utile pour un premier débroussaillage.

Conclusion

L’objectif de cet article étant de montrer les fonctionnalités de base de NLTK nous ne sommes pas entré dans le détail. Cette librairie est riche, très riche même mais nécessite pas mal d’ajustement si vous voulez créer des fonctions à base de NLP puissante. Les différences avec SpaCy ? en fait il en a beaucoup, la philosophie des ces deux librairie est totalement différente (objet vs approche traditionnelle pour NLTK par exemple) … en fait je pense qu’il faut plutot voir ces deux librairies comme complémentaires, chacune apportant à l’autre ses propres manques.

Du NLP avec Python NLTK - datacorner par Benoit Cayla (2)

Benoit Cayla

Ingénieur en informatique avec plus de 20 ans d’expérience dans la gestion et l’utilisation de données, Benoit CAYLA a mis son expertise au profit de projets très variés tels que l’intégration, la gouvernance, l’analyse, l’IA, la mise en place de MDM ou de solution PIM pour le compte de diverses entreprises spécialisées dans la donnée (dont IBM, Informatica et Tableau). Ces riches expériences l’ont naturellement conduit à intervenir dans des projets de plus grande envergure autour de la gestion et de la valorisation des données, et ce principalement dans des secteurs d’activités tels que l’industrie, la grande distribution, l’assurance et la finance. Également, passionné d’IA (Machine Learning, NLP et Deep Learning), l’auteur a rejoint Blue Prism en 2019 et travaille aujourd’hui en tant qu’expert data/IA et processus. Son sens pédagogique ainsi que son expertise l’ont aussi amené à animer un blog en français (datacorner.fr) ayant pour but de montrer comment comprendre, analyser et utiliser ses données le plus simplement possible.

Du NLP avec Python NLTK - datacorner par Benoit Cayla (2024)
Top Articles
Latest Posts
Article information

Author: Jerrold Considine

Last Updated:

Views: 6301

Rating: 4.8 / 5 (58 voted)

Reviews: 89% of readers found this page helpful

Author information

Name: Jerrold Considine

Birthday: 1993-11-03

Address: Suite 447 3463 Marybelle Circles, New Marlin, AL 20765

Phone: +5816749283868

Job: Sales Executive

Hobby: Air sports, Sand art, Electronics, LARPing, Baseball, Book restoration, Puzzles

Introduction: My name is Jerrold Considine, I am a combative, cheerful, encouraging, happy, enthusiastic, funny, kind person who loves writing and wants to share my knowledge and understanding with you.