Nettoyage de l’identifiant BnF dans Wikidata

Wikidata est une base de connaissance, structurée, multilingue et libre. Elle centralise des informations utiles aux projets Wikimedia, dont le plus connu est l’encyclopédie Wikipédia. Wikidata regroupe ainsi des données sur de nombreux sujets : entités géographiques, personnalités de tous domaines, œuvres d’art, articles scientifiques, etc. Une entrée dans la base de données de Wikidata est appelée un « élément », Wikidata en comptant près de 40 millions aujourd’hui.

Logo de Wikidata.

Un des intérêts de cette base de connaissance est de faire le lien avec d’autres sites et d’autres bases de données. Par exemple, à partir de l’élément Wikidata consacrée à Cécile Corbel, on peut naviguer vers son profil Instagram, sa fiche sur l’Internet Movie Database (IMDb), ou encore vers la notice correspondante dans le catalogue général de la Bibliothèque nationale de France (BnF). Nous allons voir ici comment sont fait ces liens et comment en améliorer la qualité.

Identifiants

Dans une base de données, chaque entrée possède un identifiant unique qui permet de distinguer de façon certaine une entrée des autres. Par exemple, le mot « Aube » peut désigner un cours d’eau, un département ou encore des communes de la Moselle et de l’Orne, etc. Il est donc nécessaire de pouvoir différencier ces concepts, ce que l’ont fait grâce à un identifiant. Cet identifiant est immuable, c’est-à-dire qu’il n’évolue pas, même si l’entrée à laquelle il est rattaché change de nom. Il ne porte également pas d’information. Enfin, le format d’un identifiant est propre à chaque base de données.

Dans Wikidata, l’identifiant d’un élément débute par la lettre « Q », suivie d’un nombre. Par exemple, l’identifiant de l’élément sur Frédéric Courant est « Q3089735 ». L’identifiant d’une propriété, qui permet de caractériser les éléments, débute par la lettre « P », suivie d’un nombre. Ainsi, la propriété « identifiant Bibliothèque nationale de France », qui lie un élément Wikidata à une entrée du catalogue de la BnF, a pour identifiant « P268 ».

Dans le catalogue de la BnF, les identifiants sont au format Archival Resource Key (ARK). Par exemple, l’identifiant de l’entrée sur Frédéric Courant est ark:/12148/cb14089584s. En simplifiant :

Une explication détaillée sur le format ARK est disponible ici (en anglais).

Wikidata stocke les deux dernières informations dans sa propriété P268. Ainsi, l’élément « Q3089735 » de Wikidata a pour la propriété « P268 » la valeur « 14089584s ».

Qualité des données

À l’occasion de la WikidataCon, Alessandro Piscopo a présenté, lors de sa conférence intitulée « Wikidata quality: a data consumers’ perspective », différentes dimensions possibles pour évaluer la qualité des données :

Comme on va travailler sur la propriété qui fait le lien entre Wikidata et la BnF, la dernière dimension citée est la première concernée. Toutefois, l’approche va se faire essentiellement par la première dimension, l’exactitude, en détectant des erreurs dans Wikidata.

À chaque propriété Wikidata est associé un ensemble de « contraintes ». Une contrainte est la formalisation d’une règle que doit suivre chaque utilisation d’une propriété. Par exemple, un être humain doit avoir sa date de naissance antérieure à sa date de décès. Chaque propriété dispose d’un rapport de violations de contraintes, complété automatiquement, pointant vers chaque élément ne respectant pas une contrainte donnée. Voici le rapport de violations de contraintes de la propriété P268 sur Wikidata.

On va toutefois aller plus loin que ce rapport, qui présente certaines limites. Pour cela, on va utiliser le service de requêtes SPARQL de Wikidata, qui dispose d’une aide détaillée. Celui-ci permet d’interroger le contenu de Wikidata, avec des demandes qui peuvent être complexes.

Règles

Éléments Wikidata avec un format de l’identifiant BnF incorrect

