Skip to content

Ce qu’il y a dans data.bnf.fr

12/05/2016

Pour ceux qui auraient raté l’info (je n’ai pas envoyé de faire-part, peut-être aussi parce que tout le monde s’en fout un peu), je bosse à la BnF depuis le début du mois de mars, au département qui prendra au 1er juin le nom de Département des Métadonnées (actuellement Département de l’Information bibliographique et numérique), pour contribuer à la fois au projet data.bnf.fr et à la qualité des données bib.

A bien des égards, ça ressemble à ce que je faisais au SCD de Nice et ce à quoi je m’intéresse sur ce blog. Mais en beaucoup plus gros. Donc depuis deux mois j’essaie de m’approprier ces masses que constituent data.bnf.fr et le catalogue de la BnF. J’ai fait planter Talend Open Studio (logiciel de construction de chaîne de traitement de données, un peu comme †Yahoo Pipes† en plus puissant) pour cause de Java heap space avec mon premier job (qui consistait en un simple couplage de script Python contenant une interrogation Sparql, et d’une feuille XSL).

Bref,il faut que je trouve la bonne approche à la fois intellectuelle et technique pour comprendre ce qu’il y a dans ces bases.

Par exemple, en naviguant dans les données de data.bnf.fr, j’ai voulu identifier les principales classes (types d’objets) et propriétés (relations entre objets) et de décrire ce que j’avais trouvé sous forme d’ontologie OWL. Ça a commencé avec ce schéma (résultat du W3C RDF Validator auquel j’ai fourni un fichier OWL écrit avec Protégé).

servlet_7252866050207972997

Plus ou moins lisible. Plutôt moins.

Outre le problème de longueur, le principal défaut que j’y vois est qu’il ne rend pas compte de la volumétrie de chacune des propriétés ou des classes, au sein de la base. Ainsi, certaines propriétés (comme le rôle « Joue du banjo dans ») ne va servir que quelques dizaines de fois, et certaines classes (comme foaf:Person) seront présentes plusieurs milliers, dizaines de milliers ou centaines de milliers de fois.

Bref, je voulais afficher grosso modo la liste des classes (types d’objets) existants, représentés comme plus ou moins gros selon leur volumétrie dans la base (nombre d’instances de classe) avec les liens (propriétés entre eux). Évidemment, la proximité entre objets est plus forte s’il y a un plus grand nombre de liens.

Via un script Python (je débute là-dedans), j’ai lancé les requêtes SPARQL suivantes :

  1. pour extraire la liste des classes et le nombre d’objets de chaque type
    select distinct ?Concept where {[] a ?Concept.}
  2. pour chacun des objets trouvés
    1. le réduire à sa classe
    2. lister les propriétés de l’objet
    3. voir vers quels types d’objets ces propriétés pointent (c’est le sous-domaine, ou range, de la propriété)
          PREFIX owl: <http://www.w3.org/2002/07/owl#>
          select distinct ?prop (count(?prop) as ?NbProp) ?typeRange where {
          ?item a ?Concept.
          ?item ?prop ?val.
          OPTIONAL  {?val a ?typeRange.}
          }

 

(l’intérêt de cette double requête, c’est qu’elle devrait marché à peu près pour n’importe quel triple store : afficher la liste des classes, puis pour chaque classe récupérer le nombre d’instances, les propriétés entre les classes et exporter le tout sous forme de fichier XML. J’ai ensuite écrit la feuille XSL pour convertir le fichier XML en fichier GEXF listant les noeuds et les liens, de manière à pouvoir gérer correctement le nommage de ces noeuds et de ces liens)

Voici le script Python utilisé

Et le fichier XML en sortie ressemble à ça :
person-naissance
Ce qui signifie qu’il y a dans data.bnf.fr 293.322 dates de naissances associées à des personnes. Ça ne nous dit rien en réalité du nombre de personnes dans data (le script compte les nombres de propriétés, pas les nombres d’objets : ce sont les relations que Gephi manipule dans ses traitements ensuite).

La feuille XSL a ensuite converti ce fichier en fichier GEXF importable dans Gephi (logiquement, il est possible d’obtenir le fichier GEXF avec Python, mais pour l’instant je ne sais pas faire).

J’ai donné le tout à Gephi pour calculer la visualisation du graphe obtenu (écarts entre noeuds, clusterisation par couleurs, etc.). J’en ai profité pour faire un peu de nettoyage : j’ai notamment viré les triplets qui décrivaient l’ontologie elle-même (comme la déclaration marcrel:aut est une sous-propriété de dcterms:creator)

Puis j’ai récupéré la bibliothèque JavaScript gexf.js pour l’appliquer à l’export GEXF du résultat obtenu par Gephi, afin d’avoir une vision dynamique et interactive.

ChJHqdiWwAEvQE-.jpg large

Je ne dispose pas pour le moment d’espace serveur où stocker les fichiers générés, qui me permettrait de vous fournir un lien à consulter. Mais vous pouvez récupérer les fichiers sur Github au format ZIP, décompresser et ouvrir le fichier index.html pour voir à quoi ça ressemble.

Ceci n’est qu’une première approche encore de cette découverte.
Précision : la navigation ne permet pas ensuite d’accéder par rebonds aux ressources elles-mêmes. Il n’y aurait pas eu grand sens à produire un outil qui, d’un clic, fournisse la liste du million de personnes physiques décrites dans data.bnf.fr. Ca permet simplement de se rendre compte de ce qu’il y a comme types d’objets dans data.bnf.fr, en quelle quantité, et liés à quels autres types d’objets.

Je compte encore explorer par grandes masses le contenu de data.bnf.fr (et du catalogue, pour lequel je dois encore appréhender les outils me permettant de le faire). Vous en entendrez sans doute encore parler ici, par conséquent.

%d blogueurs aiment cette page :