Skip to content

Commit

Permalink
get_feature_names is deprecated in scikit 1.0.X versions (#351)
Browse files Browse the repository at this point in the history
* sklearn depreciation function

cf. https://stackoverflow.com/questions/70215049/attributeerror-tfidfvectorizer-object-has-no-attribute-get-feature-names-out

* dans lda aussi

* rawhtml

* Update README.md

* Update README.md

* rawhtml

* lda

* update

* Automated changes

* Automated changes

* reformat

* Automated changes

* Automated changes

* LDA

* Automated changes

* Automated changes

---------

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
linogaliana and github-actions[bot] committed Feb 13, 2023
1 parent 3912a7e commit 934149d
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 45 deletions.
36 changes: 19 additions & 17 deletions README.md
@@ -1,4 +1,4 @@
# Python pour data-scientists et économistes :snake:
# Python pour la data science <img height="28" width="28" src="https://cdn.simpleicons.org/python/00ccff99" />
[![build-doc Actions Status](https://github.com/linogaliana/python-datascientist/actions/workflows/prod.yml/badge.svg)](https://github.com/linogaliana/python-datascientist/actions)
[![Onyxia](https://img.shields.io/badge/SSPcloud-Tester%20via%20SSP--cloud-informational&color=yellow?logo=Python)](https://datalab.sspcloud.fr/launcher/ide/jupyter-python?autoLaunch=true&onyxia.friendlyName=%C2%ABpython-datascientist%C2%BB)
[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](http://colab.research.google.com/github/linogaliana/python-datascientist/blob/pandas_intro/static/notebooks/numpy.ipynb)
Expand All @@ -13,28 +13,35 @@



Ce dépôt `Github`
Ce dépôt `Github` <img height="18" width="18" src="https://cdn.simpleicons.org/github/00ccff99" />
stocke les fichiers sources ayant permis de construire le site
<https://pythonds.linogaliana.fr/>.

Il s'agit de l'ensemble du cours *Python pour les data-scientists* :snake:
Il s'agit de l'ensemble du cours *Python pour la data science* <img height="18" width="18" src="https://cdn.simpleicons.org/python/00ccff99" />
que je donne en deuxième année (Master 1) de l'ENSAE.

## Syllabus

Le syllabus est disponible [](https://www.ensae.fr/courses/python-pour-le-data-scientist-pour-leconomiste/).
Le syllabus est disponible [sur le site de l'ENSAE](https://www.ensae.fr/courses/1425-python-pour-le-data-scientist).

Globalement, il propose un contenu très complet pouvant autant
satisfaire des débutants en
_data-science_ que quelqu'un à la recherche de contenu plus avancé :
_data science_ que des personnes à la recherche de contenu plus avancé :

1. Manipulation de données avec `Python`: manipulation de données standards (`pandas`), données géographiques (`geopandas`), récupération de données (webscraping, API)...
1. Visualisation de données avec `Python`: visualisations classiques (`matplotlib`, `seaborn`), cartographie, visualisations réactives (`plotly`, `folium`)
1. Modélisation: _machine learning_ (`scikit`), économétrie
1. Traitement de données textuelles (NLP)
1. Introduction à la _data-science_ moderne: _cloud computing_, ElasticSearch, intégration continue...
1. __Manipulation de données__ : manipulation de données standards (`Pandas`), données géographiques (`Geopandas`), récupération de données (webscraping, API)...
1. __Visualisation de données__ : visualisations classiques (`Matplotlib`, `Seaborn`), cartographie, visualisations réactives (`Plotly`, `Folium`)
1. __Modélisation__: _machine learning_ (`Scikit`), économétrie
1. __Traitement de données textuelles__ (NLP): découverte de la tokenisation avec `NLTK` et `SpaCy`, modélisation...
1. **Introduction à la _data science_ moderne**: _cloud computing_, `ElasticSearch`, intégration continue...

Un bon complément du contenu du site web est le cours que nous donnons avec Romain Avouac ([@avouacr](https://github.com/avouacr)) en dernière année de l'ENSAE plus tourné mise en production de projets _data-science_: https://ensae-reproductibilite.netlify.app/
L'ensemble du contenu de ce site s'appuie sur des données
ouvertes, qu'il s'agisse de données françaises (principalement
issues de la plateforme
centralisatrice [`data.gouv`](https://www.data.gouv.fr) ou du site
_web_ de l'[Insee](https://www.insee.fr)) ou de données
américaines.

Un bon complément du contenu du site web est le cours que nous donnons avec Romain Avouac ([@avouacr](https://github.com/avouacr)) en dernière année de l'ENSAE plus tourné autour de la mise en production de projets _data-science_: https://ensae-reproductibilite.netlify.app/

<details>
<summary>
Expand All @@ -57,12 +64,7 @@ notebooks `Jupyter` dans la configuration qui vous sied le mieux.
<a href="http://colab.research.google.com/github/linogaliana/python-datascientist/blob/master/notebooks/course/manipulation/01_numpy.ipynb" target="_blank" rel="noopener"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open In Colab"></a>
<a href="https://github.dev/linogaliana/python-datascientist/notebooks/course/manipulation/01_numpy.ipynb" target="_blank" rel="noopener"><img src="https://img.shields.io/static/v1?logo=visualstudiocode&amp;label=&amp;message=Open%20in%20Visual%20Studio%20Code&amp;labelColor=2c2c32&amp;color=007acc&amp;logoColor=007acc.png" alt="githubdev"></a></p>

L'ensemble du contenu de ce site s'appuie sur des données
ouvertes, qu'il s'agisse de données françaises (principalement
issues de la plateforme
centralisatrice [`data.gouv`](https://www.data.gouv.fr) ou du site
_web_ de l'[Insee](https://www.insee.fr)) ou de données
américaines.



<h2>
Expand Down
2 changes: 1 addition & 1 deletion content/course/NLP/02_exoclean/index.qmd
Expand Up @@ -841,7 +841,7 @@ tfs = tfidf.fit_transform(train['Text'])
```{python}
#| echo: true
feature_names = tfidf.get_feature_names()
feature_names = tfidf.get_feature_names_out()
corpus_index = [n for n in list(tfidf.vocabulary_.keys())]
import pandas as pd
df = pd.DataFrame(tfs.todense(), columns=feature_names)
Expand Down
65 changes: 38 additions & 27 deletions content/course/NLP/03_lda/index.qmd
Expand Up @@ -13,12 +13,13 @@ tags:
categories:
- Tutoriel
summary: |
Le modèle [Latent Dirichlet Allocation (LDA)](https://fr.wikipedia.org/wiki/Allocation_de_Dirichlet_latente)
La [Latent Dirichlet Allocation (LDA)](https://fr.wikipedia.org/wiki/Allocation_de_Dirichlet_latente)
est un modèle probabiliste génératif qui permet
de décrire des collections de documents de texte ou d’autres types de données discrètes.
La `LDA` fait
partie d’une catégorie de modèles appelés _"topic models"_, qui cherchent à découvrir des structures
thématiques cachées dans des vastes archives de documents.
thématiques cachées dans des vastes archives de documents. Le principe est de décomposer un
document comme une collection de thèmes qui se distinguent par des choix de mots différents.
---

::: {.cell .markdown}
Expand All @@ -45,23 +46,22 @@ On va ainsi continuer notre exploration de la littérature anglophones :
* HP Lovecraft (HPL) ;
* Mary Wollstonecraft Shelley (MWS).

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
Les données sont disponibles dans la base de
données [spooky.csv](https://github.com/GU4243-ADS/spring2018-project1-ginnyqg/blob/master/data/spooky.csv) et peuvent être
importées par `Python` en utilisant directement l'url
<https://github.com/GU4243-ADS/spring2018-project1-ginnyqg/raw/master/data/spooky.csv>.


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 les représenter graphiquement.

<!-- puis on va ensuite essayer de prédire quel texte correspond à quel auteur à partir d'un modèle `Word2Vec`. -->


Ce notebook est librement inspiré de :

* https://www.kaggle.com/enerrio/scary-nlp-with-spacy-and-keras
* https://github.com/GU4243-ADS/spring2018-project1-ginnyqg
* https://www.kaggle.com/meiyizi/spooky-nlp-and-topic-modelling-tutorial/notebook

La LDA est une technique d'estimation bayésienne.
Le [poly d'Alberto Brietti](http://alberto.bietti.me/files/rapport-lda.pdf)
Le [cours d'Alberto Brietti](http://alberto.bietti.me/files/rapport-lda.pdf)
sur le sujet constitue une très bonne ressource pour comprendre
les fondements de cette technique.

Expand All @@ -71,13 +71,17 @@ les fondements de cette technique.
Cette page évoquera les principales librairies pour faire du NLP, notamment :

* [WordCloud](https://github.com/amueller/word_cloud)
* [nltk](https://www.nltk.org/)
* [spacy](https://spacy.io/)
* [NLTK](https://www.nltk.org/)
* [SpaCy](https://spacy.io/)
* [Keras](https://keras.io/)
* [TensorFlow](https://www.tensorflow.org/)


{{% box status="warning" title="Warning" icon="fa fa-exclamation-triangle" %}}
::: {.cell .markdown}
```{=html}
<div class="alert alert-warning" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-lightbulb"></i> Hint</h3>
```
Comme dans la [partie précédente](#nlpexo), il faut télécharger quelques
éléments pour que `NTLK` puisse fonctionner correctement. Pour cela, faire:

Expand All @@ -88,7 +92,11 @@ nltk.download('punkt')
nltk.download('genesis')
nltk.download('omw-1.4')
~~~
{{% /box %}}

```{=html}
</div>
```
:::


La liste des modules à importer est assez longue, la voici:
Expand Down Expand Up @@ -180,10 +188,9 @@ train_clean.head(2)

Le modèle __Latent Dirichlet Allocation (LDA)__ est un modèle probabiliste génératif qui permet
de décrire des collections de documents de texte ou d’autres types de données discrètes. LDA fait
partie d’une catégorie de modèles appelés _topic models_, qui cherchent à découvrir des structures
partie d’une catégorie de modèles appelés _"topic models"_, qui cherchent à découvrir des structures
thématiques cachées dans des vastes archives de documents.


Ceci permet d’obtenir des méthodes
efficaces pour le traitement et l’organisation des documents de ces archives: organisation automatique
des documents par sujet, recherche, compréhension et analyse du texte, ou même résumer des
Expand Down Expand Up @@ -257,13 +264,14 @@ corpus = train_clean[train_clean["Author"] == "EAP"]

Il existe plusieurs manières d'entraîner une LDA.

Nous allons utiliser `scikit` ici avec la méthode `LatentDirichletAllocation`.
Nous allons utiliser `Scikit` ici avec la méthode `LatentDirichletAllocation`.
Comme expliqué dans la partie [modélisation](#modelisation) :

1. On initialise le modèle ;
2. On le met à jour avec la méthode `fit`.

```{python}
#| output: false
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
Expand All @@ -290,7 +298,7 @@ résultats :
```{python}
# Helper function
def print_topics(model, count_vectorizer, n_top_words):
words = count_vectorizer.get_feature_names()
words = count_vectorizer.get_feature_names_out()
for topic_idx, topic in enumerate(model.components_):
print("\nTopic #%d:" % topic_idx)
print(" ".join([words[i]
Expand All @@ -305,7 +313,7 @@ La représentation sous forme de liste de mots n'est pas la plus pratique...
On peut essayer de se représenter un *wordcloud* de chaque sujet pour mieux voir si cette piste est pertinente :

```{python, results = "hide"}
tf_feature_names = count_vectorizer.get_feature_names()
tf_feature_names = count_vectorizer.get_feature_names_out()
def wordcloud_lda(lda, tf_feature_names):
Expand Down Expand Up @@ -339,7 +347,11 @@ Le module `pyLDAvis` offre quelques visualisations bien pratiques lorsqu'on
désire représenter de manière synthétique les résultats d'une LDA et observer la distribution sujet x mots.


{{% box status="hint" title="Hint" icon="fa fa-lightbulb" %}}
::: {.cell .markdown}
```{=html}
<div class="alert alert-warning" role="alert">
<h3 class="alert-heading"><i class="fa-solid fa-lightbulb"></i> Hint</h3>
```
Dans un *notebook* faire :

~~~python
Expand All @@ -349,15 +361,19 @@ pyLDAvis.enable_notebook()
~~~

Pour les utilisateurs de Windows, il est nécessaire d'ajouter l'argument
`n_jobs = 1`. Sinon, `python` tente d'entraîner le modèle avec de la
parallélisation. Le problème est que les processus sont des FORKs, ce que
Windows ne supporte pas. Sur un système unix, on peut se passer de cet
`n_jobs = 1`. Sinon, `Python` tente d'entraîner le modèle avec de la
parallélisation. Le problème est que les processus sont des `FORKs`, ce que
Windows ne supporte pas. Sur un système `Unix` (Linux, Mac OS), on peut se passer de cet
argument.

{{% /box %}}
```{=html}
</div>
```
:::

```{python}
#| output: hide
#| eval: false
#!pip install pyLDAvis #à faire en haut du notebook sur colab
import pyLDAvis
Expand All @@ -368,20 +384,15 @@ vis_data = pyLDAvis.sklearn.prepare(lda, count_data, count_vectorizer, n_jobs =
pyLDAvis.display(vis_data)
```


{{< rawhtml >}}


```{python}
#| echo: false
#| output: asis
#| eval: false
print(
pyLDAvis.prepared_data_to_html(vis_data)
)
```

{{< /rawhtml >}}


* Chaque **bulle** représente un sujet. Plus la bulle est grande, plus il y a de documents qui traitent de ce sujet.

Expand Down

0 comments on commit 934149d

Please sign in to comment.