La première chose à faire est de vérifier que le format de l’identifiant BnF est respecté. Il doit pour cela vérifier l’expression régulière \d{8}[0-9bcdfghjkmnpqrstvwxz] (8 chiffres suivis du caractère de la clé). Voici la requête SPARQL listant tous les éléments Wikidata ne respectant pas cette règle :

SELECT ?item ?bnf
WHERE {
  ?item p:P268/ps:P268 ?bnf .
  FILTER (!REGEX(?bnf, "\\d{8}[0-9bcdfghjkmnpqrstvwxz]")) .
}

Requête #1 : format de l’identifiant BnF incorrect (valeur)

Toutefois, cette requête, tout comme le rapport de violations de contraintes, ne vérifie le format de l’identifiant BnF que lorsqu’il est utilisé comme valeur directe d’une propriété. Il faut donc vérifier son format lorsqu’il est utilisé respectivement en qualificatif et en référence d’une déclaration :

SELECT ?item ?property ?bnf
WHERE {
  ?item ?property ?statement .
  ?statement pq:P268 ?bnf .
  FILTER (!REGEX(?bnf, "\\d{8}[0-9bcdfghjkmnpqrstvwxz]")) .
}

Requête #2 : format de l’identifiant BnF incorrect (qualificatif)

SELECT ?item ?property ?bnf
WHERE {
  ?item ?property ?statement .
  ?statement prov:wasDerivedFrom/pr:P268 ?bnf .
  FILTER (!REGEX(?bnf, "\\d{8}[0-9bcdfghjkmnpqrstvwxz]")) .
}

Requête #3 : format de l’identifiant BnF incorrect (référence)

À noter que ces requêtes ne vérifient pas la validité de la clé associée à l’identifiant.

Éléments Wikidata avec plus d’un identifiant BnF

Chaque élément Wikidata représente un seul concept, auquel ne devrait être associé qu’un seul identifiant BnF (il peut toutefois y avoir des cas à la marge qui sont discutables, mais ce n’est pas l’objet de ce billet). Cette requête, qui se limite aux être humains, nous montre pourtant que ce n’est pas le cas :

SELECT ?item (COUNT(DISTINCT ?bnf) AS ?count)
WHERE {?item wdt:P31 wd:Q5 ; wdt:P268 ?bnf . }
GROUP BY ?item
HAVING (?count >= 2)
ORDER BY DESC(?count) ?item

Requête #4 : éléments Wikidata avec plus d’un identifiant BnF

Identifiants BnF utilisés plusieurs fois

Un même identifiant BnF ne devrait être utilisé que par un seul élément Wikidata. Cette requête, également limitée aux êtres humains, nous montre que ce n’est non plus pas le cas :

SELECT ?bnf (GROUP_CONCAT(?item) AS ?items) (COUNT(*) AS ?count)
WHERE { ?item wdt:P31 wd:Q5 ; wdt:P268 ?bnf . }
GROUP BY ?bnf
HAVING (?count >= 2)
ORDER BY DESC(?count) ?bnf

Requête #5 : identifiants BnF utilisés plusieurs fois

Éléments Wikidata avec la valeur de l’identifiant BnF utilisé dans une autre propriété

Lorsque les informations sur un élément Wikidata sont saisies à la main, une erreur de copier-coller peut facilement arriver, et parfois le même identifiant est utilisé pour deux propriétés différentes. Il est facile de lister ces cas avec cette requête :

SELECT ?item ?property
WHERE {
  ?item wdt:P268 ?id ; ?property ?id .
  FILTER(?property != wdt:P268) .
}
ORDER BY ?property

Requête #6 : identifiant BnF utilisé dans une autre propriété

Éléments Wikidata avec un identifiant BnF et une déclaration sourcée par un autre identifiant BnF

