"* 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.\n"
]
}
],
"source": [
"source": [
"print(content)"
"print(content)"
]
]
...
@@ -155,31 +163,242 @@
...
@@ -155,31 +163,242 @@
"source": [
"source": [
"### 4.2 Chargement d'un jeu de données à partir de la librairie Perdido\n",
"### 4.2 Chargement d'un jeu de données à partir de la librairie Perdido\n",
"\n",
"\n",
"Perdido embarque 2 jeux de données : \n",
"Perdido embarque deux jeux de données : \n",
" 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) ;\n",
" 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) ;\n",
" 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).\n",
" 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).\n",
"\n",
"\n",
" 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 dans 2 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",
"metadata": {},
"source": [
"* Charger le jeu de données :"
]
]
},
},
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": 7,
"metadata": {},
"metadata": {},
"outputs": [],
"outputs": [],
"source": [
"source": [
"dataset_artfl = load_edda_artfl()"
"dataset_artfl = load_edda_artfl()\n",
"data_artfl = dataset_artfl['data']"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"* Afficher les informations sur le jeu de données :"
]
]
},
},
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": null,
"execution_count": 23,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"RangeIndex: 3385 entries, 0 to 3384\n",
"Data columns (total 7 columns):\n",
" # Column Non-Null Count Dtype \n",
"--- ------ -------------- ----- \n",
" 0 filename 3385 non-null object\n",
" 1 volume 3385 non-null int64 \n",
" 2 number 3385 non-null int64 \n",
" 3 head 3384 non-null object\n",
" 4 normClass 3384 non-null object\n",
" 5 author 3384 non-null object\n",
" 6 text 3385 non-null object\n",
"dtypes: int64(2), object(5)\n",
"memory usage: 185.2+ KB\n"
]
}
],
"source": [
"data_artfl.info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On remarque que certaines colonnes ont une données manquantes (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.\n",
"0 unsigned ENCYCLOPÉDIE, ou DICTIONNAIRE RAISONNÉ DES SCI... \n",
"1 Bellin FOESNE ou FOUANE, sub. s. (Marine & Pêche.) c'... \n",
"2 Bellin Fond de la hune ; ce sont les planches qu on p... \n",
"3 Diderot * Fronteau, terme de Sellier-Bourrelier ; c'es... \n",
"4 Diderot * FRONTIERE, s. f. (Géog.) se dit des limites,... "
]
},
"execution_count": 27,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data_artfl.head()"
]
]
},
},
{
{
...
@@ -189,13 +408,288 @@
...
@@ -189,13 +408,288 @@
"### 4.3 Manipulation d'un dataframe"
"### 4.3 Manipulation d'un dataframe"
]
]
},
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"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",
"cell_type": "code",
"execution_count": null,
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Il y a 3384 articles dans le jeu de données.\n"
]
}
],
"source": [
"n = data_artfl.shape[0]\n",
"print('Il y a ' + str(n) + ' articles dans le jeu de données.')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### 4.3.1 Recherche par métadonnées\n",
"\n",
"\n",
"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.\n",
"\n",
"Par exemple, nous pouvons filtrer les données sur la base de l'auteur.\n",
"print(str(n) + ' articles sont classés en '+ req)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"On peut également regrouper les données selon un ou plusieurs attribut (colonnes) et compter le nombre de données de chaque groupe.\n",
"\n",
"* Afficher le nombre d'articles classés en Géographie par auteur :"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"author\n",
"Desmarest 1\n",
"Diderot 1\n",
"Jaucourt 476\n",
"La Condamine 1\n",
"Mallet 1\n",
"Robert de Vaugondy 2\n",
"Robert de Vaugondy & d'Alembert 1\n",
"unsigned 13\n",
"Name: filename, dtype: int64"
]
},
"execution_count": 33,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"d_geo.groupby(['author'])[\"filename\"].count()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"metadata": {},
"outputs": [],
"source": []
"source": []
},
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"\"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.)\""
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
!pipinstallperdido
!pipinstallperdido
```
```
%% 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
!pipinstallstanza
!pipinstallstanza
```
```
%% 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.
### 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
withopen(filepath)asf:
withopen(filepath)asf:
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
* 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 2 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 dans 2 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:
* 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']
```
%% Cell type:markdown id: tags:
* Afficher les informations sur le jeu de données :
%% Cell type:code id: tags:
``` python
data_artfl.info()
```
```
%% Output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 3385 entries, 0 to 3384
Data columns (total 7 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 filename 3385 non-null object
1 volume 3385 non-null int64
2 number 3385 non-null int64
3 head 3384 non-null object
4 normClass 3384 non-null object
5 author 3384 non-null object
6 text 3385 non-null object
dtypes: int64(2), object(5)
memory usage: 185.2+ KB
%% Cell type:markdown id: tags:
On remarque que certaines colonnes ont une données manquantes (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.
0 unsigned ENCYCLOPÉDIE, ou DICTIONNAIRE RAISONNÉ DES SCI...
1 Bellin FOESNE ou FOUANE, sub. s. (Marine & Pêche.) c'...
2 Bellin Fond de la hune ; ce sont les planches qu on p...
3 Diderot * Fronteau, terme de Sellier-Bourrelier ; c'es...
4 Diderot * FRONTIERE, s. f. (Géog.) se dit des limites,...
%% Cell type:markdown id: tags:
### 4.3 Manipulation d'un dataframe
### 4.3 Manipulation d'un dataframe
%% 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 :
%% Cell type:code id: tags:
``` python
n=data_artfl.shape[0]
print('Il y a '+str(n)+' articles dans le jeu de données.')
```
%% Output
Il y a 3384 articles dans le jeu de données.
%% Cell type:markdown id: tags:
#### 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.
Par exemple, nous pouvons filtrer les données sur la base de l'auteur.
"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:
## 5. Reconnaissance d'Entités Nommées (NER)
## 5. Reconnaissance d'Entités Nommées (NER)
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
```
```
%%Celltype:markdownid:tags:
%%Celltype:markdownid:tags:
### 5.1 Stanza NER
### 5.1 Stanza NER
%%Celltype:codeid:tags:
%%Celltype:codeid:tags:
``` python
``` python
```
```
%% 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')
```
```
%% 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 :
### 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.