Skip to content

Extraire des données du catalogue de la BnF : un petit logiciel

30/10/2017

Voir le précédent billet sur l’ouverture du SRU (web service du catalogue de la BnF) la semaine dernière.

Je vous partage à présent un petit programme permettant d’extraire assez facilement des informations du catalogue de la BnF. Je reviendrai ultérieurement sur le making-of de ce programme : pour l’instant c’est juste le mode d’emploi.

Installation du programme ExtractionCatalogueBnF

  1. Récupérer le fichier .ZIP
    (sur Google Drive pour le moment. N’essayez pas d’ouvrir le fichier dans Google Drive : simplement de le télécharger sur votre PC. Le lien sera par aillerus maintenu sur cette page Github)
  2. Dézipper le fichier où vous voulez : il crée un répertoire ExtractionCatalogueBnF, contenant
    • 1 répertoire exe (avec tout le programme)
    • 1 fichier ExtractionCatalogueBnF (qui n’est qu’un raccourci vers l’exécutable situé dans le répertoire exe)

Utilisation du programme

Quand on double-clique sur le fichier ExtractionCatalogueBnF, une fenêtre s’ouvre :

(màj 02/11/2017 : nouvelle mise en forme)

ExtractionCatalogueBnF - formulaire

Dans la moitié gauche : les donnés en entrée, avec au choix :

  • une URL de requête SRU BnF
    sous la forme : http://catalogue.bnf.fr/api/SRU?version=1.2&operation=searchRetrieve&query=bib.title%20all%20%22recherche%20temps%20perdu%20retrouve%22%20and%20bib.author%20all%20%22proust%22&recordSchema=unimarcxchange&maximumRecords=10&startRecord=1
    Logiquement, à partir du formulaire de recherche SRU BnF et de la documentation fournie, vous ne devriez pas avoir trop de mal à lancer une requête et récupérer une première liste de résultats au format XML. C’est après, pour savoir quoi faire de ces résultats, que ça se gâte. D’où ce logiciel.
  • OU un fichier pouvant contenir plusieurs colonnes (séparées par des tabulations), mais dont la première doit être un numéro de notice ou un ARK BnF
    Ce fichier a pu être obtenu comme étant le rapport d’une précédente requête, ou encore via une extraction du triple store de data.bnf.fr, ou par tout autre moyen.
    Attention : pas de guillemets pour encadrer les valeurs de chaque colonne
    Il faut préciser le chemin d’accès complet au fichier (arborescence des répertoires + nom du fichier avec son extension)

    • Si on a donné en entrée un nom de fichier
      il faut préciser quel format en sortie on veut utiliser pour indiquer les éléments d’information à récupérer : si je dis au programme récupérer la zone 100, celle-ci n’est pas la même en Unimarc (zone de données codées) et Intermarc (auteur principal)
      Cette information en revanche n’est pas utile si on copie-colle l’URL d’une requête SRU : l’information est déjà dans l’URL

Dans la moitié droite : les données en sortie

  • La liste des éléments d’information à récupérer :
    • Pour les formats Marc : nom des zones et/ou sous-zones.
      Si vous indiquez une zone, il précisera chaque sous-zone par son dollar. L’ensemble de la zone sera dans une colonne
      Si vous indiquez une sous-zone, le $ ne sera rappelé que dans le nom de la colonne
      Vous pouvez mélanger tout ça et mettre par exemple :
      200;200$a;200$e$i
      Ce qui vous permettra d’avoir une colonne avec l’ensemble de la zone 200 (zone de titre, en Unimarc), mais aussi dans une colonne à part la 200$a, et encore à côté les compléments éventuels du titre
    • Si vous avez choisi Dublin Core : indiquez simplement le nom des balises à récupérer :
      dc:identifier;dc:title;dc:creator
      Si certaines informations sont répétées, elles seront dans la même colonne, séparées par un ~
  • Si vous voulez extraire des informations concernant des notices d’autorité, vous pouvez récupérer le nombre de notices bibliographiques liées à chacune des notices, en cochant la case idoine
    C’est une information qui, dans l’interface web du catalogue, est indiquée en bas à droite des notices d’autorité. Dans ce programme, elle mélange les notices liées comme auteur et comme sujet
  • Le nom du fichier rapport qui contiendra les informations extraites
    Ce fichier sera déposé dans un répertoire reports directement dans le répertoire ExtractionCatalogueBnF

Attention : il faut que les données en entrée soient en cohérence avec les éléments d’information demandées en sortie

  • Si vous avez mis une URL du SRU en entrée, le format XML doit correspondre aux zones que vous demandez en sortie (si vous affichez de l’Unimarc, vous ne pourrez pas demander à récupérer les « dc:title »)
  • Si vous avez indiqué un fichier en sortie et choisi le format Dublin Core, vous ne pouvez pas demander à récupérer le 200$a

Attention

On sait que l’extraction est terminée quand…

Le formulaire se ferme

Limites

Pas de gestion des erreurs

Ce programme est un dérivé de celui que j’utilise depuis pas mal de temps, avec quelques ajustements. Ce qui veut dire que comme je sais comment m’en servir, je n’ai pas envisagé tous les cas problématiques, si on renseigne mal le formulaire.

Par exemple, si dans le champ « Zones » vous terminez par un point-virgule et non pas un élément d’information, ça va sans doute planter

Les diacritiques sautent

<mise à jour>A partir de la version 0.4 (04/11/2017), les accents sont préservés</mise à jour>

L’encodage dans Python, c’est un truc de oufs. Et comme j’avais besoin d’avancer, et que j’en avais marre de tomber de temps en temps sur une notice qui faisait tout planter (parce que s’y planquait un caractère non-conforme UTF-8), j’utilise la librairie Unidecode qui vire tous les diacritiques. Du coup utiliser ces extractions pour faire des belles références bibliographiques, par exemple, est juste impossible.