Lorsque l’on source une déclaration dans Wikidata, c’est une bonne pratique de renseigner l’identifiant externe utilisé lorsque le cas s’y prête. En effet, cela permet, lors de la correction d’un identifiant externe, de nettoyer l’élément en repérant facilement les déclarations sourcées avec cet identifiant erroné et donc à corriger. Toutefois, il peut y avoir des oublis. Voici la requête, limitée aux être humains, qui permet de les repérer (avec potentiellement des faux positifs) :

SELECT ?item ?itemLabel ?property ?bnf_s ?bnf_r
WHERE {
  ?item wdt:P31 wd:Q5 ; wdt:P268 ?bnf_s .
  ?item ?property ?s . ?s prov:wasDerivedFrom/pr:P268 ?bnf_r .
  FILTER(?bnf_s != ?bnf_r) .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }
}
ORDER BY ?item ?property

Requête #7 : éléments Wikidata avec un identifiant BnF et une référence utilisant un autre identifiant BnF

Éléments Wikidata avec un identifiant Bnf et des propriétés manquantes

Chaque élément Wikidata devrait avoir l’une de ces deux propriétés renseignées : « nature de l’élément » (P31) ou « sous-classe de » (P279). Cela permet d’indiquer le type de concept représenté par l’élément. Par exemple, les être humains ont pour « nature de l’élément » la valeur « être humain » (Q5). Voici la requête qui liste les éléments avec un identifiant BnF et pour lesquels ces deux propriétés sont absentes :

SELECT ?item ?itemLabel
WHERE {
  ?item wdt:P268 [] .
  FILTER NOT EXISTS { ?item wdt:P31 [] . } .
  FILTER NOT EXISTS { ?item wdt:P279 [] . } .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en" . }
}
ORDER BY DESC(xsd:integer(SUBSTR(STR(?item), 33)))

Requête #8 : éléments Wikidata avec un identifiant BnF et sans P31 ou P279

Écrivains français sans identifiant BnF dans Wikidata

On peut s’attendre à ce que tous les écrivains français soient présents dans le catalogue de la BnF et aient donc un identifiant BnF dans Wikidata. Sans surprise, ce n’est évidemment pas le cas :

SELECT DISTINCT ?item ?itemLabel
WHERE {
  ?item wdt:P31 wd:Q5 ; wdt:P27 wd:Q142 ; wdt:P106/wdt:P279* wd:Q36180 .
  MINUS { ?item wdt:P268 [] } .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }
}
ORDER BY xsd:integer(SUBSTR(STR(?item), 33))

Requête #9 : écrivains français sans identifiant BnF

À suivre…

Nous avons vu plusieurs moyens de détecter des erreurs dans Wikidata. Toutefois, il faut bien réaliser que seules certaines erreurs sont détectées. Par exemple, on ne peut pas se rendre compte qu’un identifiant est mal attribué, sauf s’il apparaît sur un autre élément. D’autre part, la correction des erreurs n’a été que survolée. Celle-ci est la plupart du temps triviale, mais peut nécessiter de fusionner des pages Wikipédia et des éléments Wikidata, ou au contraire de les séparer, etc. L’erreur peut également être du côté de la BnF (il suffit alors d’utiliser la fonction de signalement d’erreur disponible sur chaque notice). Il faudrait également mesurer le travail accompli : nombre total d’éléments Wikidata avec un identifiant BnF, nombre d’éléments détectés par chaque règle, nombre d’éléments corrigés, etc.

Par ailleurs, lancer ces requêtes manuellement peut être fastidieux et on peut imaginer des outils pour simplifier le travail. Ainsi, sur la thématique des députés, j’ai réalisé un tableau de bord qui donne des statistiques et vérifie une vingtaine de règles dans Wikidata. Les données sont mises à jour régulièrement et l’interface permet d’accéder rapidement aux éléments concernés, ainsi qu’aux autres bases de données de cette thématique.

Enfin, la Bibliothèque nationale de France organise un hackathon ce week-end des 25 et 26 novembre 2017, ce qui est une bonne occasion de découvrir et réutiliser ses données, notamment grâce à son nouveau portail api.bnf.fr 🙂