Skip to content

Commit 4cd44f3

Browse files
Relecture NLP (#474)
* minor adds * fin chap 1 nlp * chapitre 2 * pub funathon
1 parent deaafb6 commit 4cd44f3

File tree

13 files changed

+43
-35
lines changed

13 files changed

+43
-35
lines changed

content/NLP/01_intro.qmd

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ Si cette tâche n'était pas assez difficile comme ça, on peut ajouter d'autres
103103
* **bruitées** : ortographe, fautes de frappe...
104104
* **changeantes** : la langue évolue avec de nouveaux mots, sens...
105105
* **complexes** : structures variables, accords...
106-
* **ambigues** : synonymie, polysémie, sens caché...
106+
* **ambiguës** : synonymie, polysémie, sens caché...
107107
* **propres à chaque langue** : il n'existe pas de règle de passage unique entre deux langues
108108
* de **grande dimension** : des combinaisons infinies de séquences de mots
109109

@@ -126,8 +126,8 @@ Sinon un algorithme sera incapable de détecter une information pertinente dans
126126
## Nettoyer un texte
127127

128128
Les *wordclouds* sont des représentations graphiques assez pratiques pour visualiser
129-
les mots les plus fréquents, lorsqu'elles ne sont pas utilisées à tord et à travers.
130-
Les _wordcloud_ sont très simples à implémenter en `Python`
129+
les mots les plus fréquents, lorsqu'elles ne sont pas utilisées à tort et à travers.
130+
Les _wordclouds_ sont très simples à implémenter en `Python`
131131
avec le module `Wordcloud`. Quelques paramètres de mise en forme
132132
permettent même d'ajuster la forme du nuage à
133133
une image :
@@ -358,7 +358,7 @@ print(stemmed[1030:1050])
358358
```
359359

360360
A ce niveau, les mots commencent à être moins intelligibles par un humain.
361-
La machine prendra le relais, on lui a préparé le travail
361+
La machine prendra le relais, on lui a préparé le travail.
362362

363363
::: {.cell .markdown}
364364
```{=html}
@@ -382,7 +382,7 @@ stemmer = FrenchStemmer()
382382
Cette étape n'est pas une étape de préparation mais illustre la capacité
383383
des librairies `Python` a extraire du sens d'un texte. La librairie
384384
`spaCy` permet de faire de la reconnaissance d'entités nommées
385-
(_name entity recognition_, NER), ce qui peut
385+
(_named entity recognition_, NER), ce qui peut
386386
être pratique pour extraire rapidement certains personnages de notre oeuvre.
387387

388388
::: {.cell .markdown}
@@ -395,7 +395,7 @@ des librairies `Python` a extraire du sens d'un texte. La librairie
395395
depuis les années 1990. L'utilisation industrielle du NLP dans le monde
396396
de la _data science_ est néanmoins plus récente et doit beaucoup à la collecte
397397
accrue de données non structurées par les réseaux sociaux. Cela a amené à
398-
un renouvelement du champ du NLP, tant dans le monde de la recherche que dans
398+
un renouvellement du champ du NLP, tant dans le monde de la recherche que dans
399399
sa mise en application dans l'industrie de la donnée.
400400

401401
Le _package_ [`spaCy`](https://spacy.io/) est l'un des packages qui a permis
@@ -410,7 +410,7 @@ plusieurs étapes de transformation des données.
410410
:::
411411

412412
Voici un exemple de reconnaissance d'entités nommées
413-
sur les premières phrases de l'ouvrage
413+
sur les premières phrases de l'ouvrage :
414414

415415
```{python}
416416
#!pip install deplacy
@@ -436,9 +436,9 @@ Une fois nettoyé, le texte est plus propice à une représentation vectorielle.
436436
En fait, implicitement, on a depuis le début adopté une démarche *bag of words*.
437437
Il s'agit d'une représentation, sans souci de contexte (ordre des mots, contexte d'utilisation),
438438
où chaque *token* représente un élément dans un vocabulaire de taille $|V|$.
439-
On peut ainsi avoir une représentation matricielle les occurrences de
439+
On peut ainsi avoir une représentation matricielle des occurrences de
440440
chaque *token* dans plusieurs documents (par exemple plusieurs livres,
441-
chapitres, etc.) pour, par exemple, en déduire une forme de similarité.
441+
chapitres, etc.) pour par exemple en déduire une forme de similarité.
442442

443443

444444
Afin de réduire la dimension de la matrice *bag of words*,

content/NLP/02_exoclean.qmd

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: "Nettoyer un texte: des exercices pour découvrir l'approche bag-of-words"
2+
title: "Nettoyer un texte : des exercices pour découvrir l'approche bag-of-words"
33
date: 2020-10-29T13:00:00Z
44
draft: false
55
weight: 20
@@ -55,7 +55,7 @@ avec cette fois des auteurs anglophones :
5555
Les données sont disponibles sur un CSV mis à disposition sur [`Github`](https://github.com/GU4243-ADS/spring2018-project1-ginnyqg/blob/master/data/spooky.csv). L'URL pour les récupérer directement est
5656
<https://github.com/GU4243-ADS/spring2018-project1-ginnyqg/raw/master/data/spooky.csv>.
5757

58-
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. Il s'agit donc d'une approche basée sur l'analyse de fréquences.
58+
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 et de les représenter graphiquement. Il s'agit donc d'une approche basée sur l'analyse de fréquences.
5959
On prendra appui sur l'approche *bag of words* présentée dans le chapitre précédent[^1].
6060
Il n'y aura pas de modélisation particulière, ceci est réservé aux chapitres suivants.
6161

@@ -84,13 +84,13 @@ prédire quel texte correspond à quel auteur à partir d'un modèle `Word2Vec`.
8484
Cela sera un pas supplémentaire dans la formalisation puisqu'il s'agira de
8585
représenter chaque mot d'un texte sous forme d'un vecteur de grande dimension, ce
8686
qui nous permettra de rapprocher les mots entre eux dans un espace complexe.
87-
Cette technique, dite des plongements de mots (_Word Embedding_),
87+
Cette technique, dite des plongements de mots (_Word Embeddings_),
8888
permet ainsi de transformer une information complexe difficilement quantifiable
8989
comme un mot
9090
en un objet numérique qui peut ainsi être rapproché d'autres par des méthodes
9191
algébriques. Pour découvrir ce concept, ce [post de blog](https://ssphub.netlify.app/post/word-embedding/)
9292
est particulièrement utile. En pratique, la technique des
93-
plongements de mots permet d'obtenir des tableaux comme celui-ci:
93+
plongements de mots permet d'obtenir des tableaux comme celui-ci :
9494

9595
:::{#fig-relevanc-table-embedding}
9696
![](https://minio.lab.sspcloud.fr/lgaliana/generative-art/pythonds/word_embedding.png)
@@ -567,7 +567,7 @@ g.set(xscale="log", yscale="log")
567567
g
568568
```
569569

570-
Nous avons bien, graphiquement, une relation log-linéaire entre les deux:
570+
Nous avons bien, graphiquement, une relation log-linéaire entre les deux :
571571

572572
```{python}
573573
g.figure.get_figure()
@@ -589,8 +589,7 @@ print(model.summary())
589589

590590
Le coefficient de la régression est presque 1 ce qui suggère bien une relation
591591
quasiment log-linéaire entre le rang et la fréquence d'occurrence d'un mot.
592-
Dit autrement, le mot le plus utilisé l'est deux fois plus que le deuxième
593-
mois le plus fréquent qui l'est trois plus que le troisième, etc.
592+
Dit autrement, le mot le plus utilisé l'est deux fois plus que le deuxième mot le plus fréquent qui l'est trois plus que le troisième, etc.
594593

595594
## Nettoyage d'un texte
596595

@@ -871,7 +870,7 @@ Les 10 scores les plus élevés sont les suivants :
871870
print(train.iloc[list_fear[:9]]['Text'].values)
872871
```
873872

874-
On remarque que les scores les plus élévés sont soient des extraits courts où le mot apparait une seule fois, soit des extraits plus longs où le mot fear apparaît plusieurs fois.
873+
On remarque que les scores les plus élevés sont soient des extraits courts où le mot apparait une seule fois, soit des extraits plus longs où le mot fear apparaît plusieurs fois.
875874

876875

877876

@@ -948,7 +947,7 @@ from nltk.metrics import BigramAssocMeasures
948947
<h3 class="alert-heading"><i class="fa-solid fa-pencil"></i> Exercice 7 : n-grams et contexte du mot fear</h3>
949948
```
950949
1. Utiliser la méthode `concordance` pour afficher le contexte dans lequel apparaît le terme `fear`.
951-
2. Sélectionner et afficher les meilleures collocation, par exemple selon le critère du ratio de vraisemblance.
950+
2. Sélectionner et afficher les meilleures collocations, par exemple selon le critère du ratio de vraisemblance.
952951

953952
Lorsque deux mots sont fortement associés, cela est parfois dû au fait qu'ils apparaissent rarement. Il est donc parfois nécessaire d'appliquer des filtres, par exemple ignorer les bigrammes qui apparaissent moins de 5 fois dans le corpus.
954953

@@ -964,7 +963,7 @@ Lorsque deux mots sont fortement associés, cela est parfois dû au fait qu'ils
964963

965964

966965
Avec la méthode `concordance` (question 1),
967-
la liste devrait ressembler à celle-ci:
966+
la liste devrait ressembler à celle-ci :
968967

969968
```{python}
970969
#| include: true

content/NLP/03_lda.qmd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ La matrice termes-documents qui sert de point de départ est la suivante :
225225

226226
On dit que cette matrice est *sparse* (creuse en Français) car elle contient principalement des 0. En effet, un document n'utilise qu'une partie mineure du vocabulaire complet.
227227

228-
La LDA consiste à transformer cette matrice *sparse*document-terme en deux matrices de moindre dimension:
228+
La LDA consiste à transformer cette matrice *sparse* document-terme en deux matrices de moindre dimension :
229229

230230
1. Une matrice document-sujet
231231
2. Une matrice sujet-mots

content/NLP/04_word2vec.qmd

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ avec cette fois des auteurs anglophones :
5454
Les données sont disponibles ici : [spooky.csv](https://github.com/GU4243-ADS/spring2018-project1-ginnyqg/blob/master/data/spooky.csv) et peuvent être requétées via l'url
5555
<https://github.com/GU4243-ADS/spring2018-project1-ginnyqg/raw/master/data/spooky.csv>.
5656

57-
Le but va être dans un premier temps de regarder dans le détail les termes les plus fréquents utilisés par les auteurs, de les représenter graphiquement puis on va ensuite essayer de prédire quel texte correspond à quel auteur à partir de différents modèles de vectorisation, notamment les *word embeddings*.
57+
Le but va être dans un premier temps de regarder dans le détail les termes les plus fréquents utilisés par les auteurs et de les représenter graphiquement, puis on va ensuite essayer de prédire quel texte correspond à quel auteur à partir de différents modèles de vectorisation, notamment les *word embeddings*.
5858

5959
Ce notebook est librement inspiré de :
6060

@@ -166,7 +166,7 @@ def clean_docs(texts, remove_stopwords=False, n_process = 4):
166166

167167
On applique la fonction `clean_docs` à notre colonne `pandas`.
168168
Les `pandas.Series` étant itérables, elles se comportent comme des listes et
169-
fonctionnent ainsi très bien avec notre `pipe` `spacy`
169+
fonctionnent ainsi très bien avec notre `pipe` `spacy`.
170170

171171
```{python}
172172
spooky_df['text_clean'] = clean_docs(spooky_df['text'])
@@ -217,7 +217,7 @@ X_train[0]
217217

218218
On peut aussi vérifier qu'on est capable de retrouver
219219
la correspondance entre nos auteurs initiaux avec
220-
la méthode `inverse_transform`
220+
la méthode `inverse_transform` :
221221

222222
```{python}
223223
print(y_train[0], le.inverse_transform([y_train[0]])[0])

content/NLP/05_exo_supp.qmd

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,16 @@ print_badges("content/NLP/05_exo_supp.qmd")
3636
```
3737
:::
3838

39-
Cette page approfondit certains aspects présentés dans les autres tutoriels. Il s'agit d'une suite d'exercice, avec corrections, pour présenter d'autres aspects du NLP ou pratiquer sur des données différentes
39+
Cette page approfondit certains aspects présentés dans les autres tutoriels.
40+
Il s'agit d'une suite d'exercice, avec corrections, pour présenter d'autres aspects du NLP ou pratiquer sur des données différentes.
41+
42+
# NLP & Sentiment Analysis : Analyse textuelle des commentaires Trustpilot
43+
44+
Pour en savoir plus sur le sentiment analysis, vous pouvez regarder le sujet 5 de l'édition 2023 du Funathon, disponible sur [Github](https://github.com/InseeFrLab/funathon2023_sujet5/) ou sur le [SSP Cloud](https://datalab.sspcloud.fr/launcher/ide/jupyter-python?autoLaunch=true&init.personalInit=%C2%ABhttps%3A%2F%2Fraw.githubusercontent.com%2FInseeFrLab%2Ffunathon2023_sujet5%2Fmain%2Finit.sh%C2%BB). Très guidé, ce sujet vous permettra d'avoir les bases sur un projet lié à de l'analyse textuelle.
45+
46+
Là où la première partie consiste en quelques petits rappels sur le web scraping, la seconde consiste à analyser les données collectées.
47+
En particulier, étant donné que l'on dispose des commentaires laissés par les clients ainsi que leur note, il est intéressant de se demander dans quelle mesure il est possible de prédire la note laissée par un client selon l'évaluation associée.
48+
Pour ce faire, on va devoir coupler les méthodes de traitement du langage naturel (NLP) et celles d'apprentissage statistique (machine learning).
4049

4150

4251
# Exploration des libellés de l'openfood database

content/NLP/index.qmd

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ nous nous sommes jusqu'à présent plutôt consacrés
2222
dimension certes modeste mais qui ouvraient déjà énormément de
2323
problématiques à creuser. Cette partie propose maintenant de se
2424
consacrer à un sujet dont il n'est pas évident _a priori_ que
25-
les ordinateurs s'emparent: le __langage humain__ et sa richesse.
25+
les ordinateurs s'emparent : le __langage humain__ et sa richesse.
2626

2727
En effet, si la linguistique propose certes de représenter
2828
de manière conceptuelle le langage sous une forme de données, comment
@@ -36,7 +36,7 @@ humain met lui-même des années à comprendre et s'approprier ?[^blague]
3636
> Parce que le sable change tout le temps de paradigme !
3737
3838
Ne l'ayant pas comprise du fait de mon esprit obtus, je lui
39-
ai demandé de me l'expliquer. Voici sa réponse
39+
ai demandé de me l'expliquer. Voici sa réponse :
4040

4141
> Bien sûr, je serais ravi de l'expliquer ! Cette blague joue sur le double sens du mot "paradigme" et fait un jeu de mots avec les notions liées à la programmation et à la plage.
4242
>
@@ -51,7 +51,7 @@ humain met lui-même des années à comprendre et s'approprier ?[^blague]
5151

5252
Le traitement automatique du langage - traduction française du concept de
5353
_natural language processing_ (NLP) - est l'ensemble des techniques
54-
permettant aux ordinateurs de comprendre, analyser synthétiser et
54+
permettant aux ordinateurs de comprendre, analyser, synthétiser et
5555
générer le langage humain[^1].
5656

5757
[^1]: Le concept de _natural language processing_ tend à remplacer celui

content/getting-started/03_data_analysis.qmd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ résultat, il est possible d'alerter sur certaines limites. Il est important,
233233
dans ses recherches comme dans les discussions avec d'autres interlocuteurs,
234234
de faire attention au biais de confirmation qui consiste
235235
à ne retenir que l'information qui correspond à nos conceptions _a priori_ et
236-
à ne pas considérer celles qui pourraient aller à l'encontre de celles-ci:
236+
à ne pas considérer celles qui pourraient aller à l'encontre de celles-ci :
237237

238238
![](https://s3.amazonaws.com/revue/items/images/005/107/849/original/59df6bbf7a4b2da55d4eebbd37457f47.png?1571180763)
239239

content/manipulation/04a_webscraping_TP.qmd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1076,7 +1076,7 @@ def get_cara_pokemon(pokemon_name):
10761076
```
10771077

10781078
A l'issue de la question 3,
1079-
vous devriez obtenir une liste de caractéristiques proche de celle-ci:
1079+
vous devriez obtenir une liste de caractéristiques proche de celle-ci :
10801080

10811081
```{python}
10821082
get_cara_pokemon("bulbasaur")

content/manipulation/07_dask.qmd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ Ce qui est pratique avec `dask.dataframe` c'est que de nombreuses méthodes sont
274274
dvf_dd.loc[:,"Type local"].value_counts().compute()
275275
```
276276

277-
A titre de comparaison, comparons les temps de calculs entre `pandas` et `dask` ici:
277+
A titre de comparaison, comparons les temps de calculs entre `pandas` et `dask` ici :
278278

279279
```{python}
280280
import time

content/modelisation/6_pipeline.qmd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -851,7 +851,7 @@ plutôt qu'une forêt aléatoire.
851851
:::
852852

853853
A l'issue de cet exercice, vous devriez avoir des _MDI_ proches
854-
de celles-ci:
854+
de celles-ci :
855855

856856

857857
```{python}

0 commit comments

Comments
 (0)