Pas d’upload pour l’option de fichier en entrée

Je peine à utiliser les fonctions de filedialog dans la librairie Tkinter. De manière générale, j’ai une utilisation laborieuse de cette boîte de dialogue. Donc elle n’est vraiment pas belle — et est tout juste fonctionnelle.

Ce qui me laisse une large marge de progression.

Pas de versioning

<mise à jour>Gestion des mises à jour : désormais (à partir de la version 0.4) un bouton apparaît quand il y a une version plus récente à télécharger</mise à jour>

Comme quoi c’est du bricolage : je ne sais toujours pas utiliser correctement Git ou Github (ou Tortoise ou autre chose). Donc je ne fais pas de versioning propre. Et je n’ai pas non plus de dispositif satisfaisant pour que les versions ultérieures de l’exécutable soient rangées sous une URL stable. Pour ça, je ne désespère pas.

Remarque sur les fichiers en entrée et les rapports

Le programme produit un fichier texte avec des colonnes séparées par des tabulations. Le moyen le plus simple de l’exploiter est encore de l’ouvrir avec le bloc-notes (ou autre éditeur de texte brut — pas Word) et de copier-coller son contenu dans Excel

  • Ctrl+A (sélectionner tout)
  • Ctrl+C (copier)
  • [dans Excel] Ctrl+V (coller

De même, si vous avez un fichier Excel contenant en première colonne des numéros de notice BnF, il vous suffit de copier-coller son contenu dans le bloc-notes pour obtenir un fichier qu’ExtractionCatalogueBnF puisse traiter. Attention : au moment d’enregistrer le fichier, penser à préciser qu’il est encodé en UTF-8 (sinon c’est de l’ANSI par défaut, et ça risque de faire planter le programme).

Rappel

Ce logiciel n’est pas un produit officiel de la BnF. Si j’y travaille (pour mon plus grand bonheur), j’ai développé ce programme hors de mon temps de travail, et à titre « officieux » : aucune pérennité ni efficacité du truc n’est garantie, vous êtes priés d’en faire usage avec prudence (mais tout retour sera la bienvenue). J’ai découvert plein de trucs tout au long de la conception du programme, le code s’en ressent fortement, ce n’est pas quelque chose qu’on pourrait diffuser comme ça à titre institutionnel.

Mais ça me rend déjà des services — donc je me dis que ça peut vous en rendre aussi ! Par ailleurs, ça permet à quiconque le souhaite de développer des améliorations (et il y a de quoi faire !)

Publicités

« Papa, c’est quoi un SRU ? »

27/10/2017

Il faut vraiment que j’arrête de parler boulot à table… Quoiqu’il en soit, j’ai lâchement botté en touche et épargné l’explication à mon fils, mais je ne vous l’épargnerai pas (je me sentirai certainement mieux après).

Z39.50 + web = SRU ?

Les premières fois (et pendant des années) que j’ai entendu parler de « SRU/SRW », c’était systématiquement pour entendre : SRU, c’est comme Z39.50, mais sur le web.

Ce n’est pas faux. Mais c’est un discours pour bibliothécaires : on part des concepts qu’ils maîtrisent, et on fournit les ajustements nécessaires à la compréhension.

Quand je dis « concepts qu’ils maîtrisent », je veux dire que la plupart des bibliothécaires voient bien l’utilisation qui peut être faite de Z39.50 : une recherche fédérée, ou une fonction d’import de notices venues de l’extérieur au sein d’un SIGB. Mais je ne suis pas sûr que qu’un aussi grand nombre de collègues serait en mesure de décrire l’architecture client-serveur, énoncer que Z39.50 est un protocole, et est également une API. (Si je m’égare sur les compétences techniques des collègues, n’hésitez pas à râler : ça m’intéresse réellement de savoir à quoi m’en tenir sur la culture générale professionnelle technique normale dans la profession aujourd’hui).

Ce n’est pas faux, donc, mais ça ne me plaît pas. Parce que justement, nous devons apprendre à raisonner avec les concepts du web, maîtriser avant tout les technologies développées par d’autres, et s’intégrer dans une communauté plus large des développeurs, responsables de services en ligne et diffuseurs de (méta)données.

Et d’ailleurs, si on veut diffuser nos données, il faut expliquer ce qu’est le SRU à d’autres professions. Si on les force à passer par le concept « Z39.50 » pour ensuite aller au SRU, c’est mort.

Donc je propose de renverser la logique : le SRU, c’est un web service standardisé adapté aux besoins des catalogues de bibliothèques.

Le SRU, c’est un web service

Je ne vais pas refaire une explication longue sur ce que sont les web services.

L’objectif des web services est de fournir à des applications les données enfermées dans une base de données, sans les dé-sémantiser en ne fournissant que du HTML.

On va donc proposer les mêmes informations, mais diffusées à la fois dans son site web en HTML, et sous forme d’API en JSON ou en XML (le plus souvent)

Et même, pour faire les choses plus proprement, il est préférable que la vue HTML exploite elle aussi l’API (avec besoin du coup d’une API interne, et d’une API différente pour exposer les données à destination d’utilisateurs extérieurs).

De la sorte, quand on doit refondre la base de données (changer de logiciel de SGBD, par exemple), il n’y a qu’une seule application qui attaque directement cette base de données, et c’est cette API-là seulement qu’il faut refaire.

Bref, un SRU, c’est un web service.

(petit rappel sur la différence entre API et web service : tout web service est une API. Mais parmi les API, seules celles qui passent sur le web, en HTTP, sont des web services. Z39.50 est une API, puisqu’elle permet à deux programmes d’échanger des données et des commandes, mais ce n’est pas un web service puisque ce protocole se passe en dehors du web)

SRU est un web service standardisé

Les bibliothèques sont une belle et large communauté. Et c’est une de ses forces que quand l’une d’entre elles a une idée ou un besoin, elle se demande si d’autres n’ont pas eu l’idée ou le besoin auparavant. Et proposer son catalogue sous forme de web service, pour faciliter la récupération et l’exploitation des métadonnées qui sont dedans.

Je ne vous refais pas l’histoire de SRU (que, en gros, j’ignore). Mais des bibliothèques se sont mises d’accord pour définir une manière standardisée (çàd identique) de proposer leur catalogue en web service.

Si vous voulez un contre-exemple : DoMyBiblio.net propose un web service pour interroger le Sudoc. Son développeur  @YvesTomic (qui a fait un boulot formidable, n’y voyez aucune critique : sa plate-forme est extrêmement utile) a choisi lui-même les noms à donner aux balises qui encadrent les éléments d’information.

Le standard SRU précise la manière dont on peut interroger le serveur qui expose les données du catalogue (en ce sens, SRU est un protocole puisqu’il définit comment faire dialoguer des machines, un client et un serveur). Il précise notamment :

  • qu’il faut un fichier « Explain » en plus de l’interrogation proprement dite du catalogue.
    Ce fichier Explain liste les formats de récupération, les critères de recherche disponibles et leur signification
    Cf. le fichier Explain du SRU de la BnF
    Cela peut sembler un gadget, ou un bonus, mais ça signifie que le mécanisme du SRU est autodocumenté : on peut bien sûr fournir la liste des critères de recherche sur une page web, ou dans un beau fichier PDF. Mais on expose aussi ces informations d’une manière accessible à un ordinateur, qui peut les extraire et les manipuler.
  • qu’il faut encapsuler les notices du catalogue de métadonnées « de gestion » : rappel de la requête, mention du nombre de résultats global, format d’exposition des données
  • qu’on peut ajouter des informations sur la notice extérieures à la notice elle-même : par exemple sa date de création ou de dernière modification, si cette information ne se trouve pas déjà à l’intérieur de la notice.

Le protocole SRU précise aussi la manière de paginer les résultats : on n’indique pas le numéro de la page, mais le numéro de la première notice apparaissant sur la page (&startRecord=100).

Le format des données

SRU laisse libre la manière de diffuser ses métadonnées : il précise juste que ces métadonnées sont encapsulées dans des balises <srw:record>…</srw:record>.

On peut donc diffuser du Marc, mais aussi du Dublin Core, de l’EAD, etc. en l’encapsulant dans ces balises <srw:…>

Voici l’arbre XML qui structure une page de résultats type.

SRU ne dit en réalité pas grand chose de ce qu’il y a à l’intérieur de srw:recordData (la partie verte du schéma, qui correspond ici à une notice en MARC mise en XML). D’un côté, ça ajoute de la souplesse et permet d’y mettre toutes sortes de formats. D’un autre côté, ça veut dire qu’on doit documenter hors SRU la liste des différents éléments d’information d’un format MARC : un programme qui tombe sur une zone 300$a (en XML, ce sera <datafield tag="300" ind1=" " ind2=" "><subfield code="a">...</subfield></datafield>) ne peut pas récupérer facilement la signification (le libellé correspondant, la définition) de cet élément d’information.

Le SRU de la BnF ouvre !

Tout ça pour dire que désormais, le catalogue de la BnF, et toutes ses métadonnées, est désormais accessible via SRU, avec la documentation nécessaire, un formulaire de recherche pour faciliter la découverte et la prise en main de la chose — et même une petite feuille de style pour ceux que le XML effraierait (case à cocher en bas du formulaire).

Et moi, je vous présenterai dans un prochain billet un petit outil pour extraire facilement en CSV des données du catalogue, adossé au SRU.

Ce qui permettra de répondre en partie à la question que vous vous posez tous si vous êtes arrivez aussi loin dans la page : « Qu’est-ce que je peux bien faire avec ça ? »

Ce que data.bnf.fr m’apprend de Lully (2)

24/10/2017

Après le premier billet qui s’intéressait surtout au compositeur (quoique en l’effleurant seulement), voyons un peu les oeuvres. A ce stade, je connais le modèle de data.bnf.fr (vous aussi ?), mais pas forcément quelles propriétés (et utilisées avec quelle fréquence ? avec quelles valeurs ?) sont associées aux entités Oeuvre, Expression, Manifestation — sachant que toutes les métadonnées des notices du catalogue ne sont pas reportées dans data.bnf.fr, mais que d’autres sont ajoutées (et notamment des alignements vers d’autres bases, il faudra bien y venir).

Bref, faisons le point.

La requête suivante permet d’extraire les propriétés appliquées aux manifestations, expressions et oeuvres attribuées à Lully

DEFINE input:same-as "yes"
PREFIX rdarelationships: <http://rdvocab.info/RDARelationshipsWEMI/&gt;
PREFIX dcterms: <http://purl.org/dc/terms/&gt;
PREFIX bnf-onto: <http://data.bnf.fr/ontology/bnf-onto/&gt;
PREFIX skos: <http://www.w3.org/2004/02/skos/core#&gt;
PREFIX foaf: <http://xmlns.com/foaf/0.1/&gt;
select ?typeEntite ?propEntite (count(?propEntite) as ?OccurrencesProprietes)
where {
{?entite ?role <http://data.bnf.fr/ark:/12148/cb13898799k#about&gt;.
?entite ?propEntite ?valEntite.
?entite a ?typeEntite.}
UNION
{?expression ?role <http://data.bnf.fr/ark:/12148/cb13898799k#about&gt;.
?entite rdarelationships:manifestationExpressed ?expression.
}
}
ORDER BY ?typeEntite, ?propEntite

Ca fait pas mal de propriétés distinctes :

  • Manifestations : 24
  • Expressions : 176
    Les rôles sont répétés selon différentes ontologies, et rien qu’avec l’ontologie bnf-roles, on a 119 propriétés différentes
  • Oeuvres : 20

Les manifestations

Liste des propriétés, par ordre décroissant d’occurrences

dcterms:subject 808
dcterms:title 238

rdarelationsships:expressionManifested
238

rdf:type
238

rdfs:seeAlso
238
owl:sameAs 238

bnf-onto:FRBNF
237

dcterms:description
235
dcterms:date 234

dcterms:publisher
217

bnf-onto:firstYear
209

rdavocab:dateOfPublicationManifestation
209
rdavocab:note 190

rdavocab:placeOfPublication
173

rdavocab:publishersName
170

rdarelationships:electronicReproduction
55

bnf-onto:isbn
35

Il n’y a apparemment pas de propriété qui permette d’identifier les oeuvres spécifiquement musicales — mais en fait si : cette information peut se retrouver en indexation Sujet.

Voilà une autre requête qui récupère l’indexation Sujet associée aux documents dont Lully est l’auteur.

Et si on récupère les indexations les plus fréquentes…

sujet sujetLibelle OccurrencesSujet

http://data.bnf.fr/ark:/12148/cb11976032c
« 18e siècle »@fr 425

http://data.bnf.fr/ark:/12148/cb119329384
« Partitions »@fr 241

http://data.bnf.fr/ark:/12148/cb11976227b
« Opéras »@fr 138

http://data.bnf.fr/ark:/12148/cb146484776
« Opéras-ballets »@fr 118

http://data.bnf.fr/ark:/12148/cb12215119w
« Parties »@fr 77

http://data.bnf.fr/ark:/12148/cb13601444k
« Arrangements »@fr 62

http://data.bnf.fr/ark:/12148/cb12215082c
« Extraits »@fr 57

http://data.bnf.fr/ark:/12148/cb11976232x
« Ouvrages avant 1800″@fr 44

http://data.bnf.fr/ark:/12148/cb124905429
« Partitions et parties »@fr 43

http://data.bnf.fr/ark:/12148/cb11960516v
« Solfège »@fr 37

http://data.bnf.fr/ark:/12148/cb12111871s
« Clavecin, Musique de »@fr 35

http://data.bnf.fr/ark:/12148/cb12490452b
« Réductions chant et piano »@fr 32

http://data.bnf.fr/ark:/12148/cb121516267
« Motets »@fr 30

http://data.bnf.fr/ark:/12148/cb11975995h
« 20e siècle »@fr 28

http://data.bnf.fr/ark:/12148/cb11975999w
« 19e siècle »@fr 27

http://data.bnf.fr/ark:/12148/cb122150931
« Airs d’opéra »@fr 26

http://data.bnf.fr/ark:/12148/cb119604900
« Piano, Musique de »@fr 20

http://data.bnf.fr/ark:/12148/cb11948111j
« Harmonie (musique) »@fr 16

http://data.bnf.fr/ark:/12148/cb11975998j
« 17e siècle »@fr 15

http://data.bnf.fr/ark:/12148/cb133183660
« Musique »@fr 14

… on voit bien que ce n’est justement pas une indexation : c’est une catégorisation de genre ou de forme. Dans certains cas, on peut même identifier qu’il s’agit de partitions, et non d’enregistrements.

En revanche l’inverse n’est pas possible : il n’y a pas d’information Ceci est un enregistrement sonore dans l’indexation.  Passons justement aux expressions.

Les expressions

La propriété dcterms:type est celle qui nous intéresse pour ça : concernant les documents liés à Lully, elle peut prendre 4 valeurs (codées selon le référentiel dcmitype) :

  • Text
  • Sound
  • MovingImage
  • InteractiveResource

Et selon la volumétrie suivante (l’information de décennie est extraite de la date, elle-même liée non à l’expression mais à la manifestation)

Les oeuvres

Presque toutes les oeuvres de Lully recensées dans data.bnf.fr sont typées, avec une propriété <http://musicontology.com/genre&gt;

Ce qui nous donne la liste des genres musicaux suivants

On peut donc à présent croiser tout ça

(toujours en se limitant à Lully)

Evidemment, on reste dans tous ces cas tributaire de la manière dont les données d’origine ont été renseignées : par exemple, si la mention de « partition » a été indiquée en zone 258*, mais pas en indexation sujet (subdivision « genre/forme »), on est cuit…

Une petite astuce pour finir (au cas où)

Si jamais vous ne savez pas comment facilement récupérer la requête Sparql qui se « cache » dans l’URL des liens auxquels je renvoie : il vous suffit de copier-coller cette URL sur le site URL Decoder/Encoder.

Pour la fois suivante, on parlera de croisement avec d’autres API (élargissement à d’autres sources). Ou alors d’identifier les compositeurs ou musiciens dans data.bnf.fr (élargissement à d’autres personnes).

———-

*Si vous vous demandez à quoi sert la zone 258 : vous pouvez utiliser cette page. C’est un pense-bête. Vous n’aurez pas accès à la documentation détaillée (bouton « Ouvrir la page »), mais en saisissant le nom d’une zone ou d’une sous-zone Intermarc ça vous fournit son libellé (et réciproquement). C’est déjà pas mal…
Cela dit, concernant spécifiquement la 258, vous avez peut-être raté ce billet 🙂

 

Du FRBNF à l’ARK

18/10/2017

Cet article est déjà paru sur le site de la Transition bibliographique. Mais je le remets sur mon propre blog, dans sa version pré-print (avant reprises éditoriales très-pertinentes des collègues), d’abord pour archivage personnel, ensuite parce que j’ai d’autres billets en tête qui s’appuient là-dessus, et qui ne trouveront pas forcément leur place sur Transition-bibliographique.fr

Depuis de nombreuses années la BnF diffuse ses notices bibliographiques en les identifiant d’un numéro dit « FRBNF ». Mais de plus en plus, elle est amenée à faire valoir ses identifiants « ARK ». La différence n’est en réalité absolument pas anecdotique.

A quoi sert un FRBNF ?

Pourquoi conserve-t-on le numéro de notice BnF dans un catalogue local (ou celui du Sudoc) ? Par traçabilité, pour montrer l’origine de la notice et indiquer qu’elle vient de la BnF (avec reprises et corrections postérieures ou pas, le format Marc ne permet pas de le préciser).

Le numéro FRBNF est construit avec le numéro d’identifiant interne de la notice dans la base de données, sur 8 chiffres, et préfixé de « FRNBF ». Il a parfois un suffixe (clé de contrôle) partagé ou pas, ce qui peut rendre sa réutilisation un peu complexe :

« Depuis, 2004, la structure des numéros de notice BnF est la suivante : « FRBNF » suivie d’un numéro à 9 caractères (le dernier caractère pouvant être un « X »).
Selon les outils proposés par la BnF en consultation, le dernier caractère peut ne pas être affiché (structure FRBNF + 8 caractères).
En ce cas, saisir ce numéro en $z »

Il sert à citer la source de la notice et expliquer d’où elle vient. C’est tout.

Éventuellement, si vous avez un FRBNF dans votre catalogue, vous pouvez vous en servir en cas de doute pour retrouver cette même notice dans le catalogue de la BnF. Mais celle-ci peut entre-temps avoir été fusionnée avec une autre, et donc avoir changé de numéro. Le FRBNF dont on a connaissance dans la notice dérivée correspond alors à la zone « ancien numéro de notice » dans la nouvelle notice BnF.

Coexistent dans le catalogue de la BnF des anciens numéros qui sont la même séquence de chiffres que des numéros actuels : tout simplement parce que par le passé plusieurs logiciels ont coexisté, chacun attribuant sa propre séquence d’identifiants, indépendamment du fait que ceux-ci existent déjà par ailleurs ou non dans la base d’à côté. Et depuis plusieurs années toutes les bases ont fusionné au sein du « Catalogue général » que vous pouvez admirer aujourd’hui.

Ainsi dans le Sudoc la notice Numismatique médiévale, par Marc Bompaire et Françoise Dumas (PPN 051702096) indique en 035

035 $a frBN025648688

Mais dans le catalogue de la BnF cette notice a désormais le numéro 371168816 (FRBNF), et non 025648688. C’est en zone 917 (ancien numéro système) qu’on trouve :

917 .. $o OPL $a 025648688

Je le redis, le FRBNF est donc une simple mention pour sourcer la notice.

A quoi sert un ARK ?

A priori, pareil : dans le catalogue de la BnF, c’est un identifiant permettant de désigner une notice bibliographique ou d’autorité, avec un préfixe, un numéro système, et un suffixe.

Par exemple pour cette même notice BnF Numismatique médiévale , on a :

Quelle différence ?

D’abord, il est possible de préfixer l’ARK pour en faire une URL : en ajoutant http://catalogue.bnf.fr/, ou http://gallica.bnf.fr/, http://data.bnf.fr/, ou http://ark.bnf.fr/, on accède (via une redirection préalable ou non) à une représentation de la ressource (soit la notice bibliographique, soit le document numérisé). L’ARK permet facilement de construire une URL déréférençable — donc d’avoir une URI selon les exigences du web sémantique.

Par ailleurs, la BnF a une politique de pérennisation de ces ARK, et pas de ses FRBNF. Cela signifie que si une notice disparaît (par exemple en fusionnant avec une autre, avec laquelle elle doublonnait), son FRBNF ne vous permet pas d’accéder à la nouvelle notice. Alors que l’ARK, si.

Par exemple, la notice 30665273 (ark:/12148/cb30665273m) a été fusionnée avec la 43243944 (ark:/12148/cb43243944w)

Pourtant si vous ouvrez l’URL http://catalogue.bnf.fr/ark:/12148/cb30665273m, vous tombez bien sur cette  notice, redirigée par le serveur de la BnF.

Par ailleurs, votre FRBNF peut très bien correspondre à un numéro de notice toujours existant et à un ancien numéro de notice fusionnée :

Par exemple le frBN000000331 qu’on retrouve dans la notice d’autorité IdRef 026357585 semble correspond à un numéro de notice système 00000033 présent comme ancien numéro de notice dans 24 notices d’autorité. Sauf qu’en réalité il s’agit d’un ancien numéro système sur 9 chiffres  : 000000331, présent quant à lui comme ancien numéro dans 2 notices d’autorité.

En revanche dans la notice Sudoc 026359405 (qui n’est pas une super notice, mais vu qu’elle vient de la BnF, je ne vais rien dire !) on trouve le FRBNF118622701. La recherche sur 9 chiffres ne renvoie rien — mais en cherchant 11862270 on retombe bien sur la même notice (c’est son numéro de notice actuel, ark:/12148/cb118622704)

Je vous ai perdu avec tous ces exemples ? C’est normal : ça prouve qu’on s’y perd rapidement… Moralité : mieux vaut un ARK si on veut pouvoir ré-accéder un jour à la notice source.

Quelles conséquences dans le cadre de la Transition bibliographique ?

Le catalogue de la BnF, comme celui du réseau Sudoc, sont en phase de transition. Ils vont progressivement contenir un plus grand nombre de notices d’oeuvres (calculées automatiquement ou non), et une plus grande proportion de notices bibliographiques liées à ces notices d’oeuvres.

A terme (1 an ? 2 ans ? 4 ans ?) il deviendra vraiment intéressant pour les bibliothèques de lecture publique qui ont un jour dérivé des notices BnF, de récupérer l’ensemble des mises à jour, notamment ces liens depuis les notices biblio vers les oeuvres — et les oeuvres elles-mêmes, bien sûr.

Or ces notices dérivées ne contiennent, la plupart du temps, qu’un FRBNF et pas d’ARK. Dans un grand nombre de cas il sera possible d’isoler les 8 premiers caractères de ce FRBNF pour reprendre la notice biblio actuelle correspondant à ce numéro. Et le plus souvent ça fonctionnera. Mais dans un certain nombre de cas ces notices auront disparu. Pire : la notice que vous aviez dérivée du catalogue aura disparu (fusionnée), vous voudrez la rechercher (sans le préfixe « FRBNF ») dans le catalogue, et constaterez peut-être alors que ce numéro correspond à un autre tout document.

Comment réactualiser ses notices en masse ?

La récupération des notices BnF, dans quelques mois ou quelques années, aura donc un préalable nécessaire : la récupération des ARK pour chaque notice.

Ce travail-là fera l’objet de billets ultérieurs, soit sur ce blog soit ailleurs.

Ce que data.bnf.fr m’apprend de Lully (1)

17/10/2017

Premier petit échauffement en vue du hackathon BnF 2017, dont le thème (non obligatoire) cette année est la musique.

Sans surprise, je vais commencer sur Lully (l’usurpateur de mon nom).
Je ne sais pas si vous vous souvenez, mais on est dans une phase intermédiaire d’évolution du modèle de data.bnf.fr, avec 2 URI pour désigner une même personne : son identifiant #foaf:Person et son identifiant #about. Les 2 sont déclarées équivalente (reliées par un owl:sameAs). Je ne vous refais pas toute l’explication.

Pour ne pas avoir à gérer les deux URI, il faut utiliser une ligne dans le Sparql Endpoint qui va déclencher des inférences : toute propriété concernant une des deux URI sera reportée également sur l’autre.

Les oeuvres de Lully

Une requête simple pour sortir toutes les oeuvres de Lully, avec :

  • son rôle (limité par la dernière ligne du code, au vocabulaire détaillé des rôles utilisé à la BnF, et éviter de récupérer les simples dcterms:creator ou dcterms:contributor)
  • la date de publication (qui est un critère obligatoire dans cette requête : les documents non datés ne vont donc pas sortir)
  • le titre
  • le lien à l’oeuvre (si elle a été créée)

Le noeud principal de la requête est la ligne rouge : les expressions où Lully a une mention de responsabilité (auteur, compositeur, etc.)

DEFINE input:same-as "yes"
PREFIX rdarelationships: <http://rdvocab.info/RDARelationshipsWEMI/&gt;
PREFIX dcterms: <http://purl.org/dc/terms/&gt;
PREFIX bnf-onto: <http://data.bnf.fr/ontology/bnf-onto/&gt;
PREFIX skos: <http://www.w3.org/2004/02/skos/core#&gt;
select DISTINCT * where {
?URIexpression ?URIrole <http://data.bnf.fr/ark:/12148/cb13896861p#foaf:Person&gt;.

?URIrole skos:prefLabel ?libelleRole.
?URIexpression dcterms:type ?typeExpression.
?URImanifestation rdarelationships:expressionManifested ?URIexpression.
?URImanifestation dcterms:title ?titreManif.
?URImanifestation bnf-onto:firstYear ?dateManifestation.
OPTIONAL
{?URImanifestation rdarelationships:workManifested ?URIoeuvre.
?URIoeuvre dcterms:title ?titreOeuvre.
?URIoeuvre bnf-onto:firstYear ?dateCreationOeuvre.}
?URIrole skos:inScheme <http://data.bnf.fr/vocabulary/roles&gt;..
}

On pourrait traiter ça directement soit avec des requêtes successives, soit avec un programme Python — mais je vais être à la fois paresseux et peu pragmatique : copions-collons ce tableau dans Excel.

Ca fait 912 lignes. Logiquement, il devrait y avoir une ligne par manifestation, mais en fait non :

  • il y a les manifestations qui sont des agrégats (bienvenus dans le monde de la musique)
    En fait, ça veut tout simplement dire qu’une publication (partition ou enregistrement) contient plusieurs oeuvres.
    La même manifestation apparaît donc autant de fois qu’il y a d’oeuvres distinctes dans les colonnes URIOeuvre, ?titreOeuvre et ?dateCreationOeuvre)
  • il y a les oeuvres que Lully a à la fois composées (musique) et écrites (texte). Il est alors mentionné à 2 reprises (exemple)

