Exploiter/visualiser/explorer un corpus issue de l’OAI-PMH grâce au duo OpenRefine/Palladio

D’une requête OAI à une exploitation des données par l’intermédiaire d’un outils d’infoviz (en passant par du nettoyage de données, de la géolocalisation, etc.)

Courtin Antoine
11 min readAug 4, 2016

#OAI-PMH #DublinCore #OpenRefine #API #OpenStreetMap #Cartographie #InfoViz #data #REGEX

! WARNING !

Il s’agit ici d’un exemple d’utilisation à partir d’un micro-ensemble non exhaustif et donc avec de nombreuses lacunes. Ce billet n’a donc pas pour objectif de tirer des conclusions — elles seraient très vites trompeuses — mais de proposer une suite d’opérations pouvant être appliquées (soit dans son ensemble soit en prenant des “bouts”) à d’autre corpus, plus cohérent (mais c’est votre boulot;-)). De plus, je vais aborder qu’une infime partie des fonctionnalités des outils en faisant des raccourcis. Donc si ce n’est pas clair, n’hésitez pas à laisser des commentaires directement dans le corps du texte (en utilisant le petit crayon après avoir surligné le passage concerné).

Comme le disais ma grand-mère “ prudence est mère de sureté”

Process général de la manipulation

  1. Accéder au set de données du RETIF (Répertoire des tableaux italiens dans les collections publiques française XIII-XIXe sicèle) dans l’entrepôt OAI-PMH d’AGORHA (Accès global et organisé des ressources en histoire de l’art) développé par l’INHA (Institut national d’histoire de l’art)
  2. Récupérer les données et les manipuler/nettoyer/augmenter avec OpenRefine (fonction de base de l’outil + quelques REGEX + géolocalisation à l’aide d’une API + reconcialiation des auteurs avec VIAF
  3. Importer puis manipuler les données dans PALLADIO, outil web développé par le laboratoire Humanities + Design du l’université de Stanford (réalisation d’une carte avec comme fond, une carte numérisée de GALLICA, manipulation d’une galerie grâce à l’URL de la vignette issue d’AGORHA, etc.)

En gros, l’idée est de passer de la gauche à la droite

Pour les curieux/pressés (ou ceux qui connaissent déjà un peu les outils) voici:
* le fichier json avec les visualisations déjà pré-paramétrées à importer directement dans Palladio (via “loading an existing project”).

1. Accéder au set de données du RETIF de l’INHA

Nous allons ici utiliser le protocole OAI-PMH (Open Archives Initiative -Protocol for Metadata Harvesting) qui permet d’échanger des métadonnées généralement entre plusieurs institutions. Je ne vais pas développer l’historique et tous les principes — le site de la BnF dédié aux professionnels a des pages excellentes à ce sujet — mais plutôt me concentrer sur ce qui est utile pour la démo.

Pour résumer, l’intérêt de l’OAI-PMH est ici de pouvoir attaquer via une URL (grâce à des paramètres, nous y reviendrons) un lot de métadonnées de notices d’oeuvres décrit en DC (DublinCore), et ainsi récupérer un ensemble formel de données très basiques mais toujours utiles (titre de l’oeuvre, date, nom de l’artiste, lieu de conservation, etc.). Bien entendu, le DublinCore est assez pauvre et peu sémantique (dans le sens que ces éléments peuvent souvent être très polysémiques (exemple avec le DC:coverage), et qu’il n’y a pas de relation de sens entre les éléments).

Mais revenons au fait ! L’URL pour afficher les 100 premières notices de set RETIF d’AGORHA est la suivante:

http://agorha.inha.fr/inhaoai/servlet/OaiServlet?verb=ListRecords&metadataPrefix=oai_dc&set=oeuvres:repertoire-tableaux-italiens-collections-publiques-francaises-xiii-xix

Les paramètres utiles à comprendre de cette requête (chaque param est précédé d’un esperluette (&). Il peut être composé du nom du param suivi d’un = suivi de la valeur de ce param):

  • ListRecords: pour lister les records (notices)
  • metadataPrefix: pour choisir le format des données qui sera renvoyé par l’entrepôt. Pour respecter la norme OAI, le DC est obligatoire mais il est possible d’avoir d’autres formats (comme le METS pour la BnF).
  • set: le nom du set que vous voulez attaquer

Pour avoir l’ensemble des sets OAI que propose AGORHA, vous pouvez vous consulter la documentation complète sur le site de l’INHA.

Lorsque l’on joue cette requête dans votre navigateur, il vous renvoi (si celui-ci est sympa), une vue avec indentation et une coloration syntaxique pour pouvoir faciliter la lecture :

Là encore, quelques éléments utiles à regarder:

  • Ce qui nous intéresse correspond à l’élément <record>
  • L’élément <record> comporte 2 sous-éléments à savoir <header> et <metadata>.
  • C’est dans l’élément <metadata> que l’on retrouve tous les éléments DC (et donc les infos de titre de l’oeuvre, date, etc.)

Pour info, lorsque requête, par défaut le navigateur renvoi les 100 premiers records, pour aller plus loin, il faut utiliser le système de token disponible à toute fin de l’enregistrement:

2. Récupérer les données et les manipuler/nettoyer/augmenter avec OpenRefine

Comme l’indique clairement la basseline, OpenRefine (avec cette jolie icone en forme de diamant bleu) est un véritable couteau suisse pour vos “messy data” ! J’ai l’habitude de parler d’un excel aux hormones !

Sans refaire l’historique (et en faisant des raccourcis), l’outil OpenRefine est historiquement lié à l’existence de Freebase, l’un des tous premiers projets collaboratifs d’entrepôts de données sémantiques sur le web piloté par Google, ce pourquoi l’outil peut encore être téléchargé sous le nom de GoogleRefine.

Pour télécharger l’outil, c’est par là -> http://openrefine.org/download.html
[Bon à savoir: comme il s’agit d’une appli qui va se lancer dans un navigateur sur une adresse local (127.0.0.1:3333), pas besoin de droit admin, il suffira de double-cliquer sur le diamant dans le répertoire téléchargé.]

Là, encore je ne vais pas énumérer l’ensemble des fonctions d’OpenRefine mais seulement certains tricks utiles. (Pour une première familiarisation avec l’outil, de nombreuses vidéos sont disponibles sur youtube)

Une fois lancée (capt. 1), il faut se rendre dans l’onglet Create Project et choisir Web Adresses (URL) pour pouvoir insérer notre requête précédente (capt. 2). A ce moment, OpenRefine affiche le résultat obtenu dans la fenêtre d’import (capt. 3). Il faut içi préciser le format XML dans la partie “Parse data as” puis choisir l’élément XML qui fera office de records OpenRefine, à savoir tout logiquement l’élément <records>. Avec ces choix, les informations sont affichées dès lors sous la forme d’un tableau (capt. 4) et il suffit de cliquer sur “Create Projet” en haut à droite pour importer les données (et commencer à travailler).

A ce moment là, il faut jouer sur les forces d’OpenRefine et notamment en utilisant les fonctions que l’on trouve dans les menus déroulants de chaque colonnes qu’il suffit d’activer grâce à l’icône de flèche à gauche de chaque titre de colonne (les plus utiles sont: les filtres, ajouter des colonnes en partant d’une colonne pré-existante, la fonction split, etc.).

Le point le plus important à saisir et à différencier est ce qu’OpenRefine appelle Records et Rows. Dans notre cas, OpenRefine identifie 100 records mais comme dans notre set, un même éléments xml peut-être répété, nous allons avoir plusieurs rows possible pour un même records. C’est pourquoi, nous avons içi 670 rows pour les 100 records disponibles. Pour changer de vue, il suffit de cliquer sur l’option souhaitée en haut du tableau.

Voici des exemples d’opérations pour arriver rapidement à un micro-corpus exploitable (c’est-à-dire avec toutes les infos sur une seule et même ligne, et de données typées (de type texte, de type date, de type numérique, etc.) pour notre démonstration:

1/ Pour les éléments xml dc:coverage et dc:subject, les valeurs pouvant être multiples, nous allons transposer ces informations qui sont en ligne sur la forme de plusieurs colonnes grâce à la fonction “Transpose > Transpose cells in rows into columns”. [Attention, il faut bien être dans l’affichage records]

2/ Ensuite, nous estimons que les info principales d’un record correspond à la 1er ligne, nous allons donc supprimer les rows supplémentaires de chaque records. Pour cela, on se place sous la forme rows puis on active un filtre spécial sur la 1er colonne grâce à la fonction “Facet > Customized facets > Facets by blanks” permettant d’obtenir une facette dans la colonne de droite et ainsi d’afficher les 570 lignes pour lequel le 1er champ est vide (en cliquant sur true). Il suffit ensuite de les supprimer via la fonction “ALL > Edit rows > Remove all matching rows”.

En faisant cette dernière opération, n’oubliez pas de retirer votre facette dans la colonne de gauche. Vous obtenez donc maintenant le même nombre de records que de rows (100).

3/ Pour s’y retrouver, nous allons supprimer quelques colonnes inutiles et les ranger dans un ordre plus logique. Pour cela, on utilise la fonction “ALL > Edit columns > Re-order / remove columns”. Ensuite, on renomme les colonnes pour éviter d’avoir le noms des éléments xml DublinCore. (ex. pour record — metadata — oai_dc:dc:creator, on remplace par “createur”. Pour cela, on utilise “Colonne au choix > Edit columns > Rename this column”.

4/ Maintenant, on va s’intéresser à une des force d’OpenRefine, la notion d’expression permettant de manipuler des données à partir de différentes fonctions. Pour se faire plusieurs exemple:

  • Dans “Colonne au choix > Edit cells > Transform”, faire un simple “chercher-remplacer” dans une seule colonne grâce value.replace(“lavaleuràremplacer” ; “la nouvelle valeur”). Dans notre exemple, il s’agit de remplacer “vignette :” par rien permettant d’avoir pour 76 des 100 oeuvres, l’URL des vignettes (permettant un affichage de type galerie dans Palladio).
  • Grâce à “Colonne au choix > Edit column > Add column based on this column”, on va pouvoir extraire une information d’une colonne x en respectant un pattern pour isoler cette information dans une colonne indépendante. Pour la colonne “createur”, l’information est de la forme “peintre (année_naissance-année_mort)” [ex: Guercino (1591–1666)]. Il serait intéressant de récupérer ces 2 infos dans 2 colonne différentes. Un des moyens est d’utiliser des regex. Dans notre exemple , il faut chercher le pattern “(aaaa” ou a est chiffre entre 0 et 9. En regex, il y a une syntaxe pour dire ça à savoir : .*\((\d{4}).* (Pour en savoir +, le meilleur guide/memento est à consulté sur le site du zéro (oui, je sais, il s’appelle plus comme ça ;-)).
  • La fonction “Colonne au choix > Edit column > Split into several columns” va permettre, en choisissant un caractère séparateur (ou plusieurs), de diviser la colonne initiale en plusieurs colonne. Dans notre cas, le colonne lieu_cons (anciennement “on column record — metadata — oai_dc:dc — dc:coverage 1”) est de la forme “lieu_de_conservation (ville)”. Nous pourrions comme dans l’exemple précédant faire une regex pour prendre ce qu’il y a entre les 2 parenthèses mais on peut également spliter sur la parenthèse ouvrante comme ceci:
  • La fonction “Colonne au choix > Edit column > Add column by fectching URLs…” permet d’appeler des services web pour augmenter le contenu initial de nos données. L’idée içi est d’appeler l’API de GoogleMaps pour récupérer la longitude et la lattitude des lieux de conservation de chaque oeuvre. Dans la boite de dialogue qui apparaît il suffit d’inscrire dans le champ expression l’appel à l’API comme dans la capture n°1 [http://maps.google.com/maps/api/geocode/json?sensor=false&address=" + escape(value, “url”)]. Le resultat obtenu consiste donc à un ensemble de données au format json dans la colonne créée à cet effet. Il faut maintenant extraire les 2 infos qui nous intéresse grâce à l’expression suivante (capture n°2) [value.parseJson().results[0].geometry.location.lat + “, “ + value.parseJson().results[0].geometry.location.lng]
    Bien entendu, il n’est pas rare que l’API ne renvoi pas d’info, il faut alors jouer sur la valeur du champ pour améliorer le taux de réussite (comme par exemple, l’API donne de meilleur résultat si Nomdulieux, ville plutôt que Nomdulieux (Ville).

Le fichier possède maintenant quelques infos qui pourraient être intéressant de visualiser/manipuler dans une interface un peu plus fun ! il faut donc simplement exporter les données d’openrefine en CSV grâce au bouton d’export en haut à droite de l’interface.

3. Importer puis manipuler les données dans PALLADIO

Une fois les données téléchargées, vous allez pouvoir facilement les copier-coller dès la page d’accueil de Palladio

Page d’accueil de Palladion. On peut içi copier-coller du contenu CSV mais on peut également mettre l’URL d’un fichier tabulé ou encore réaliser directement une requête SPARQL pour acquérir de la data.

Palladio est divisé en 5 grandes rubriques:

  • DATA

Permet de faire le tour de ses data, d’en changer le type, de vérifier les éventuels erreurs, de rajouter à posteriori, des tables intermédiaires, etc.

  • MAP

Permet de créer des cartes. La rubrique la plus sympa de Palladio car il est possible d’ajouter ses data (préalablement géolocalisées) mais aussi jouer sur des fonds de carte, ajouter des shapes, etc.

Img 1: Dans le champ “Place”, il faut choisir le champ avce la géolocalisation (doit être sous la forme “lattitude, longitude”)
Vous remarquerez le soucis pour la Corse car la carte utilisée n’a pas eu assez de point de “rectification” sous MapWarper (probablement un autre billet à venir)

Pour récupérer des tileset URL de cartes ancienne, je conseils vivement MapWarper, service permettant de “rectifier” des cartes/plans numérisées. Il suffit après une recherche, d’aller dans l’onglet Export de la carte et récupérer l’info intitulé “Tiles (Google/OSM scheme)”

  • GRAPH

Permet de visualiser sous la forme d’un graph de réseau, les relations entre 2 champs. Il suffit de choisir un champ “source” et un champ “cible” et Palladio créé un réseau simple.

  • TABLE

Espace permettant de générer des listes en réalisant des regroupements logique à partir des données.

  • GALLERY

Grâce à la récupération des URL des vignettes, il est possible de générer cette galerie très facilement et de choisir les éléments qui en constituent les cartels. La source de l’information n’est pas perdue car il est possible d’associer une URL à chaque enregistrement (utilisant ici l’URL pérenne d’AGORHA reposant sur le système PURL).

Enfin le dernier point très important de Palladio est la présence des filtres dynamiques (leurs sélection ont une incidence automatique sur les info affichées dans la zone principale des 4 rubriques de visualisation mentionnées ci-dessus) en bas de la page, pouvant être soit des listes (en se reposant sur les colonnes du fichier importé), soit avec une visualisation sous forme chronologique.

Ce billet devait être rapide à lire, ce qui est raté, bravo à ceux qui ont réussi à aller jusqu’au bout :-)

Et pour finir sur une jolie note, copie du XVIIe conservée aujourd’hui au musée des Beaux-Arts de Nantes, d’un tableau de Francesco Albane conservé au Louvre intitulé Actéon métamorphosé en cerf.
Pour en savoir + sur l’oeuvre

--

--

Courtin Antoine

#patrimoine #numerique #LinkedOpenData #museogeek #reseaux #archives, #mediation, #xml #OpenDataCulturel #GLAM #bibNum #dataviz