diff --git a/content/NLP/01_intro.qmd b/content/NLP/01_intro.qmd index b988d15cc..49ad51dc8 100644 --- a/content/NLP/01_intro.qmd +++ b/content/NLP/01_intro.qmd @@ -39,26 +39,15 @@ print_badges("content/NLP/01_intro.qmd") ::: -Le _NLP_ est un domaine immense de recherche. Cette page est une introduction -fort incomplète à la question. Il s'agit de montrer la logique, quelques exemples +Cette partie est une introduction +à la question du nettoyage de données textuelles. +Il s'agit de montrer la logique, quelques exemples avec `Python` -et s'amuser avec comme base d'exemple un livre formidable :books: : -*Le Comte de Monte Cristo*. +et s'amuser avec comme base d'exemple un livre formidable 📖 : +[*Le Comte de Monte Cristo*](https://fr.wikipedia.org/wiki/Le_Comte_de_Monte-Cristo). -Dans le cadre de l'introduction au NLP que vous pouvez retrouver dans -les différents chapitres, nous évoquons principalement les champs suivants du NLP: - -- _Preprocessing_ -- Approches _bag of words_ et contextuelles (n-grams, etc.) -- _Topics modelling_ -- _Word embedding_ - -Cela laisse de côté des champs très actifs de recherche -du NLP, notamment l'analyse de sentiment ou les modèles de -langage (modèles GPT par exemple). Les outils découverts -dans cette partie du cours permettront, si vous le désirez, -de bénéficier d'une base solide pour approfondir tel ou tel -sujet. +L'objectif est de découvrir les principaux enjeux du nettoyage de données en NLP +et les enjeux de l'analyse de fréquence. ## Base d'exemple @@ -67,8 +56,10 @@ La base d'exemple est le *Comte de Monte Cristo* d'Alexandre Dumas. Il est disponible gratuitement sur le site [Project Gutemberg](http://www.gutenberg.org/ebooks/author/492) comme des milliers -d'autres livres du domaine public. La manière la plus simple de le récupérer -est de télécharger avec le _package_ `request` le fichier texte et le retravailler +d'autres livres du domaine public. + +La manière la plus simple de le récupérer +est de télécharger avec le _package_ `Request` le fichier texte et le retravailler légèrement pour ne conserver que le corpus du livre : ```{python} @@ -98,12 +89,12 @@ dumas[10000:10500] ### Objectif Le *natural language processing* (NLP) ou -*traitement automatisé de la langue* (TAL) en Français, +*traitement automatisé du langage* (TAL) en Français, vise à extraire de l'information de textes à partir d'une analyse statistique du contenu. Cette définition permet d'inclure de nombreux champs d'applications au sein -du NLP (traduction, analyse de sentiment, recommandation, surveillance, etc. ) ainsi que de méthodes. +du NLP (traduction, analyse de sentiment, recommandation, surveillance, etc. ). -Cette approche implique de transformer un texte, qui est une information compréhensible par un humain, en un nombre, information appropriée pour un ordinateur et une approche statistique ou algorithmique. +Cette approche implique de transformer un texte, qui est une information compréhensible par un humain, en un nombre, information appropriée pour un ordinateur dans le cadre d'une approche statistique ou algorithmique. Transformer une information textuelle en valeurs numériques propres à une analyse statistique n'est pas une tâche évidente. Les données textuelles sont **non structurées** puisque l'information cherchée, qui est propre à chaque analyse, est perdue au milieu d'une grande masse d'informations qui doit, de plus, être interprétée dans un certain contexte (un même mot ou une phrase n'ayant pas la même signification selon le contexte). @@ -114,34 +105,36 @@ Si cette tâche n'était pas assez difficile comme ça, on peut ajouter d'autres * complexes : structures variables, accords... * ambigues : synonymie, polysémie, sens caché... * propres à chaque langue : il n'existe pas de règle de passage unique entre deux langues -* grande dimension : des combinaisons infinies de séquences de mots +* de grande dimension : des combinaisons infinies de séquences de mots ### Méthode -L’unité textuelle peut être le mot ou encore une séquence de *n* +L’analyse textuelle vise à transformer le texte en données +numériques manipulables. Pour cela il est nécessaire de se fixer +une unité sémantique minimale. +Cette unité textuelle peut être le mot ou encore une séquence de *n* mots (un *n-gramme*) ou encore une chaîne de caractères (e.g. la -ponctuation peut être signifiante). On parle de **token**. L’analyse textuelle vise à transformer le texte en données -numériques manipulables. +ponctuation peut être signifiante). On parle de **token**. -On peut ensuite utiliser diverses techniques (clustering, +On peut ensuite utiliser diverses techniques (_clustering_, classification supervisée) suivant l’objectif poursuivi pour exploiter -l’information transformée. Mais les étapes de nettoyage de texte sont indispensables car sinon un algorithme sera incapable de détecter une information pertinente dans l'infini des possibles. - +l’information transformée. Mais les étapes de nettoyage de texte sont indispensables. +Sinon un algorithme sera incapable de détecter une information pertinente dans l'infini des possibles. ## Nettoyer un texte Les *wordclouds* sont des représentations graphiques assez pratiques pour visualiser -les mots les plus fréquents. Elles sont très simples à implémenter en `Python` -avec le module `wordcloud` qui permet même d'ajuster la forme du nuage à +les mots les plus fréquents, lorsqu'elles ne sont pas utilisées à tord et à travers. +Les _wordcloud_ sont très simples à implémenter en `Python` +avec le module `Wordcloud`. Quelques paramètres de mise en forme +permettent même d'ajuster la forme du nuage à une image : ```{python} #| echo: true -#| label: fig-wordcloud-dumas -#| fig-cap: "Nuage de mot produit à partir du Comte de Monte Cristo" import wordcloud import numpy as np @@ -153,28 +146,33 @@ import matplotlib.pyplot as plt img = "https://raw.githubusercontent.com/linogaliana/python-datascientist/master/content/NLP/book.png" book_mask = np.array(PIL.Image.open(io.BytesIO(requests.get(img).content))) -fig = plt.figure() - def make_wordcloud(corpus): wc = wordcloud.WordCloud(background_color="white", max_words=2000, mask=book_mask, contour_width=3, contour_color='steelblue') wc.generate(corpus) return wc -plt.imshow(make_wordcloud(dumas), interpolation='bilinear') +wordcloud_dumas = make_wordcloud(dumas) +``` + +```{python} +#| echo: true +#| fig-cap: Nuage de mot produit à partir du Comte de Monte Cristo +#| label: fig-wordcloud-dumas +plt.imshow(wordcloud_dumas, interpolation='bilinear') plt.axis("off") -#plt.show() -#plt.savefig('word.png', bbox_inches='tight') ``` Cela montre clairement qu'il est nécessaire de nettoyer notre texte. Le nom du personnage principal, Dantès, est ainsi masqué par un certain nombre d'articles ou mots de liaison qui perturbent l'analyse. Ces mots sont des -*stop-words*. La librairie `NLTK` (*Natural Language ToolKit*), librairie +*stop-words*. + +La librairie `NLTK` (*Natural Language ToolKit*), librairie de référence dans le domaine du NLP, permet de facilement retirer ces stopwords (cela pourrait également être fait avec la librairie plus récente, `spaCy`). Avant cela, il est nécessaire -de transformer notre texte en le découpant par unités fondamentales (les tokens). +de transformer notre texte en le découpant par unités fondamentales (les _tokens_). Les exemples suivants, extraits de @galianafuzzy, montrent l'intérêt du nettoyage de textes lorsqu'on désire comparer des corpus @@ -250,12 +248,6 @@ words = [word for word in words if word.isalpha()] words[1030:1050] ``` -Comme indiqué ci-dessus, pour télécharger -le corpus de ponctuation, il est -nécessaire d'exécuter la ligne de -commande suivante : - - @@ -296,7 +288,7 @@ nltk.download('stopwords') [^2]: Le corpus de _stop-words_ de `NLTK` est relativement limité. Il est recommandé -de privilégier celui de `spaCy`, plus +de privilégier celui de `SpaCy`, plus complet, pour éliminer plus de mots valises. @@ -389,13 +381,14 @@ stemmer = FrenchStemmer() Cette étape n'est pas une étape de préparation mais illustre la capacité des librairies `Python` a extraire du sens d'un texte. La librairie -`spaCy` permet de faire de la reconnaissance d'entités nommées, ce qui peut +`spaCy` permet de faire de la reconnaissance d'entités nommées +(_name entity recognition_, NER), ce qui peut être pratique pour extraire rapidement certains personnages de notre oeuvre. ::: {.cell .markdown} ```{=html}