Bon, Lully est surtout compositeur (sans surprise)

Compositeur 532
Auteur ou responsable intellectuel 367
Ancien possesseur 6
Auteur du texte 6
Arrangeur 1

Objectivement, on pouvait s’en rendre compte directement sur la page consacrée à Lully (comme quoi l’interface est bien faite)

D’ailleurs la volumétrie est sensiblement supérieure à mon extraction. Si on ne veut pas récupérer les dates (ligne ?URImanifestation bnf-onto:firstYear ?dateManifestation}, on augmente un peu le nombre récupéré (on passe de 910 à 1200 documents), mais ça reste loin des près de 3000 ressources.

Et si on extrait juste du Sparql Endpoint la liste des triplets ?Ressource ?role <Lully> (où le ?role est limité aux codes fonction précis du référentiel détaillé), on ne monte qu’à 1500 réponses (incluant les oeuvres et les spectacles). A noter que la page data.bnf.fr aditionne les 1500 documents eux-mêmes aux 160 oeuvres. Mais on n’atteint pas les 3000. Et quand on utilise la fonction d’export en pied de page, le fichier de triplets contient moins de 1600 ressources pour lesquelles Lully a une mention de responsabilité.

Les collaborateurs

Lully n’a pas composé tout seul : cette page de data.bnf.fr identifie les autres mentions de responsabilité sur les ressources où Lully a joué un rôle.

