Skip to content
Snippets Groups Projects
Tutoriel-geoparsing.ipynb 18.10 KiB

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 de la formation CNRS ANF TDM 2022.

1. En bref

Dans ce tutoriel, nous allons apprendre plusieurs choses :

  • Charger des jeux de données :
    • à partir de fichiers txt importés depuis le disque dur ;
    • à partir de la librairie Python Perdido dans un Pandas dataframe (articles encyclopédiques et descriptions de randonnées).
  • Manipuler et interroger un dataframe
  • Utiliser les librairies Stanza, spaCy et Perdido pour la reconnaissance d'entités nommées
    • afficher les entités nommées annotées ;
    • comparer les résultats de Stanza, spaCy et Perdido ;
    • discuter les limites des 3 outils pour la tâche de NER.
  • Utiliser la librarie Perdido pour le geoparsing :
    • cartographier les lieux geocodés ;
    • illustrer la problématique de désambiguïsation des toponymes.

2. Introduction

3. Configurer l'environnement

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 environment.yml ou si vous utilisez un environnement Google Colab / Binder, vous devez installer perdido en utilisant pip :
!pip install --upgrade perdido
  • 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 :
!pip install stanza

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.

In [5]:
import warnings
warnings.filterwarnings('ignore')

from perdido.geoparser import Geoparser
from perdido.geocoder import Geocoder

from perdido.datasets import load_edda_artfl, load_edda_perdido, load_choucas_perdido

from spacy import displacy
Out [5]:
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)
/Users/lmoncla/git/gitlab.liris/lmoncla/tutoriel-anf-tdm-2022-python-geoparsing/Tutoriel-geoparsing.ipynb Cellule 8 in <cell line: 7>()
      <a href='vscode-notebook-cell:/Users/lmoncla/git/gitlab.liris/lmoncla/tutoriel-anf-tdm-2022-python-geoparsing/Tutoriel-geoparsing.ipynb#X10sZmlsZQ%3D%3D?line=3'>4</a> from perdido.geoparser import Geoparser
      <a href='vscode-notebook-cell:/Users/lmoncla/git/gitlab.liris/lmoncla/tutoriel-anf-tdm-2022-python-geoparsing/Tutoriel-geoparsing.ipynb#X10sZmlsZQ%3D%3D?line=4'>5</a> from perdido.geocoder import Geocoder
----> <a href='vscode-notebook-cell:/Users/lmoncla/git/gitlab.liris/lmoncla/tutoriel-anf-tdm-2022-python-geoparsing/Tutoriel-geoparsing.ipynb#X10sZmlsZQ%3D%3D?line=6'>7</a> from perdido.datasets import load_edda_artfl, load_edda_perdido, load_choucas_perdido
      <a href='vscode-notebook-cell:/Users/lmoncla/git/gitlab.liris/lmoncla/tutoriel-anf-tdm-2022-python-geoparsing/Tutoriel-geoparsing.ipynb#X10sZmlsZQ%3D%3D?line=8'>9</a> from spacy import displacy

ImportError: cannot import name 'load_choucas_perdido' from 'perdido.datasets' (/opt/homebrew/Caskroom/miniforge/base/envs/sunoikisis-py39/lib/python3.9/site-packages/perdido/datasets.py)

4. Chargement et exploration des données

4.1 Chargement d'un document texte à partir d'un fichier

In [3]:
filepath = 'data/volume01-4083.txt'
In [4]:
with open(filepath) as f:
    content = f.read()
    print(content)
Out [4]:
* 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.

4.2 Chargement d'un jeu de données à partir de la librairie Perdido

Perdido embarque 2 jeux de données :

  1. articles encyclopédiques (volume 7 de l'Encyclopédie de Diderot et d'Alembert), fournit par l'ARTFL dans le cadre du projet GEODE.
  2. descriptions de randonnées (chaque description est associée à sa trace GPS. Elles proviennent du site visorando.fr et ont été collectées dans le cadre du projet ANR CHOUCAS.
d = load_choucas_perdido()
df = d['data'].to_dataframe()
df.head()

4.3 Manipulation d'un dataframe

5. Reconnaissance d'Entités Nommées (NER)

5.1 Stanza NER

  • Importer la librairie Stanza et télécharger le modèle pré-entrainé pour le français :
import stanza

stanza.download('fr')
  • Instancier et paramétrer la chaîne de traitement :
stanza_parser = stanza.Pipeline(lang='fr', processors='tokenize,ner')
  • Executer la reconnaissance d'entités nommées :
doc = stanza_parser(content)
  • Afficher la liste des entités nommées repérées :
for ent in doc.ents:
    print(ent.text, ent.type)

5.2 SpaCy NER

  • Installer le modèle français pré-entrainé de spaCy :
!python -m spacy download fr_core_news_sm
  • Importer la librarie spaCy :
import spacy
  • Charger le modèle français pré-entrainé de spaCy
spacy_parser = spacy.load('fr_core_news_sm')
  • Executer la reconnaissance d'entités nommées :
doc = spacy_parser(content)
  • Afficher la liste des entités nommées repérées :
for ent in doc.ents:
    print(ent.text, ent.label_)
  • Afficher de manière graphique les entités nommées avec displaCy :
displacy.render(doc, style="ent", jupyter=True) 

5.3 Perdido Geoparser

  • Instancier et paramétrer la chaîne de traitement :
geoparser = Geoparser(version="Encyclopedie")
  • Executer la reconnaissance d'entités nommées :
doc = geoparser(content)
  • Afficher la liste des entités nommées repérées :
for ent in doc.named_entities:
    print(ent.text, ent.tag)
  • Afficher de manière graphique les entités nommées avec displaCy :
displacy.render(doc.to_spacy_doc(), style="ent", jupyter=True)
  • Afficher de manière graphique les entités nommées étendues avec displaCy :
displacy.render(doc.to_spacy_doc(), style="span", jupyter=True)

5.4 Expérimentations et comparaison

6. Geoparsing / Geocoding

# geocoding avec perdido
# afficher une carte
d['data'][1].get_folium_map()

6.2 Résolution de toponymes / désambiguïsation

Exemple de requetes sans stratégies de désambiguisation

Délimiter un zone restreinte lors de la requête

Premier niveau : utilisation d'un code pays.

Deuxième niveau : utilisation d'une bounding box délimitant la zone de recherche

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.

Résultats avant désambiguisation

d['data'][1].get_folium_map()
d['data'][1].cluster_disambiguation()
d['data'][1].get_folium_map()

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.