Skip to content

Commit

Permalink
Reprise des chapitres NLP (#459)
Browse files Browse the repository at this point in the history
* Update nlp

* clean file

* Reprises de forme

* Update 01_intro.qmd

* Update _quarto.yml
  • Loading branch information
linogaliana committed Nov 24, 2023
1 parent a06a268 commit a1ab3d9
Show file tree
Hide file tree
Showing 3 changed files with 246 additions and 153 deletions.
115 changes: 58 additions & 57 deletions content/NLP/01_intro.qmd
Expand Up @@ -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` <i class="fab fa-python"></i>
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
Expand All @@ -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}
Expand Down Expand Up @@ -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).

Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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 :





Expand Down Expand Up @@ -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.

Expand Down Expand Up @@ -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}
<div class="alert alert-info" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-comment"></i>La librairie spaCy</h3>
<h3 class="alert-heading"><i class="fa-solid fa-comment"></i> La librairie <code>SpaCy</code></h3>
```

`NTLK` est la librairie historique d'analyse textuelle en `Python`. Elle existe
Expand All @@ -416,17 +409,25 @@ plusieurs étapes de transformation des données.
```
:::

~~~python
Voici un exemple de reconnaissance d'entités nommées
sur les premières phrases de l'ouvrage

```{python}
#!pip install deplacy
#!python -m spacy download fr_core_news_sm
!python -m spacy download fr_core_news_sm
import spacy

nlp=spacy.load("fr_core_news_sm")
doc = nlp(dumas)
import spacy
from spacy import displacy
nlp=spacy.load("fr_core_news_sm")
doc = nlp(dumas[15000:17000])
displacy.render(doc, style="ent", jupyter=True)
~~~
```

La reconnaissance d'entités nommées diposnible
par défaut est souvent décevante; il est
souvent nécessaire d'enrichir les règles par défaut
par des règles _ad hoc_, propres à chaque corpus.


## Représentation d'un texte sous forme vectorielle
Expand All @@ -447,4 +448,4 @@ La pondération la plus simple est basée sur la fréquence des mots dans le doc
C'est l'objet de la métrique **tf-idf** (term frequency - inverse document frequency)
abordée dans un prochain chapitre.

## Références
## Références

0 comments on commit a1ab3d9

Please sign in to comment.