Ce qui peut impliquer plein de situations différentes, mais essentiellement :

  • une pièce dont Lully est le compositeur et quelqu’un d’autre le metteur en scène ou l’auteur du livret
  • la mention de Lully comme auteur et de son interprète (dans le cas d’enregistrements)
  • une ressource qui contient à la fois des oeuvres de Lully, de Charpentier, de Bach ou de Mozart

Il faudrait donc débroussailler tout ça ensuite en fonction des rôles (et sans doute des dates de vie et de mort). Toutes les situations sont d’ailleurs intéressantes selon ce qu’on veut en faire.

Un petit programme permet d’extraire cette liste, et pour chacun des autres auteurs, d’identifier aussi les liens entre eux. Un paramètre en entrée : l’identifiant ARK de l’auteur.
(petit rappel : je ne suis pas développeur, le code est certainement très moche — mais bon, ça marche. Je ne ferai pas ce rappel à chaque fois)

Pour Lully, une fois le fichier résultat chargé dans Gephi, ça donne un graphe assez énorme (2164 « collaborateurs » pour Lully, et plusieurs dizaines de milliers de liens entre tous ces gens-là)

Et avec les noms (mais est-ce nécessaire, finalement ?c’est si beau sans)

Ce qui est amusant, c’est qu’au centre du graphe, on ne trouve pas Lully lui-même (pourtant à l’origine de l’extraction) mais Mehul (compositeur fin XVIIIe-XIXe siècle), Charles Malherbe (musicologue fin XIXe-début XXe) et André Gill (caricaturiste XIXe siècle). Je vous laisse méditer là-dessus…

