Skip to content
Snippets Groups Projects
Commit ccaf7d25 authored by Ludovic Moncla's avatar Ludovic Moncla
Browse files

Update Tutoriel-geoparsing.ipynb

parent 02c1cefd
No related branches found
No related tags found
No related merge requests found
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
![CNRS](https://anf-tdm-2022.sciencesconf.org/data/header/LOGO_CNRS_CMJN_150x150.png) ![CNRS](https://anf-tdm-2022.sciencesconf.org/data/header/LOGO_CNRS_CMJN_150x150.png)
# Tutoriel - ANF TDM 2022 Python Geoparsing # Tutoriel - ANF TDM 2022 Python Geoparsing
Supports pour l'atelier [Librairies Python et Services Web pour la reconnaissance d’entités nommées et la résolution de toponymes](https://anf-tdm-2022.sciencesconf.org/resource/page/id/11) de la formation CNRS [ANF TDM 2022](https://anf-tdm-2022.sciencesconf.org). Supports pour l'atelier [Librairies Python et Services Web pour la reconnaissance d’entités nommées et la résolution de toponymes](https://anf-tdm-2022.sciencesconf.org/resource/page/id/11) de la formation CNRS [ANF TDM 2022](https://anf-tdm-2022.sciencesconf.org).
## 1. En bref ## 1. En bref
Dans ce tutoriel, nous allons apprendre plusieurs choses : Dans ce tutoriel, nous allons apprendre plusieurs choses :
- Charger des jeux de données : - Charger des jeux de données :
- à partir de fichiers txt importés depuis le disque dur ; - à partir de fichiers txt importés depuis le disque dur ;
- à partir de la librairie Python [Perdido](https://github.com/ludovicmoncla/perdido) dans un [Pandas dataframe](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) (articles encyclopédiques et descriptions de randonnées). - à partir de la librairie Python [Perdido](https://github.com/ludovicmoncla/perdido) dans un [Pandas dataframe](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html) (articles encyclopédiques et descriptions de randonnées).
- Manipuler et interroger un dataframe - Manipuler et interroger un dataframe
- Utiliser les librairies [Stanza](https://stanfordnlp.github.io/stanza/index.html), [spaCy](https://spacy.io) et [Perdido](https://github.com/ludovicmoncla/perdido) pour la reconnaissance d'entités nommées - Utiliser les librairies [Stanza](https://stanfordnlp.github.io/stanza/index.html), [spaCy](https://spacy.io) et [Perdido](https://github.com/ludovicmoncla/perdido) pour la reconnaissance d'entités nommées
- afficher les entités nommées annotées ; - afficher les entités nommées annotées ;
- comparer les résultats de `Stanza`, `spaCy` et `Perdido` ; - comparer les résultats de `Stanza`, `spaCy` et `Perdido` ;
- discuter les limites des 3 outils pour la tâche de NER. - discuter les limites des 3 outils pour la tâche de NER.
- Utiliser la librarie `Perdido` pour le geoparsing : - Utiliser la librarie `Perdido` pour le geoparsing :
- cartographier les lieux geocodés ; - cartographier les lieux geocodés ;
- illustrer la problématique de désambiguïsation des toponymes. - illustrer la problématique de désambiguïsation des toponymes.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 2. Introduction ## 2. Introduction
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 3. Configurer l'environnement ## 3. Configurer l'environnement
### 3.1 Installer les librairies Python ### 3.1 Installer les librairies Python
* Si vous avez configuré votre environnement Conda en utilisant le fichier `requirements.txt`, vous pouvez sauter cette étape et aller à la section `3.2 Importer les librairies`. * Si vous avez configuré votre environnement Conda en utilisant le fichier `requirements.txt`, vous pouvez sauter cette étape et aller à la section `3.2 Importer les librairies`.
* Si vous avez configuré votre environnement Conda en utilisant le fichier `environment.yml` ou si vous utilisez un environnement Google Colab / Binder, vous devez installer `perdido` en utilisant `pip` : * Si vous avez configuré votre environnement Conda en utilisant le fichier `environment.yml` ou si vous utilisez un environnement Google Colab / Binder, vous devez installer `perdido` en utilisant `pip` :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
!pip install perdido !pip install perdido
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Si vous avez déjà configuré votre environnement conda, soit avec conda, soit avec pip (voir le fichier readme), vous pouvez ignorer la cellule suivante. * Si vous avez déjà configuré votre environnement conda, soit avec conda, soit avec pip (voir le fichier readme), vous pouvez ignorer la cellule suivante.
* Si vous exécutez ce notebook depuis Google Colab / Binder, vous devez exécuter la cellule suivante : * Si vous exécutez ce notebook depuis Google Colab / Binder, vous devez exécuter la cellule suivante :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
!pip install stanza !pip install stanza
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### 3.2 Importer les librairies ### 3.2 Importer les librairies
Tout d'abord, nous allons charger certaines bibliothèques spécifiques de `Perdido` que nous utiliserons dans ce notebook. Ensuite, nous importons quelques outils qui nous aideront à analyser et à visualiser le texte. Tout d'abord, nous allons charger certaines bibliothèques spécifiques de `Perdido` que nous utiliserons dans ce notebook. Ensuite, nous importons quelques outils qui nous aideront à analyser et à visualiser le texte.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
import warnings import warnings
warnings.filterwarnings('ignore') warnings.filterwarnings('ignore')
from perdido.geoparser import Geoparser from perdido.geoparser import Geoparser
from perdido.geocoder import Geocoder from perdido.geocoder import Geocoder
from perdido.datasets import load_edda_artfl, load_edda_perdido, load_choucas_perdido from perdido.datasets import load_edda_artfl, load_edda_perdido, load_choucas_perdido
from spacy import displacy from spacy import displacy
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 4. Chargement et exploration des données ## 4. Chargement et exploration des données
### 4.1 Chargement d'un document texte à partir d'un fichier ### 4.1 Chargement d'un document texte à partir d'un fichier
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
filepath = 'data/volume01-4083.txt' filepath = 'data/volume01-4083.txt'
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
with open(filepath) as f: with open(filepath) as f:
content = f.read() content = f.read()
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Afficher le contenu du fichier * Afficher le contenu du fichier
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
print(content) print(content)
``` ```
%% Output %% Output
* ARQUES, (Géog.) petite ville de France, en Normandie, au pays de Caux, sur la petite riviere d'Arques. Long. 18. 50. lat. 49. 54. * ARQUES, (Géog.) petite ville de France, en Normandie, au pays de Caux, sur la petite riviere d'Arques. Long. 18. 50. lat. 49. 54.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### 4.2 Chargement d'un jeu de données à partir de la librairie Perdido ### 4.2 Chargement d'un jeu de données à partir de la librairie Perdido
Perdido embarque deux jeux de données : Perdido embarque deux jeux de données :
1. articles encyclopédiques (volume 7 de l'Encyclopédie de Diderot et d'Alembert (1751-1772)), fournit par l'[ARTFL](https://encyclopedie.uchicago.edu) dans le cadre du projet [GEODE](https://geode-project.github.io) ; 1. articles encyclopédiques (volume 7 de l'Encyclopédie de Diderot et d'Alembert (1751-1772)), fournit par l'[ARTFL](https://encyclopedie.uchicago.edu) dans le cadre du projet [GEODE](https://geode-project.github.io) ;
2. descriptions de randonnées (chaque description est associée à sa trace GPS. Elles proviennent du site [www.visorando.fr](https://www.visorando.com) et ont été collectées dans le cadre du projet [ANR CHOUCAS](http://choucas.ign.fr). 2. descriptions de randonnées (chaque description est associée à sa trace GPS. Elles proviennent du site [www.visorando.fr](https://www.visorando.com) et ont été collectées dans le cadre du projet [ANR CHOUCAS](http://choucas.ign.fr).
Dans un premier temps nous allons nous intéresser au jeu de données des articles encyclopédiques. Ce jeu de données est présent dans la librairie en deux versions, une version "brute" (articles fournis par l'ARTFL) au format dataframe et une version déjà annotée par Perdido (format PerdidoCollection). Nous allons charger la version brute et voir comment manipuler un dataframe. Dans un premier temps nous allons nous intéresser au jeu de données des articles encyclopédiques. Ce jeu de données est présent dans la librairie en deux versions, une version "brute" (articles fournis par l'ARTFL) au format dataframe et une version déjà annotée par Perdido (format PerdidoCollection). Nous allons charger la version brute et voir comment manipuler un dataframe.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Charger le jeu de données : * Charger le jeu de données :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
dataset_artfl = load_edda_artfl() dataset_artfl = load_edda_artfl()
data_artfl = dataset_artfl['data'] data_artfl = dataset_artfl['data']
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Afficher les informations sur le jeu de données : * Afficher les informations sur le jeu de données :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
data_artfl.info() data_artfl.info()
``` ```
%% Output %% Output
<class 'pandas.core.frame.DataFrame'> <class 'pandas.core.frame.DataFrame'>
RangeIndex: 3385 entries, 0 to 3384 RangeIndex: 3385 entries, 0 to 3384
Data columns (total 7 columns): Data columns (total 7 columns):
# Column Non-Null Count Dtype # Column Non-Null Count Dtype
--- ------ -------------- ----- --- ------ -------------- -----
0 filename 3385 non-null object 0 filename 3385 non-null object
1 volume 3385 non-null int64 1 volume 3385 non-null int64
2 number 3385 non-null int64 2 number 3385 non-null int64
3 head 3384 non-null object 3 head 3384 non-null object
4 normClass 3384 non-null object 4 normClass 3384 non-null object
5 author 3384 non-null object 5 author 3384 non-null object
6 text 3385 non-null object 6 text 3385 non-null object
dtypes: int64(2), object(5) dtypes: int64(2), object(5)
memory usage: 185.2+ KB memory usage: 185.2+ KB
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
On remarque que certaines colonnes ont une donnée manquante (3384 lignes non nulles contre 3385 lignes au total). Pour la suite des opérations que nous allons réaliser il est nécessaire de supprimer les lignes incomplètes. On remarque que certaines colonnes ont une donnée manquante (3384 lignes non nulles contre 3385 lignes au total). Pour la suite des opérations que nous allons réaliser il est nécessaire de supprimer les lignes incomplètes.
* Supprimer la ligne incomplète : * Supprimer la ligne incomplète :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
data_artfl.dropna(inplace=True) # data_artfl = data_artfl.dropna() data_artfl.dropna(inplace=True) # data_artfl = data_artfl.dropna()
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Vérifier le résultat : * Vérifier le résultat :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
data_artfl.info() data_artfl.info()
``` ```
%% Output %% Output
<class 'pandas.core.frame.DataFrame'> <class 'pandas.core.frame.DataFrame'>
Int64Index: 3384 entries, 0 to 3384 Int64Index: 3384 entries, 0 to 3384
Data columns (total 7 columns): Data columns (total 7 columns):
# Column Non-Null Count Dtype # Column Non-Null Count Dtype
--- ------ -------------- ----- --- ------ -------------- -----
0 filename 3384 non-null object 0 filename 3384 non-null object
1 volume 3384 non-null int64 1 volume 3384 non-null int64
2 number 3384 non-null int64 2 number 3384 non-null int64
3 head 3384 non-null object 3 head 3384 non-null object
4 normClass 3384 non-null object 4 normClass 3384 non-null object
5 author 3384 non-null object 5 author 3384 non-null object
6 text 3384 non-null object 6 text 3384 non-null object
dtypes: int64(2), object(5) dtypes: int64(2), object(5)
memory usage: 211.5+ KB memory usage: 211.5+ KB
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Afficher la liste des premiers articles : * Afficher la liste des premiers articles :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
data_artfl.head() data_artfl.head()
``` ```
%% Output %% Output
filename volume number head normClass \ filename volume number head normClass \
0 volume07-1.tei 7 1 Title Page unclassified 0 volume07-1.tei 7 1 Title Page unclassified
1 volume07-10.tei 7 10 FOESNE ou FOUANE Marine | Pêche 1 volume07-10.tei 7 10 FOESNE ou FOUANE Marine | Pêche
2 volume07-100.tei 7 100 Fond de la hune unclassified 2 volume07-100.tei 7 100 Fond de la hune unclassified
3 volume07-1000.tei 7 1000 Fronteau Bourrelier | Sellier 3 volume07-1000.tei 7 1000 Fronteau Bourrelier | Sellier
4 volume07-1001.tei 7 1001 FRONTIERE Géographie 4 volume07-1001.tei 7 1001 FRONTIERE Géographie
author text author text
0 unsigned ENCYCLOPÉDIE, ou DICTIONNAIRE RAISONNÉ DES SCI... 0 unsigned ENCYCLOPÉDIE, ou DICTIONNAIRE RAISONNÉ DES SCI...
1 Bellin FOESNE ou FOUANE, sub. s. (Marine & Pêche.) c'... 1 Bellin FOESNE ou FOUANE, sub. s. (Marine & Pêche.) c'...
2 Bellin Fond de la hune ; ce sont les planches qu on p... 2 Bellin Fond de la hune ; ce sont les planches qu on p...
3 Diderot * Fronteau, terme de Sellier-Bourrelier ; c'es... 3 Diderot * Fronteau, terme de Sellier-Bourrelier ; c'es...
4 Diderot * FRONTIERE, s. f. (Géog.) se dit des limites,... 4 Diderot * FRONTIERE, s. f. (Géog.) se dit des limites,...
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### 4.3 Manipulation d'un dataframe ### 4.3 Manipulation d'un dataframe
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Nous avons maintenant accès à tous les attributs et méthodes de l'objet [dataframe](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html). Par exemple, nous pouvons facilement connaître le nombre de lignes dans notre dataframe qui correspond au nombre d'articles dans notre corpus : Nous avons maintenant accès à tous les attributs et méthodes de l'objet [dataframe](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html). Par exemple, nous pouvons facilement connaître le nombre de lignes dans notre dataframe qui correspond au nombre d'articles dans notre corpus :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
n = data_artfl.shape[0] n = data_artfl.shape[0]
print('Il y a ' + str(n) + ' articles dans le jeu de données.') print('Il y a ' + str(n) + ' articles dans le jeu de données.')
``` ```
%% Output %% Output
Il y a 3384 articles dans le jeu de données. Il y a 3384 articles dans le jeu de données.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### 4.3.1 Recherche par métadonnées #### 4.3.1 Recherche par métadonnées
Maintenant que les données sont chargées dans un dataframe, nous pouvons sélectionner des groupes d'articles sur la base de leurs métadonnées. Maintenant que les données sont chargées dans un dataframe, nous pouvons sélectionner des groupes d'articles sur la base de leurs métadonnées.
Pour cela on utilise la méthode [loc()](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html). Pour cela on utilise la méthode [loc()](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html).
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Selectionner la ligne du dataframe qui correspond à l'article 'FRONTIGNAN' : * Selectionner la ligne du dataframe qui correspond à l'article 'FRONTIGNAN' :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
frontignan = data_artfl.loc[data_artfl['head'] == 'FRONTIGNAN'] frontignan = data_artfl.loc[data_artfl['head'] == 'FRONTIGNAN']
frontignan frontignan
``` ```
%% Output %% Output
filename volume number head normClass author \ filename volume number head normClass author \
5 volume07-1002.tei 7 1002 FRONTIGNAN Géographie Jaucourt 5 volume07-1002.tei 7 1002 FRONTIGNAN Géographie Jaucourt
text text
5 FRONTIGNAN, (Géog.) petite ville de France. au... 5 FRONTIGNAN, (Géog.) petite ville de France. au...
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Récupérer les valeurs des attributs (colonnes) : * Récupérer les valeurs des attributs (colonnes) :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
print('filename :', frontignan.filename.item()) # similaire à frontignan['normClass'].item() print('filename :', frontignan.filename.item()) # similaire à frontignan['normClass'].item()
print('text :', frontignan.text.item()) print('text :', frontignan.text.item())
``` ```
%% Output %% Output
filename : volume07-1002.tei filename : volume07-1002.tei
text : FRONTIGNAN, (Géog.) petite ville de France. au Bas-Languedoc, connue par ses excellens vins muscats, & ses raisins de caisse qu'on appelle passerilles. Quelques savans croyent, sans en donner de preuves, que cette ville est le forum Domitii des Romains. Elle est située sur l'étang de Maguelone, à six lieues N. E. d'Agde, & cinq S. O. de Montpellier. Long. 15d. 24'. lat. 43d. 28'. (D. J.) text : FRONTIGNAN, (Géog.) petite ville de France. au Bas-Languedoc, connue par ses excellens vins muscats, & ses raisins de caisse qu'on appelle passerilles. Quelques savans croyent, sans en donner de preuves, que cette ville est le forum Domitii des Romains. Elle est située sur l'étang de Maguelone, à six lieues N. E. d'Agde, & cinq S. O. de Montpellier. Long. 15d. 24'. lat. 43d. 28'. (D. J.)
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Nous pouvons également filtrer les données sur la base de l'auteur. Nous pouvons également filtrer les données sur la base de l'auteur.
* Extraire les articles rédigés par Jaucourt : * Extraire les articles rédigés par Jaucourt :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
req = 'Jaucourt' req = 'Jaucourt'
d_Jaucourt = data_artfl.loc[data_artfl['author'] == req] d_Jaucourt = data_artfl.loc[data_artfl['author'] == req]
n = d_Jaucourt.shape[0] n = d_Jaucourt.shape[0]
print(str(n) + ' articles ont été rédigés par '+ req) print(str(n) + ' articles ont été rédigés par '+ req)
``` ```
%% Output %% Output
698 articles ont été rédigés par Jaucourt 698 articles ont été rédigés par Jaucourt
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
d_Jaucourt.head() d_Jaucourt.head()
``` ```
%% Output %% Output
filename volume number head \ filename volume number head \
5 volume07-1002.tei 7 1002 FRONTIGNAN 5 volume07-1002.tei 7 1002 FRONTIGNAN
29 volume07-1024.tei 7 1024 FROWARD, le cap. 29 volume07-1024.tei 7 1024 FROWARD, le cap.
32 volume07-1027.tei 7 1027 FRUGALITÉ 32 volume07-1027.tei 7 1027 FRUGALITÉ
37 volume07-1031.tei 7 1031 Fruit verreux 37 volume07-1031.tei 7 1031 Fruit verreux
38 volume07-1032.tei 7 1032 Fruit, (art de conserver le) 38 volume07-1032.tei 7 1032 Fruit, (art de conserver le)
normClass author \ normClass author \
5 Géographie Jaucourt 5 Géographie Jaucourt
29 Géographie Jaucourt 29 Géographie Jaucourt
32 Morale Jaucourt 32 Morale Jaucourt
37 Histoire naturelle Jaucourt 37 Histoire naturelle Jaucourt
38 Economie rustique Jaucourt 38 Economie rustique Jaucourt
text text
5 FRONTIGNAN, (Géog.) petite ville de France. au... 5 FRONTIGNAN, (Géog.) petite ville de France. au...
29 FROWARD, le cap. (Géog.) & par les François le... 29 FROWARD, le cap. (Géog.) & par les François le...
32 FRUGALITÉ, (Morale.) simplicité de moeurs & de... 32 FRUGALITÉ, (Morale.) simplicité de moeurs & de...
37 Fruit verreux, (Hist. nat.) c'est le nom qu'on... 37 Fruit verreux, (Hist. nat.) c'est le nom qu'on...
38 Fruit, (art de conserver le) Economie rustiq. ... 38 Fruit, (art de conserver le) Economie rustiq. ...
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Autre exemple, nous pouvons filtrer les articles en fonction de leur classification dans l'*Encyclopédie*. Autre exemple, nous pouvons filtrer les articles en fonction de leur classification dans l'*Encyclopédie*.
Pour cela nous utiliserons le champ `normclass`, qui indique la classifications retenue (et normalisée) par l'ARTFL. Pour cela nous utiliserons le champ `normclass`, qui indique la classifications retenue (et normalisée) par l'ARTFL.
Par exemple pour la classe 'Géographie', nous pouvons faire la requête suivante (le résultat est stocké dans un nouveau cadre de données `df_geo` : Par exemple pour la classe 'Géographie', nous pouvons faire la requête suivante (le résultat est stocké dans un nouveau cadre de données `df_geo` :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
req = 'Géographie' req = 'Géographie'
d_geo = data_artfl[data_artfl['normClass'].str.contains(req, case=False)] d_geo = data_artfl[data_artfl['normClass'].str.contains(req, case=False)]
n = d_geo.shape[0] n = d_geo.shape[0]
print(str(n) + ' articles sont classés en '+ req) print(str(n) + ' articles sont classés en '+ req)
``` ```
%% Output %% Output
496 articles sont classés en Géographie 496 articles sont classés en Géographie
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
On peut également regrouper les données selon un ou plusieurs attributs (colonnes) et compter le nombre de données de chaque groupe avec les méthodes [groupby()](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html) et [count()](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.count.html). On peut également regrouper les données selon un ou plusieurs attributs (colonnes) et compter le nombre de données de chaque groupe avec les méthodes [groupby()](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html) et [count()](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.count.html).
* Afficher le nombre d'articles classés en Géographie par auteur : * Afficher le nombre d'articles classés en Géographie par auteur :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
d_geo.groupby(['author'])["filename"].count() d_geo.groupby(['author'])["filename"].count()
``` ```
%% Output %% Output
author author
Desmarest 1 Desmarest 1
Diderot 1 Diderot 1
Jaucourt 476 Jaucourt 476
La Condamine 1 La Condamine 1
Mallet 1 Mallet 1
Robert de Vaugondy 2 Robert de Vaugondy 2
Robert de Vaugondy & d'Alembert 1 Robert de Vaugondy & d'Alembert 1
unsigned 13 unsigned 13
Name: filename, dtype: int64 Name: filename, dtype: int64
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Dans cette partie nous avons vu brievement comment manipuler un dataframe pour selectionner certaines données en filtrant selon certaines métadonnées ou par une recheche par mot clés. Ces opérations sont utiles mais un peu limitées, nous allons voir dans la suite de ce notebook comment enrichir les métadonnées et en particulier comment annoter les entités nommées présents dans les textes. Dans cette partie nous avons vu brievement comment manipuler un dataframe pour selectionner certaines données en filtrant selon certaines métadonnées ou par une recheche par mot clés. Ces opérations sont utiles mais un peu limitées, nous allons voir dans la suite de ce notebook comment enrichir les métadonnées et en particulier comment annoter les entités nommées présents dans les textes.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 5. Reconnaissance d'Entités Nommées (NER) ## 5. Reconnaissance d'Entités Nommées (NER)
La reconnaissance d'entités nommées, *Named Entity Recognition* (NER) en anglais, est une tâche très importante et incontournable en traitement automatique des langues (TAL) et en compréhension du langage naturel (NLU en anglais).
Cette tâche consiste à rechercher des objets textuels (un mot, ou un groupe de mots, souvent associés aux noms propres) catégorisables dans des classes telles que noms de personnes, noms d'organisations ou d'entreprises, noms de lieux, quantités, distances, valeurs, dates, etc.
%% Cell type:code id: tags: Dans cet atelier nous allons expérimenter et comparer trois outils de NER.
``` python 1. [Stanza](https://stanfordnlp.github.io/stanza/index.html)
``` 2. [spaCy](https://spacy.io)
3. [Perdido](https://github.com/ludovicmoncla/perdido)
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### 5.1 Stanza NER ### 5.1 Stanza NER
%% Cell type:code id: tags: `Stanza` est une librairie Python de traitement du langage naturel. Elle contient des outils, qui peuvent être utilisés dans une chaîne de traitement, pour convertir du texte en listes de phrases et de mots, pour générer les formes de base de ces mots, leurs parties du discours et leurs caractéristiques morphologiques, pour produire une analyse syntaxique de dépendance, et pour reconnaître les entités nommées.
``` python `Stanza` se base sur des modèles entrainés par des réseaux de neurones à partir de la bibliothèque [PyTorch](https://pytorch.org) et permet de traiter plus de 70 langues.
```
Dans cette partie nous allons voir comment utiliser `Stanza` pour la reconnaissance d'entités nommées à partir de textes en français.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Importer la librairie `Stanza` et télécharger le modèle pré-entrainé pour le français : * Importer la librairie `Stanza` et télécharger le modèle pré-entrainé pour le français :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
import stanza import stanza
stanza.download('fr') stanza.download('fr')
``` ```
%% Output
2022-09-16 09:16:43 INFO: Downloading default packages for language: fr (French)...
2022-09-16 09:16:44 INFO: File exists: /Users/lmoncla/stanza_resources/fr/default.zip
2022-09-16 09:16:47 INFO: Finished downloading models and saved to /Users/lmoncla/stanza_resources.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Instancier et paramétrer la chaîne de traitement : * Instancier et paramétrer la chaîne de traitement :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
stanza_parser = stanza.Pipeline(lang='fr', processors='tokenize,ner') stanza_parser = stanza.Pipeline(lang='fr', processors='tokenize,ner')
``` ```
%% Output
2022-09-16 09:16:56 WARNING: Language fr package default expects mwt, which has been added
2022-09-16 09:16:57 INFO: Loading these models for language: fr (French):
=======================
| Processor | Package |
-----------------------
| tokenize | gsd |
| mwt | gsd |
| ner | wikiner |
=======================
2022-09-16 09:16:57 INFO: Use device: cpu
2022-09-16 09:16:57 INFO: Loading: tokenize
2022-09-16 09:16:57 INFO: Loading: mwt
2022-09-16 09:16:57 INFO: Loading: ner
2022-09-16 09:16:58 INFO: Done loading processors!
%% Cell type:markdown id: tags:
* On utilise la variable `content` qui contient le texte chargé précédemment à partir du fichier
%% Cell type:code id: tags:
``` python
print(content)
```
%% Output
* ARQUES, (Géog.) petite ville de France, en Normandie, au pays de Caux, sur la petite riviere d'Arques. Long. 18. 50. lat. 49. 54.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Executer la reconnaissance d'entités nommées : * Executer la reconnaissance d'entités nommées :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
doc = stanza_parser(content) doc = stanza_parser(content)
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Afficher la liste des entités nommées repérées : * Afficher la liste des entités nommées repérées :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
for ent in doc.ents: for ent in doc.ents:
print(ent.text, ent.type) print(ent.text, ent.type)
``` ```
%% Output
ARQUES LOC
(Géog LOC
France LOC
Normandie LOC
pays de Caux LOC
Arques LOC
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### 5.2 SpaCy NER ### 5.2 SpaCy NER
`spaCy` est également une librairie Python de traitement du langage naturel.
Elle se compose de modèles pré-entrainés et supporte actuellement la tokenisation et l'entrainement pour plus de 60 langues. Elle est doté de modèles de réseaux neuronaux pour le balisage, l'analyse syntaxique, la reconnaissance d'entités nommées, la classification de textes, l'apprentissage multi-tâches avec des transformateurs pré-entraînés comme BERT, ainsi qu'un système d'entraînement prêt pour la production et un déploiement simple des modèles. `spaCy` est un logiciel commercial, publié en open-source sous la licence MIT.
Dans cette partie nous allons voir comment utiliser `spaCy` pour la reconnaissance d'entités nommées toujours à partir de notre exemple en français.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Installer le modèle français pré-entrainé de `spaCy` : * Installer le modèle français pré-entrainé de `spaCy` :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
!python -m spacy download fr_core_news_sm !python -m spacy download fr_core_news_sm
``` ```
%% Output
Collecting fr-core-news-sm==3.4.0
Downloading https://github.com/explosion/spacy-models/releases/download/fr_core_news_sm-3.4.0/fr_core_news_sm-3.4.0-py3-none-any.whl (16.3 MB)
 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 16.3/16.3 MB 10.7 MB/s eta 0:00:0000:0100:01
[?25hRequirement already satisfied: spacy<3.5.0,>=3.4.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from fr-core-news-sm==3.4.0) (3.4.1)
Requirement already satisfied: pydantic!=1.8,!=1.8.1,<1.10.0,>=1.7.4 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (1.9.2)
Requirement already satisfied: spacy-legacy<3.1.0,>=3.0.9 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (3.0.10)
Requirement already satisfied: langcodes<4.0.0,>=3.2.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (3.3.0)
Requirement already satisfied: spacy-loggers<2.0.0,>=1.0.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (1.0.3)
Requirement already satisfied: preshed<3.1.0,>=3.0.2 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (3.0.7)
Requirement already satisfied: tqdm<5.0.0,>=4.38.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (4.64.1)
Requirement already satisfied: srsly<3.0.0,>=2.4.3 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (2.4.4)
Requirement already satisfied: setuptools in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (65.3.0)
Requirement already satisfied: typer<0.5.0,>=0.3.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (0.4.2)
Requirement already satisfied: packaging>=20.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (21.3)
Requirement already satisfied: requests<3.0.0,>=2.13.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (2.28.1)
Requirement already satisfied: cymem<2.1.0,>=2.0.2 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (2.0.6)
Requirement already satisfied: pathy>=0.3.5 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (0.6.2)
Requirement already satisfied: numpy>=1.15.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (1.23.3)
Requirement already satisfied: wasabi<1.1.0,>=0.9.1 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (0.10.1)
Requirement already satisfied: thinc<8.2.0,>=8.1.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (8.1.1)
Requirement already satisfied: murmurhash<1.1.0,>=0.28.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (1.0.8)
Requirement already satisfied: jinja2 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (3.1.2)
Requirement already satisfied: catalogue<2.1.0,>=2.0.6 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (2.0.8)
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from packaging>=20.0->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (3.0.9)
Requirement already satisfied: smart-open<6.0.0,>=5.2.1 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from pathy>=0.3.5->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (5.2.1)
Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from pydantic!=1.8,!=1.8.1,<1.10.0,>=1.7.4->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (4.3.0)
Requirement already satisfied: idna<4,>=2.5 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (3.3)
Requirement already satisfied: charset-normalizer<3,>=2 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (2.1.1)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (1.26.11)
Requirement already satisfied: certifi>=2017.4.17 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from requests<3.0.0,>=2.13.0->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (2022.6.15.1)
Requirement already satisfied: confection<1.0.0,>=0.0.1 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from thinc<8.2.0,>=8.1.0->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (0.0.1)
Requirement already satisfied: blis<0.10.0,>=0.7.8 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from thinc<8.2.0,>=8.1.0->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (0.9.1)
Requirement already satisfied: click<9.0.0,>=7.1.1 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from typer<0.5.0,>=0.3.0->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (8.1.3)
Requirement already satisfied: MarkupSafe>=2.0 in /opt/homebrew/Caskroom/miniforge/base/envs/tdm-geoparsing-py39/lib/python3.9/site-packages (from jinja2->spacy<3.5.0,>=3.4.0->fr-core-news-sm==3.4.0) (2.1.1)
Installing collected packages: fr-core-news-sm
Successfully installed fr-core-news-sm-3.4.0
✔ Download and installation successful
You can now load the package via spacy.load('fr_core_news_sm')
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Importer la librarie `spaCy` : * Importer la librarie `spaCy` :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
import spacy import spacy
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Charger le modèle français pré-entrainé de `spaCy` * Charger le modèle français pré-entrainé de `spaCy`
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
spacy_parser = spacy.load('fr_core_news_sm') spacy_parser = spacy.load('fr_core_news_sm')
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Executer la reconnaissance d'entités nommées : * Executer la reconnaissance d'entités nommées :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
doc = spacy_parser(content) doc = spacy_parser(content)
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Afficher la liste des entités nommées repérées : * Afficher la liste des entités nommées repérées :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
for ent in doc.ents: for ent in doc.ents:
print(ent.text, ent.label_) print(ent.text, ent.label_)
``` ```
%% Output
Géog MISC
de France LOC
Normandie LOC
pays de Caux LOC
Arques LOC
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Afficher de manière graphique les entités nommées avec `displaCy` : * Afficher de manière graphique les entités nommées avec `displaCy` :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
displacy.render(doc, style="ent", jupyter=True) displacy.render(doc, style="ent", jupyter=True)
``` ```
%% Output
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### 5.3 Perdido Geoparser ### 5.3 Perdido Geoparser
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Instancier et paramétrer la chaîne de traitement : * Instancier et paramétrer la chaîne de traitement :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
geoparser = Geoparser(version="Encyclopedie") geoparser = Geoparser(version="Encyclopedie")
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Executer la reconnaissance d'entités nommées : * Executer la reconnaissance d'entités nommées :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
doc = geoparser(content) doc = geoparser(content)
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Afficher la liste des entités nommées repérées : * Afficher la liste des entités nommées repérées :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
for ent in doc.named_entities: for ent in doc.named_entities:
print(ent.text, ent.tag) print(ent.text, ent.tag)
``` ```
%% Output
ARQUES place
France place
Normandie place
Caux place
Arques place
Long . 18 . 50 . lat . 49 . 54 . latlong
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Afficher de manière graphique les entités nommées avec `displaCy` : * Afficher de manière graphique les entités nommées avec `displaCy` :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
displacy.render(doc.to_spacy_doc(), style="ent", jupyter=True) displacy.render(doc.to_spacy_doc(), style="ent", jupyter=True)
``` ```
%% Output
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
* Afficher de manière graphique les entités nommées étendues avec `displaCy` : * Afficher de manière graphique les entités nommées étendues avec `displaCy` :
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
displacy.render(doc.to_spacy_doc(), style="span", jupyter=True) displacy.render(doc.to_spacy_doc(), style="span", jupyter=True)
``` ```
%% Output
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### 5.4 Expérimentations et comparaison ### 5.4 Expérimentations et comparaison
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
## 6. Geoparsing / Geocoding ## 6. Geoparsing / Geocoding
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# geocoding avec perdido # geocoding avec perdido
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
# afficher une carte # afficher une carte
d['data'][1].get_folium_map() d['data'][1].get_folium_map()
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
### 6.2 Résolution de toponymes / désambiguïsation ### 6.2 Résolution de toponymes / désambiguïsation
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Exemple de requetes sans stratégies de désambiguisation Exemple de requetes sans stratégies de désambiguisation
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Délimiter un zone restreinte lors de la requête Délimiter un zone restreinte lors de la requête
Premier niveau : utilisation d'un code pays. Premier niveau : utilisation d'un code pays.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Deuxième niveau : utilisation d'une bounding box délimitant la zone de recherche Deuxième niveau : utilisation d'une bounding box délimitant la zone de recherche
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Désambiguisation basé sur la proximité géographique Désambiguisation basé sur la proximité géographique
Clustering avec la méthode DBSCAN. Cette stratégie est adaptée pour une description d'itinéraire où les différents lieux cités doivent être localisés à proximité les uns des autres. Clustering avec la méthode DBSCAN. Cette stratégie est adaptée pour une description d'itinéraire où les différents lieux cités doivent être localisés à proximité les uns des autres.
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
#### Résultats avant désambiguisation #### Résultats avant désambiguisation
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
d['data'][1].get_folium_map() d['data'][1].get_folium_map()
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
d['data'][1].cluster_disambiguation() d['data'][1].cluster_disambiguation()
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
d['data'][1].get_folium_map() d['data'][1].get_folium_map()
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
Utilisation du contexte (autres entités nommées repérées dans le texte, relations spatiales, etc...). Développées dans le cadre du projet [Perdido]() (add ref 2014 et 2016) mais pas encore intégré à la librairie Python Perdido. Cette librairie est toujours en cours de développement et d'amélioration. Vos remarques et retours seront les bienvenues. Utilisation du contexte (autres entités nommées repérées dans le texte, relations spatiales, etc...). Développées dans le cadre du projet [Perdido]() (add ref 2014 et 2016) mais pas encore intégré à la librairie Python Perdido. Cette librairie est toujours en cours de développement et d'amélioration. Vos remarques et retours seront les bienvenues.
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:markdown id: tags: %% Cell type:markdown id: tags:
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
%% Cell type:code id: tags: %% Cell type:code id: tags:
``` python ``` python
``` ```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment