Matching BnF and Wikidata video games using Dataiku DSS

Vous pouvez lire ce billet en français : Alignement des jeux vidéo de la BnF avec Wikidata grâce à Dataiku DSS.


While the National Library of France (Bibliothèque nationale de France, BnF) collections obviously comprise numerous books, newspapers or manuscripts, they also contain elements from more recents technologies, like video games. According to its SPARQL endpoint, the BnF’s general catalogue has information on over 4,000 video games. At the same time, Wikidata has information about 36,000 video games, with only 60 linked to a BnF record in early February 2019!

In this blog post, we will see how we can improve this linking, using the software Dataiku Data Science Studio (Dataiku DSS), the objective being to correctly add the maximum number of BnF ids to video games items on Wikidata.

Dataiku DSS installation

The installation and the use of Dataiku DSS are outsite the scope of this post; however, here is some information that can be useful to start with this tool.

You can download the free edition of Dataiku DSS, which is more than enough in our case, from Dataiku website, following the instructions corresponding to your environment (for example, I use Dataiku DSS in the provided virtual machine, and access it through my favorite web browser).

You need to install the SPARQL plugin (presented in this post):

On the usage of Dataiku DSS, the two first tutorials offered by Dataiku should be sufficient to understand this post.

For the next steps, it is assumed that you have created a new project in Dataiku DSS.

Data from Wikidata

Data import

From Wikidata, we import the video games which have a publication date (by keeping only the oldest one for each game) and do not yet have a BnF id.

In the Flow of your project, add a new dataset Plugin SPARQL. Enter the URL of the SPARQL endpoint of Wikidata:

https://query.wikidata.org/sparql

Then the following SPARQL query:

SELECT ?item ?itemLabel (MIN(?year) AS ?year) {
  ?item wdt:P31 wd:Q7889 ; wdt:P577 ?date .
  BIND(YEAR(?date) AS ?year) .
  FILTER NOT EXISTS { ?item wdt:P268 [] } .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en,fr" . }
}
GROUP BY ?item ?itemLabel
HAVING (?year > 1)

Retrieve the data. Feel free to play with it, for example by displaying the number of video games by year of publication.

Data preparation

Using the Dataiku DSS recipe Prepare, we prepare the retrieved data.

The main steps of the preparation are:

Data from BnF

Data import

Similarly, we import video games from BnF. Create a new dataset Plugin SPARQL, with the URL of the SPARQL endpoint of the BnF catalogue:

https://data.bnf.fr/sparql

With the following SPARQL query:

SELECT DISTINCT ?item ?itemLabel ?year
WHERE {
  ?item <http://xmlns.com/foaf/0.1/focus> ?focus ; <http://www.w3.org/2004/02/skos/core#prefLabel> ?label .
  ?focus <http://data.bnf.fr/ontology/bnf-onto/subject> "Informatique" ;
    <http://data.bnf.fr/ontology/bnf-onto/subject> "Sports et jeux" ;
    <http://data.bnf.fr/ontology/bnf-onto/firstYear> ?year .
  FILTER NOT EXISTS { ?focus <http://purl.org/dc/terms/description> "Série de jeu vidéo"@fr . } .
  FILTER NOT EXISTS { ?focus <http://purl.org/dc/terms/description> "Série de jeux vidéo"@fr . } .
  BIND(STR(?label) AS ?itemLabel) .
}

Note that, unlike Wikidata, what is a video game is only indirectly determined in BnF records. We also need to filter the video game series by two different filters due to the inconsistencies in the BnF data.

Data preparation

Labels of video games from the BnF’s catalogue finish by the string : jeu vidéo. We need to remove it so the two data sets can correctly match. For that, in the preparation recipe, we add a step to replace this string by an empty string (as for the preparation of the id).

Then, we proceed as for Wikidata:

First filtering

We want to filter BnF ids that are already present in Wikidata, in order to prevent a BnF id from being used on several Wikidata elements.

To do so, we start by retrieving BnF ids existing in Wikidata, using a new dataset Plugin SPARQL, with the address of the SPARQL endpoint of Wikidata and the query that returns all used BnF ids in Wikidata:

SELECT DISTINCT ?bnf_id_to_filter WHERE { [] wdt:P268 ?bnf_id_to_filter . }

Then, we join the two datasets bnf_video_games_prepared and bnf_ids using the recipe Join with. The default engine of Dataiku DSS can’t do a full outer join directly to filter out at once the lines that we want to remove. The trick is to do a left outer join. We start by keeping all the lines from the first dataset, by possibly retrieving the information from the second dataset if a match exists (here, we only retrieve the identifier in the second dataset):

Then, in the Post-filter part of the recipe, we keep only the lines from the first dataset for which no match was found, i. e. for which the column bnf_id_to_filter is empty after the join.

The result of the recipe is the set of video games from BnF, retrieved and prepared, filtered from those with an id already present in Wikidata.

Data matching

Using the recipe Join with, we combine the two prepared datasets into one unique dataset. We use an inner join with two join conditions:

The normalization of labels allows us to match labels that have only a few differences in their format (capital letters, accents, spaces, etc.) between BnF and Wikidata.

The year of publication makes it possible to distinguish video games with identical titles but released several years apart. For example, there are two games called Doom: one published in 1993 and the other one in 2016.

Data cleaning

When you look at the data, you can see that there are duplicates. For example, there are several Hook video games released in 1992, with 3 ids in Wikidata and 2 in BnF. BnF also seems to have 2 records on the same game, Parasite Eve, released in 1998. After verification, it appears that the series is not categorized as such in the BnF catalogue. Rather than inserting incorrect data, we filter it out.

We start by building two datasets, each representing games having their id (respectively from BnF and Wikidata) appearing exactly one time after the matching. To do so, we use the recipe Group, grouping video games by id.

In the Post-filter part of each recipe Group, we keep only ids that appear exactly one time.

Then, we do two successive intern joins from the combined data (video_games_joined) with the two datasets (video_games_grouped_by_bnf_id and video_games_grouped_by_wd_id) that we just created. It is then certain that the retained lines no longer contain duplicates in the identifiers.

Data import into Wikidata

After the cleaning, we want to import the data into Wikidata. For that, we put them in CSV format, as expected by QuickStatements:

Dataiku DSS allows you to export data in CSV format. The last step is to copy-paste the content of the exported file into QuickStatements, which gives us:

Outcomes

In a few clicks, we imported more than 2,000 BnF ids of video games into Wikidata. However, the work is not finished!

Alignement des jeux vidéo de la BnF avec Wikidata grâce à Dataiku DSS

You can read this post in English: Matching BnF and Wikidata video games using Dataiku DSS.


Si les collections de la Bibliothèque nationale de France (BnF) comportent évidemment de nombreux livres, imprimés, périodiques ou encore manuscrits, elles se composent également d’éléments issus de techniques plus récentes, comme les jeux vidéo. D’après son point d’accès SPARQL, le catalogue général de la BnF a des informations sur un peu plus de 4000 jeux vidéo. Dans le même temps, Wikidata possède des informations sur plus de 36 000 jeux vidéo, dont seulement 60 (début février 2019) ont un lien vers une notice de la BnF !

Dans ce billet, on va voir comment améliorer ce maillage à l’aide du logiciel Dataiku Data Science Studio (Dataiku DSS), l’objectif étant d’ajouter, de manière correcte, le maximum d’identifiants BnF aux éléments Wikidata sur les jeux vidéo.

Installation de Dataiku DSS

L’installation et la prise en main de Dataiku DSS sont en-dehors du cadre de ce billet ; voici toutefois quelques informations qui pourront vous être utiles.

Vous pouvez télécharger la version gratuite de Dataiku DSS, amplement suffisante dans notre cas, sur le site de Dataiku, en suivant les instructions adaptées à votre environnement (par exemple, j’utilise Dataiku DSS dans la machine virtuelle proposée, en y accédant par mon navigateur web préféré).

L’installation du plugin SPARQL (présentation détaillée dans ce billet, en anglais) est nécessaire :

En ce qui concerne la prise en main de Dataiku DSS, suivre les deux premiers tutoriels proposés par Dataiku devrait être suffisant pour comprendre ce billet.

Pour la suite, on suppose que vous avez créé un nouveau projet dans Dataiku DSS.

Données de Wikidata

Import des données

On récupère les jeux vidéo dans Wikidata qui ont une année de publication renseignée (en ne conservant que la plus ancienne pour chaque jeu) et n’ayant pas encore d’identifiant BnF renseigné.

Dans le Flow de votre projet, ajoutez un nouveau dataset Plugin SPARQL. Renseignez l’URL du point d’accès SPARQL de Wikidata :

https://query.wikidata.org/sparql

Renseignez la requête SPARQL suivante :

SELECT ?item ?itemLabel (MIN(?year) AS ?year) {
  ?item wdt:P31 wd:Q7889 ; wdt:P577 ?date .
  BIND(YEAR(?date) AS ?year) .
  FILTER NOT EXISTS { ?item wdt:P268 [] } .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en,fr" . }
}
GROUP BY ?item ?itemLabel
HAVING (?year > 1)

Récupérez les données. Profitez-en pour les manipuler, par exemple en affichant le nombre de jeux vidéo par année de publication.

Préparation des données

Grâce à la recette Prepare de Dataiku DSS, on prépare les données récupérées.

Les principales étapes de la préparation sont les suivantes :

Données de la Bibliothèque nationale de France

Import des données

De même, on importe les jeux vidéo de la BnF. Créez un nouveau dataset Plugin SPARQL, avec l’URL du point d’accès SPARQL du catalogue de la BnF :

https://data.bnf.fr/sparql

Puis avec la requête SPARQL suivante :

SELECT DISTINCT ?item ?itemLabel ?year
WHERE {
  ?item <http://xmlns.com/foaf/0.1/focus> ?focus ; <http://www.w3.org/2004/02/skos/core#prefLabel> ?label .
  ?focus <http://data.bnf.fr/ontology/bnf-onto/subject> "Informatique" ;
    <http://data.bnf.fr/ontology/bnf-onto/subject> "Sports et jeux" ;
    <http://data.bnf.fr/ontology/bnf-onto/firstYear> ?year .
  FILTER NOT EXISTS { ?focus <http://purl.org/dc/terms/description> "Série de jeu vidéo"@fr . } .
  FILTER NOT EXISTS { ?focus <http://purl.org/dc/terms/description> "Série de jeux vidéo"@fr . } .
  BIND(STR(?label) AS ?itemLabel) .
}

Notez que, contrairement à Wikidata, on ne détermine qu’indirectement ce qui est un jeu vidéo dans les notices de la BnF. On est également obligé de filtrer les séries de jeux vidéo, par deux filtres différentes du fait de l’inconsistance des données de la BnF.

Préparation des données

Les libellés des jeux vidéo du catalogue de la BnF se terminent par la chaîne : jeu vidéo. Il faut l’enlever pour aligner correctement les deux jeux de données. Pour cela, dans la recette de préparation, on ajoute une étape pour remplacer cette chaîne par une chaîne vide (comme pour la préparation de l’identifiant).

Ensuite, on procède comme pour Wikidata :

Premier filtrage

On filtre les identifiants BnF qui sont déjà présents dans Wikidata, dans le but d’éviter qu’un identifiant BnF ne soit utilisé sur plusieurs éléments Wikidata.

Pour cela, on commence par récupérer les identifiants BnF utilisés dans Wikidata à l’aide d’un nouveau dataset Plugin SPARQL. On y met l’adresse du point d’accès SPARQL de Wikidata et la requête qui permet de récupérer tous les identifiants BnF utilisés :

SELECT DISTINCT ?bnf_id_to_filter WHERE { [] wdt:P268 ?bnf_id_to_filter . }

Ensuite, on joint les deux datasets bnf_video_games_prepared et bnf_ids à l’aide de la recette Join with. Le moteur par défaut de Dataiku DSS ne permet pas de faire directement une jointure externe « complète » pour filtrer d’un coup les lignes qu’on ne veut pas conserver. L’astuce consiste à faire une jointure externe « à gauche ». Dans un premier temps, on conserve toutes les lignes du premier dataset, en récupérant éventuellement les informations du second dataset si une correspondance existe (ici, on ne récupère que l’identifiant dans le second dataset) :

Dans un second temps, dans la partie Post-filter de la recette, on conserve les lignes du premier dataset pour lesquelles aucune correspondance n’a été trouvée, c’est-à-dire pour lesquelles la colonne bnf_id_to_filter n’est pas renseignée après la jointure.

Le résultat de la recette est l’ensemble des jeux vidéo de la BnF, récupérés et préparés, filtrés de ceux ayant un identifiant déjà utilisé dans Wikidata.

Croisement des données

À l’aide de la recette Join with, on joint les deux datasets préparés pour ne plus en n’avoir qu’un seul. On fait une jointure interne (inner join) avec deux conditions de jointure :

La normalisation des libellés permet de faire correspondre des libellés qui ont seulement quelques différences de forme (majuscules, accents, espaces, etc.) entre la BnF et Wikidata.

L’année de publication permet de différencier des jeux vidéo avec des titres identiques mais sortis à plusieurs années d’écart. Par exemple, il y a deux jeux nommés Doom : l’un publié en 1993 et l’autre en 2016.

Nettoyage des données

En parcourant les données, on voit qu’il y a des doublons. Par exemple, il y a plusieurs jeux vidéo Hook sortis en 1992, dont on trouve 3 identifiants dans Wikidata et 2 dans la BnF. La BnF semble également posséder 2 fiches sur le même jeu, Parasite Eve, sorti en 1998. Après vérification, il s’avère que la série n’est pas catégorisée comme telle dans le catalogue de la BnF. Plutôt que d’insérer des données incorrectes, on les filtre.

On commence par construire deux datasets, chacun représentant les jeux dont l’identifiant (respectivement Bnf et Wikidata) n’apparaît qu’une seule fois après notre croisement. Pour cela, on utilise la recette Group, en groupant les jeux vidéo par identifiant.

Dans les parties Post-filter de chacune des recettes Group, on ne conserve que les identifiants qui n’apparaissent exactement qu’une seule fois.

Ensuite, on fait deux jointures internes successives à partir des données croisées (video_games_joined) avec les deux datasets (video_games_grouped_by_bnf_id puis video_games_grouped_by_wd_id) que l’on vient de créer. On est alors certain que les lignes conservées ne contiennent plus de doublon dans les identifiants.

Import des données dans Wikidata

Après nettoyage, on importe les données dans Wikidata. Pour cela, on les met au format CSV attendu par QuickStatements :

Dataiku DSS permet d’exporter les données au format CSV. Il n’y a plus qu’à copier-coller le contenu du fichier exporté dans QuickStatements, ce qui donne :

Résultats

En quelques clics, on a importé plus de 2000 identifiants BnF de jeux vidéo dans Wikidata. Toutefois, le travail n’est pas terminé !

Alignement du vocabulaire OLAC des jeux vidéo avec Wikidata

Cet article est une traduction libre de l’article Linking the OLAC Video Game Vocabulary with Wikidata, écrit par Tracy Hoffmann (diggr Team) et Peter Chan (Stanford University Libraries), et publié le 29 janvier 2019 sous licence CC BY 4.0.


Wikidata est une base de connaissances collaborative sous licence libre que chacun peut modifier. Depuis sa création en 2012, c’est devenu une base de connaissances et une infrastructure largement utilisées. Dans ce billet, nous décrivons pourquoi et comment nous importons le vocabulaire OLAC des jeux vidéo dans Wikidata.

Motivation

L’OLAC Inc. (Online Audiovisual Catalogers, catalogueurs en ligne de l’audiovisuel) est une organisation américaine pour les catalogueurs intéressés par tout type de documents non imprimés. Elle a présenté l’OLAC Video Game Genre Vocabulary (vocabulaire OLAC des genres du jeu vidéo) en 2018 pour aider au catalogage des jeux vidéo. Le groupe de travail CAMMS/SAC/GFIS/Video game de l’OLAC a fait des recherches sur plus de 200 termes de genres du jeu vidéo dont l’inclusion dans le vocabulaire final a été envisagée. La liste des 66 termes approuvés dans le vocabulaire OLAC des genres du jeu vidéo, leurs recommandations d’utilisation, ainsi que les entrées MARC correspondantes pour ces termes peuvent être trouvées sur le site web de l’OLAC, dans la catégorie Cataloging Resources : OLAC video game genre vocabulary. Cet ensemble de vocabulaire maîtrisé pour le jeu vidéo est soutenu par la bibliothèque du Congrès et devrait être utilisé par tous les catalogueurs des bibliothèques aux États-Unis. En l’ajoutant dans Wikidata, nous allons le mettre en visibilité d’une plus large audience, et également faciliterons le maillage des jeux vidéo.

Première partie : proposition de la propriété dans Wikidata

Pour lier les termes du vocabulaire avec les items Wikidata existants, il nous fallait une propriété définie comme identifiant externe. Les propriétés sont proposées et discutées dans une rubrique spécifique. Un modèle avec des informations sur le vocabulaire et quelques exemples a dû être renseigné. Ensuite, nous avons attendu avec curiosité les retours de la communauté, dans le but d’aboutir à un consensus. Après 7 jours, la proposition de la propriété avait 8 soutiens. C’était donc un résultat clair qui a abouti à la création de la propriété vocabulaire OLAC du jeu vidéo (P6352).

Deuxième partie : import et alignement

Le vocabulaire OLAC des genres du jeu vidéo est disponible dans l’Open Metadata Registry. Après téléchargement, puis nettoyage et préparation des données avec Open Refine, les données ont été transformées au format CSV requis pour l’import. Ainsi, on a :

Avec ceci, un catalogue Mix’n’match a été créé. « Mix’n’match peut lister les entrées de bases de données externes et permet aux utilisateurs de les relier à des items Wikidata » (source). Après un import réussi, les données ont pu être alignées via l’interface du navigateur. Dans le cas où il n’y avait aucun candidat possible, de nouveaux items Wikidata ont été créés.

L’alignement des 66 termes a été rapide mais, comme l’alignement d’un vocabulaire est rarement sans ambiguïté, il y a encore beaucoup de choses à améliorer. Certains problèmes ont déjà été identifiés et sont discutés au sein de la communauté Wikidata.

Appel à participation

Il y a des groupes thématiques dans Wikidata. L’un d’eux est le groupe de travail sur les jeux vidéo. Ce wiki-projet est le lieu pour entrer en contact avec la communauté du jeu vidéo dans Wikidata. Dans les pages de discussions, des questions, des propositions ou des sources peuvent être publiées. Jusqu’à présent, beaucoup de choses ont été accompli par quelques contributeurs très ambitieux de ce groupe : plus de 50 identifiants externes pour les jeux et 10 pour les matériels et les logiciels liés au jeu vidéo ont été créés, reliant de nombreuses bases de données spécialisées. Mais il reste encore beaucoup à faire. Par exemple, d’autres catalogues Mix’n’match attendent encore d’être alignés.

Wikidata est une ressource formidable pour les informations sur les jeux vidéo, en particulier de manière grandissante pour la recherche sur les jeux vidéo car de plus en plus de données y sont agrégées et modélisées. La participation active de la communauté scientifique est très appréciée et aidera à rendre Wikidata encore plus utile pour les chercheurs.

Si vous avez des idées de donation de données ou d’alignement avec d’autres bases de données externes, n’hésitez pas à nous contacter ou à entrer directement en contact avec la communauté Wikidata.

Cet autre article sur les jeux vidéo dans Wikidata pourrait vous intéresser : Wikidata and the sum of all video games − 2018 edition (la traduction en français est disponible ici : Wikidata et la somme de tous les jeux vidéo — Édition 2018).