Le succès éditorial

Un rapide petit décompte par décennie du nombre de document édités, sur ce corpus de 912 ressources :

(je constate au passage que mon script écrit il y a quelques mois permettant d’obtenir rapidement ce genre de graphiques bloque complètement, il faudra que je le refasse. Je constate aussi qu’il est écrit n’importe comment. C’est une bonne nouvelle, ça veut dire que je progresse)

————————————————————————————————————–

Je vais en rester là pour l’instant : les ressources, les rôles, les collaborations.

J’explorerai plus tard la question des documents manquants (c’est-à-dire la différence de volumétrie entre la page data.bnf.fr et ma requête Sparql), mais aussi les types de documents musicaux, ainsi que la question des spectacles. J’aimerais bien avoir le temps de voir deux ressources extérieures aussi :

  • le SRU de la BnF, dont l’ouverture publique est imminente
  • l’articulation avec d’autres bases de données et ce qu’on peut en tirer, soit via nos alignements (déclaration d’équivalences entre nos identifiants et ceux de VIAF, wikidata, ISNI, etc.), soit par reconnaissance de chaînes de caractères pour interroger des API de type Deezer (basculer d’un morceau entendu quelque part à sa partition, par exemple ?).

Cas d’utilisation d’Open Refine – exemple 1/3 : nettoyer une liste de valeurs

