Alignement de wikidata avec le catalogue de la BnF

De Bibliopedia
Révision datée du 14 mars 2021 à 16:52 par Symac (discussion | contributions) (JSON)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Sauter à la navigation Sauter à la recherche

Alignement de Wikidata et du catalogue de la BnF avec OpenRefine[modifier le wikicode]

  • Auteur : Sylvain Machefert
  • Date : juillet 2017



Contexte[modifier | modifier le wikicode]

Conversation à l'origine de cette expérience

En juin 2017, la BnF a ouvert un serveur SRU permettant d'accéder aux données de son catalogue. Cette ouverture intervenait juste après les élections législatives françaises et a été l'occasion de faire un état des lieux de la couverture par le fichier d'autorité de la BnF des députés à partir de leurs fiches sur wikidata. La conversation lancée sur Twitter avec Étienne Cavalié de la BnF et reproduite ci-contre m'a donné envie d'en savoir plus et d'en profiter pour tester le serveur SRU de la BnF en le combinant à OpenRefine.

Identification sur Wikidata des députés n'ayant pas d'attribut "Identifiant BnF"[modifier | modifier le wikicode]

Chaque fiche wikidata pour un sujet donné comporte un certain nombres d'attributs avec pour chacun une ou plusieurs valeurs. Ces attributs sont des "propriétés" au sens wikidata, et il en existe plusieurs milliers. Parmi ces propriétés, de nombreuses concernent des identifiants d'autorité et parmi celles-ci, celle qui nous intéressent est la [https://www.wikidata.org/wiki/Property:P268 P268 : Identifiant bibliothèque nationale de France]. Elle permet d'aligner une fiche de personne sur wikidata avec la notice d'autorité en saisissant l'identifiant unique de la notice d'autorité sur le catalogue de la BnF.

Wikidata dispose d'un endpoint Sparql qui permet de faire des interrogations assez poussées sur le contenu de la base wikidata. La requête qui nous intéresse aujourd'hui est relativement simple (voir les exemples sur Wikidata pour se convaincre de la "relative" simplicité de celui-ci).

select ?depute ?nom ?idBnF ?ddn where {
?depute p:P39 ?statement.
?statement pq:P2937 wd:Q24939798.
OPTIONAL {?depute wdt:P268 ?idBnF} .
OPTIONAL {?depute wdt:P569 ?ddn} .
?depute rdfs:label ?nom.
FILTER (langMatches(lang(?nom), "fr"))}

Cliquez ici pour essayer

Cette requête retourne une liste de députés ayant pour "fonction" (P39) ?statement avec ?statement ayant pour qualificatif "législature" (P2937) : "15e législature de la Cinquième République française" (Q24939798). On récupère de manière optionnelle l'identifiant BnF (P268) et la date de naissance qui nous sera utile pour un contrôle manuel vis-à-vis des fichiers BnF propriété P569) et on affiche tout cela.

Enrichissement du fichier via SRU[modifier | modifier le wikicode]

À partir de là et avant que le travail décrit ici j'avais une liste de 477 députés (tous n'étaient pas encore correctement identifié comme députés de cette législature, on est bien à 577 aujourd'hui, restera à faire retourner le script), dont 381 sans notice d'autorité BnF signalé sur leur notice wikidata. J'ai extrait le fichier depuis le endpoint SPARQL au format CSV puis l'ai chargé dans openrefine. L'idée étant de compléter, pour les députés sans identifiant BnF, les informations disponibles avec le résultat des interrogations du catalogue SRU sur la chaîne nom prénom. Le processus suivi est le suivant (je ne détaille pas les opérations effectuées, les personnes intéressées trouveront le Json du projet à la fin de l'article).

  • Limitation aux députés dans identifiant BnF sur wikidata
  • Interrogation du serveur SRU de la BnF pour récupérer les autorités correspondant au champ nom/prénom de notre fichier source : URL supprimée en attente d'ouverture oficielle]/SRU?version=1.2&operation=searchRetrieve&query=(aut.type%20any%20"pep%20org")%20and%20(aut.accesspoint%20all%20"' + value.escape("url") + '")%20and%20(aut.status=validated) (compléments envoyés par E. Cavalié: il faudrait plutôt aut.accesspoint adj "nom prenom" (voire aut.accessoint adj "nom prenom annee de naissance"). "Adj" permet de chercher l'expression exacte, qui pour un nom de personne correspond à l'expression "Nom Prenom Date de naissance - Date de mort")
  • Analyse du nombre de résultats pour se limiter au lignes pour lesquelles le serveur ne retourne qu'un résultat, on ne s'embête pas avec les homonymies (même si on pourrait/devrait bien entendu...)
  • On transforme le résultat XML de la BnF en un json, plus facile à traiter dans OpenRefine.
  • On crée une colonne "BnF nom" en concaténant le nom et le prénom fourni par le serveur SRU pour comparer facilement avec le libellé côté wikidata
  • On crée une colonne "BnF date de naissance" pour vérifier facilement que c'est la même personne que sur wikidata
  • On crée une colonne "BnF bio" qui va encore une fois nous permettre de désambiguïser facilement.
  • Et enfin on crée une colonne Identifiant à partir du permalien ark proposé par la BnF. Wikidata a choisi d'utiliser pour identifiant des notices d'autorité BnF la partie située après

ark:/12148/cb dans les ark.

Une fois ces opérations effectuées, on se retrouve avec 39 enregistrements potentiellement intéressants, il reste à faire un contrôle manuel avant import. Le contrôle manuel permet d'exclure un certain nombre de notice qui selon toute vraisemblance sont des homonymes (pour cause de dates de naissance grandement incompatible en particulier).

Alimentation de Wikidata[modifier | modifier le wikicode]

La liste d'équivalence Entrée wikidata ←→ Id BnF peut être chargée assez simplement à l'aide de l'outil QuickStatements qui permet d'envoyer en série des instructions de création de données à wikidata à partir d'un fichier tabulé.

Compléments[modifier | modifier le wikicode]

  • Plus d'exemples d'utilisation d'OpenRefine sur OpenRefine : exemples
  • Fichier JSON des opérations pour OpenRefine, à appliquer via Undo/Redo > Apply :