10/10/2017

Ce blog est un peu en dormance, je vais essayer de le réactiver un peu. Disons que je n’ai pas encore trouvé (après déjà une année passée à Paris…) où je pouvais caler le moment « bloguer » dans mon rythme hebdomadaire.

Voici très rapidement un exemple d’utilisation d’Open Refine. Ce logiciel, dont j’ai déjà parlé à plusieurs reprises, est installé sur mon poste mais je n’en fais usage qu’assez épisodiquement — quand j’identifie qu’il peut m’être plus utile qu’Excel. Je prévois donc de présenter 3 exemples d’utilisations d’Open Refine — si ça peut vous donner d’autres idées.

Petite digression d’abord sur ce que je fais depuis un an à la BnF : je contribue, sur les notices déjà existantes, à l’évolution des données dans le contexte de la Transition bibliographique, et plus généralement à l’amélioration des données du catalogue — donc en gros, dès qu’on peut ajouter un peu de traitement de données, d’automatisations, j’aime bien mettre mon grain de sel. Un des gros projets en cours, c’est donc se rapprocher par étapes et à-coups du modèle FRBR (bon, LRM en fait maintenant, mais on verra ça une autre fois). Ce projet se décompose en un certain nombre de chantiers, selon la nature des documents, la nature des modifications, la nature des informations concernées, etc. La journée Systèmes & Données du 14 novembre devrait être l’occasion d’en évoquer certains.

Et il y a d’autres chantiers, liés à l’amélioration des données du catalogue « en général ». Parmi ceux-ci, je vais en évoquer un juste parce qu’il m’a donné l’occasion d’utiliser Open Refine (le chantier en question n’est pas terminé, d’ailleurs).

Le corpus est un lot de 34000 partitions : partie pour violon, partition pour chef d’orchestre, adaptation pour piano, etc. Le type de partition est précisé dans une zone en texte libre (la zone Intermarc 258$f, en l’occurrence).

Or il existe en parallèle une zone codée, permettant de décrire un type de partition : cette valeur permettrait ensuite de générer une facette, ou se retrouverait exploitable dans data.bnf.fr, etc.

referentiel type partition

Il faut donc l’alimenter à partir des informations textuelles.

Partir de 1500 valeurs distinctes pour arriver à 11.

Pour le logiciel Open Refine, il s’agit de clusteriser des valeurs (c’est-à-dire regrouper des chaînes de caractères distinctes dans un même groupe, auquel on affecte un même code). Ce n’est finalement pas différent de ce qu’a expliqué l’Abes sur son blog en 2014 à propos de la zone 200$bTexte imprimé. C’est également l’usage qui a été fait de ce même logiciel au SCD de Nice pour identifier les disciplines des thèses portant sur l’Afrique (la « discipline » dans une notice de thèse est une zone en texte libre).

Concernant ce chantier sur les partitions, voici les étapes suivies :

  1. extraction du catalogue d’un corpus de notices concernées, avec la zone textuelle source
  2. chargement dans Open Refine
  3. ajout d’une colonne « zone 258$f nettoyée » dupliquant la zone 258$f (ça permet de préserver la colonne contenant la valeur initiale : pour comparaison si les traitements successifs, trop violents, rendent le résultat final difficile à comprendre)
  4. Réalisation de plusieurs opérations de nettoyage et regroupement sur cette colonne, pour réduire le nombre de valeurs distinctes :
    1. rapprochements automatiques entre valeurs un peu différentes, en testant plusieurs algorithmes de clusterisation
      Le premier, le plus restrictif, peut être validé sans trop regarder : il rapproche les variantes d’accents, de majuscules et de ponctuation
      (et on passe en 2 secondes de 1500 valeurs à 1000)
      merge and recluster
    2. Utilisation des facettes, de Text Filter, pour identifier toutes les chaînes de caractère contenant par exemple « choeur », ou « voix », etc. pour attribuer une valeur commune à toutes ces lignes

On réexporte ensuite le résultat, sous forme d’un tableau à 2 colonnes :

  • Numéro de notice
  • Nouvelle valeur de la 009 pos.3

export_table

Fin du chantier
(restera évidemment à charger les données dans le catalogue, mais c’est pas moi qui m’en occupons)

Expérimenter les humanités numériques

02/10/2017
Ce livre vient de sortir, presque deux ans après l’appel à contribution
(dit comme ça, ça me semble incroyablement long, et pourtant je n’ai pas eu l’impression qu’il y ait eu des temps morts : seulement une succession de phases).
J’en profite tout de suite pour remercier très solennellement les trois autres coordinateurs pour m’avoir invité à contribuer à cette naissance, et les auteurs qui ont produit ce résultat.
Ce livre est un recueil de chapitres qui présentent une succession de retours d’expérience, que nous nous sommes efforcés d’organiser pour leur donner une cohérence dans le discours global que nous voulions tenir.
L’ensemble de l’ouvrage est disponible en libre accès sur le site des Presses Universitaires de Montréal, collection Parcours numériques. Certains chapitres ne sont même accessibles qu’en ligne pour des raisons purement éditoriales (longueur maximale d’un volume), et non liées à la qualité des textes.
La version papier est diffusée en parallèle (ainsi que les fichiers ePub et PDF).

Quelles « humanités numériques » ?

Au moment où ce projet commençait, il y avait pas mal de débats sur le sens à donner à cette expression. On voit moins souvent ces échanges à présent. C’est un débat que nous n’avons pas cherché à résoudre avec ce livre, estimant que notre rôle était ailleurs, sur les enjeux d’appropriation des outils numériques et des possibilités ouvertes, ou pour l’instant juste entrouvertes.
Les retours d’expérience permettent de rendre compte de l’utilisation d’un outil de travail qui peut intervenir à divers niveaux dans la conduite d’un projet scientifique, mais que nous n’avons pas fini de nous approprier.
Ce qui me semble ressortir particulièrement de la lecture des différents chapitres (puisque, n’en ayant rédigé aucun, en revanche je les ai beaucoup lus !) :
  • la diversité des projets : entre les chercheurs un peu seuls qui sont amenés à bricoler, et grands projets bénéficiant de financement ANR ou européens
  • le numérique intervenant selon les cas comme :
    • outil facilitateur
    • outil qui apparaît en cours de projet (avec évolution ou transformation du projet)
    • outil comme objectif du projet
  • l’intérêt de voir ainsi la science en train de se faire :
    pour moi, ce livre est pertinent aujourd’hui, pour rendre compte aux autres chercheurs (et plus largement aux citoyens) de ce à quoi peut ressembler la science aujourd’hui.
    Mais il le sera certainement, différemment, dans 10 ans (ou au-delà), pour être confronté à ce que sera l’usage du numérique à ce moment-là.
  • la complémentarité des métiers :
    les métiers de la documentation (bibliothèques incluses) sont censés être malmenés par l’irruption d’Internet, la facilité d’accès aux ressources, etc.
    Il est vrai que de nombreuses activités légitimes il y a 20 ans n’ont plus vraiment de pertinence. Mais c’est ce qui est fascinant aujourd’hui : voir se reconstruire la collaboration entre deux cultures professionnels, en revenir à ce qui fait le coeur et le sens de notre métier (chacun, bibliothécaire et chercheur) et renouveler les manières de travailler ensemble.

Making-of

La manière dont la coordination de l’ouvrage a été conduite aurait mérité un chapitre. Non pas parce que nous avons été particulièrement innovants (voire disruptifs !) ou efficace, mais parce que je ne sais pas comment font les autres : donc donner à lire la conception d’un ouvrage sur les humanités numériques, c’est aussi donner à voir la science en train de se faire, prendre le temps de décrire aussi cette activité-là.
Car nous avons tout fait à distance, avec des points plus ou moins réguliers mais surtout une grande diversité d’outils de communication et de travail collaboratif : ont été sollicités Skype, un pad, Google Drive, PBworks (qui propose une plate-forme de wiki). Pour la phase de relectures on est allé fureter du côté de SciencesConf (mais finalement non). Et les mails, bien sûr.
On peut en conclure qu’il nous a manqué un outil centralisateur, permettant de gérer un workflow de relecture et validations, d’échanges avec les auteurs et entre nous (puis avec l’éditeur), intégrer la question des financements.
Mais finalement le côté tâtonnant (non, pas « foutraque »), expérimental, est révélateur, et intéressant aussi.
Bref, c’était une expérience en soi, que j’ai adoré vivre.
Si en plus la suite nous apprend que nous avons eu raison de croire que ça en intéresserait d’autres, peut-être pourrons-nous envisager un tome 2 ?

Table des matières

    • Introduction, par Frédéric Clavert, Olivier Legendre, Dana Martin

Les outils personnels

L’outillage collectif

La gestion de projet