OpenRefine au service de BACON : quelle évaluation pour les fichiers KBART ? [4] – Dispositif CERCLES dans le cadre de BACON

[Lire le billet qui introduit cette série « OpenRefine au service de BACON : quelle évaluation pour les fichiers KBART ? »]

Développer des outils et les mettre à la disposition du réseau afin de répondre à vos besoins est l’une des principales missions de l’Abes. Dans le cadre du projet Bacon, l’idée de mettre entre vos mains une partie du travail mené est née avec le projet. Celui-ci étant suffisamment mûr, le temps est venu d’ouvrir ce que nous avons choisi d’appeler les CERCLES-BACON.

Le premier d’entre eux portera sur l’éditeur BREPOLS. Avant d’exposer les modalités de dépôt des candidatures, revenons sur les principes qui prévalent à un tel dispositif.

Le dispositif CERCLES-BACON

CERCLES permet la mutualisation des compétences du réseau au service de la qualité du catalogue. Organisé sous la forme de chantiers qualités, l’objectif est de s’attaquer à des corpus dont les notices ne sont pas toujours de qualité satisfaisante.
Avec BACON la thématique reste la même, améliorer la qualité des métadonnées, circonscrite de fait aux ressources électroniques. Avec quelques nuances :

  • les métadonnées KBART sont des métadonnées de signalement et de gestion des accès. Elles sont moins riches et moins complexes que les métadonnées descriptives contenues dans les notices du SUDOC ;
  • la participation du fournisseur des métadonnées KBART est une condition sine qua non. En aucun cas les métadonnées ne sont corrigées par l’évaluateur, qui intervient seulement afin de produire un rapport d’erreurs. Ce rapport est ensuite transmis au fournisseur, qui a à sa charge la correction du fichier. De cette façon, la qualité des données est améliorée à la source et profite à l’ensemble de la chaîne.

CERCLES-BACON est initié pour plusieurs raisons.
Avant tout il s’agit de s’appuyer sur l’expertise d’un catalogueur qui, de par son expérience, sera en mesure de mener à bien l’évaluation des fichiers KBART dans les moindres détails. La simplicité du contenu des fichiers cache parfois des problématiques plus complexes, telles que les métarevues.
Par ailleurs, l’évaluateur qui aura fait le choix de travailler avec nous aura accès aux ressources, ce qui lui permettra de dénouer certains cas. Car, contrairement à l’Abes, son établissement en aura fait l’acquisition. A cet égard, la relation de confiance établie auprès de l’éditeur permettra de favoriser la prise en compte des demandes de corrections.
Enfin, l’occasion est ainsi donnée de former des membres du réseau à l’utilisation d’outils qui, s’ils ne le sont déjà, deviendront certainement nécessaires dans la trousse à outils du bibliothécaire : OpenRefine, webservices, etc…

L’évaluateur : activités et compétences

Pour l’évaluateur, plusieurs tâches seront à accomplir. Contacter l’éditeur, lui expliquer le principe du partenariat ainsi que la recommandation, récupérer les fichiers et les évaluer, lui en communiquer le résultat et procéder aux chargements. Autant de compétences techniques et relationnelles, que la formation et le suivi proposés par l’Abes permettront de mettre en œuvre au cours du premier trimestre 2017.

Les conditions d’accès au dispositif sont les suivantes :

  • l’établissement dont vous dépendez doit avoir souscrit à des ressources auprès de l’éditeur BREPOLS ;
  • vous devez disposer d’un accès au registre ISSN ;
  • vous devez avoir la possibilité, avec ou sans l’intervention de votre DSI, d’installer OpenRefine sur votre poste de travail.

Les compétences de l’évaluateur devront être les suivantes :

  • familiarité avec la documentation électronique ;
  • notions en UNIMARC ;
  • notions en catalogage (WinIBW) ;
  • niveau intermédiaire en informatique ;
  • bon relationnel ;
  • anglais technique : lu.

La connaissance de la recommandation KBART n’est pas un prérequis obligatoire. Pour autant, elle devra être acquise au lancement du CERCLES.

La charge de travail est estimée à 1/2 ETP durant les deux premières semaines, formation comprise, puis à 1 journée par mois. Le partenariat établi entre l’établissement et l’Abes fera l’objet d’un acte d’engagement.

Si vous êtes intéressé(e) par ce projet et que vous souhaitez rejoindre le premier des CERCLES-BACON, n’hésitez plus ! Il est dès à présent possible de nous contacter en postant une demande sur le guichet Bacon.

Cyril Leroy

OpenRefine au service de BACON : quelle évaluation pour les fichiers KBART ? [3] – Cas pratique

[Lire le billet qui introduit cette série « OpenRefine au service de BACON : quelle évaluation pour les fichiers KBART ? »]

Dans le cadre de l’accompagnement des éditeurs scientifiques francophones à la mise en œuvre de la recommandation KBART, les fichiers sont évalués par l’Abes à l’aide d’OpenRefine.

Les tests menés sont de différents types : syntaxiques et sémantiques. Les premiers vérifient la conformité du format des métadonnées au regard des règles édictées par la recommandation. Les seconds comparent les informations contenues dans le fichier à celles du SUDOC.

Un script GREL a été réalisé, pour l’évaluation des périodiques d’une part, des livres électroniques d’autre part.

La dernière version du script utilisé pour l’évaluation des périodiques est la suivante :

[ { "op": "core/text-transform", "description": "Script syntaxique : pour chaque ligne, test l'ensemble des champs. Si une ligne ne contient que des champs vides, alors la mention « ligne vide » apparaît dans le champ publication_title de la ligne concernée", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "publication_title", "expression": "grel:if(cells.publication_title.value.length()==0,(if(cells.print_identifier.value.length()==0,(if(cells .online_identifier.value.length()==0,(if(cells.date_first_issue_online.value.length()==0,(if(cells.num_first_vol_online.value.length()==0,(if(cells.num_first_issue_online.value.length()==0,(if(cells.date_last_issue_online.value.length()==0,(if(cells.num_last_vol_online.value.length()==0,(if(cells.num_last_issue_online.value.length()==0,(if(cells.title_url.value.length()==0,(if(cells .first_author.value.length()==0,(if(cells.title_id.value.length()==0,(if(cells.embargo_info.value.length()==0,(if(cells.coverage_depth.value.length()==0,(if(cells.notes.value.length()==0,(if(cells.publisher_name.value.length()==0,(if(cells.publication_type.value.length()==0,(if(cells.date_monograph_published_print.value.length()==0,(if(cells.date_monograph_published_online.value.length()==0,(if(cells.monograph_volume.value.length()==0,(if(cells.monograph_edition.value.length()==0,(if(cells.first_editor.value.length()==0,(if(cells.parent_publication_title_id.value.length()==0,(if(cells.preceding_publication_title_id.value.length()==0,(if(cells.access_type.value.length()==0,'ligne vide',value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_title", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_first_issue_online", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_first_vol_online", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_first_issue_online", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_last_issue_online", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_last_vol_online", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_last_issue_online", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_url", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_id", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "embargo_info", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "coverage_depth", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publisher_name", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_type", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "preceding_publication_title_id", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "access_type", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_title", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_first_issue_online", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_first_vol_online", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_first_issue_online", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_last_issue_online", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_last_vol_online", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_last_issue_online", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_url", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_id", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "embargo_info", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "coverage_depth", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "notes", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publisher_name", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_type", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "preceding_publication_title_id", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "access-type", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_title", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_first_issue_online", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_first_vol_online", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_first_issue_online", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_last_issue_online", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_last_vol_online", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_last_issue_online", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_url", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_id", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "embargo_info", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "coverage_depth", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "SScript syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "notes", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publisher_name", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_type", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "preceding_publication_title_id", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne et du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "access_type", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : remplace le x minuscule par un X majuscule pour les p-ISSN", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "print_identifier", "expression": "grel:value.replace(\"x\",\"X\")", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : remplace le x minuscule par un X majuscule pour les e-ISSN", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "online_identifier", "expression": "grel:value.replace(\"x\",\"X\")", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition", "description": "Script syntaxique : doublons sur le publication_title", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "publication_title_doublon", "columnInsertIndex": 25, "baseColumnName": "publication_title", "expression": "grel:forNonBlank(value,v,facetCount(v,'value','publication_title'),'')", "onError": "set-to-blank" }, { "op": "core/text-transform", "description": "Script syntaxique : vérifie qu'aucun champ du publication_title n'est vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_title", "expression": "grel:if(isBlank(value)==true,'titre manquant',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition", "description": "Script syntaxique : doublons sur le print_identifier", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "print_identifier_doublon", "columnInsertIndex": 26, "baseColumnName": "print_identifier", "expression": "grel:forNonBlank(value,v,facetCount(v,'value','print_identifier'),'')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script syntaxique : doublons sur le online_identifier", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "online_identifier_doublon", "columnInsertIndex": 27, "baseColumnName": "online_identifier", "expression": "grel:forNonBlank(value,v,facetCount(v,'value','online_identifier'),'')", "onError": "set-to-blank" }, { "op": "core/text-transform", "description": "Script syntaxique : ne conserve que les quatre premiers caractères contenus dans le date_first_issue_online, à condition qu'ils respectent le format YYYY. Sinon, renvoie un message d'erreur", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_first_issue_online", "expression": "grel:if(value.match(/.*(\\d{4}).*/)[0]==null,value+' : format incorrect',value.match(/.*(\\d{4}).*/)[0])", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : ne conserve que les quatre premiers caractères contenus dans le date_last_issue_online, à condition qu'ils respectent le format YYYY. Sinon, informe d'une erreur de format", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_last_issue_online", "expression": "grel:if(isNonBlank(value),if(value.match(/.*(\\d{4}).*/)[0]==null,value+' : format incorrect',value.match(/.*(\\d{4}).*/)[0]),value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition", "description": "Script syntaxique : le contenu du num_first_vol_online, lorsqu'il n'est pas numérique, suit-il une cohérence ?", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "num_first_vol_non_numérique", "columnInsertIndex": 28, "baseColumnName": "num_first_vol_online", "expression": "grel:if(isNotNull(value.match(/[0-9]*/)),'','cohérent ? '+value)", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script syntaxique : le contenu du num_first_issue_online, lorsqu'il n'est pas numérique, suit-il une cohérence ?", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "num_first_issue_non_numérique", "columnInsertIndex": 29, "baseColumnName": "num_first_issue_online", "expression": "grel:if(isNotNull(value.match(/[0-9]*/)),'','cohérent ? '+value)", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script syntaxique : le contenu du num_last_vol_online, lorsqu'il n'est pas numérique, suit-il une cohérence ?", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "num_last_vol_non_numérique", "columnInsertIndex": 30, "baseColumnName": "num_last_vol_online", "expression": "grel:if(isNotNull(value.match(/[0-9]*/)),'','cohérent ? '+value)", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script syntaxique : le contenu du num_last_issue_online, lorsqu'il n'est pas numérique, suit-il une cohérence ?", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "num_last_issue_non_numérique", "columnInsertIndex": 31, "baseColumnName": "num_last_issue_online", "expression": "grel:if(isNotNull(value.match(/[0-9]*/)),'','cohérent ? '+value)", "onError": "set-to-blank" }, { "op": "core/text-transform", "description": "Script syntaxique : URL manquante", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_url", "expression": "grel:if(isBlank(value)==true,'URL obligatoire',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition", "description": "Script syntaxique : la partie fixe du title_url mise de côté, la partie évolutive restante correspond-elle au title_id ? Test I ATTENTION : A ACTUALISER AVANT D'UTILISER LE SCRIPT : remplacer [X] par la partie fixe de l'URL", "engineConfig": { "mode": "record-based", "facets": [] }, "newColumnName": "title_url_bis", "columnInsertIndex": 32, "baseColumnName": "title_url", "expression": "grel:value.replace('[X]','')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script syntaxique : la partie fixe du title_url mise de côté, la partie évolutive restante correspond-elle au title_id ? Test II", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "title_url_vs_title_id", "columnInsertIndex": 33, "baseColumnName": "title_url_bis", "expression": "grel:if(value==cells['title_id'].value,'','erreur ? '+value)", "onError": "set-to-blank" }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_author", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide','')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_print", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide','')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_online", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide','')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_volume", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide','')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_edition", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide','')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_editor", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide','')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "parent_publication_title_id", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide','')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : peut être vide ou contient strictement : P ou R + 1 à 9999 + Y ou M ou D", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "embargo_info", "expression": "grel:if(isBlank(value),value,if(isNotNull(value.match(/[PR]\\d{1,4}[YMD]/)),'',value+': format incorrect'))", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : contient obligatoirement « fulltext », « selected articles » ou abstract", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "coverage_depth", "expression": "grel:if(isNotNull(value.match(/fulltext|selected articles|abstracts/)),'',value+' : format incorrect')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : ne peut pas être vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publisher_name", "expression": "grel:if(isBlank(value)!=false,'doit être renseigné',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : contient obligatoirement « serial »", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_type", "expression": "grel:if(isNotNull(value.match(/serial/)),value,value+' : format incorrect')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : contient obligatoirement P ou F", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "access_type", "expression": "grel:if(isNotNull(value.match(/[PF]/)),value,value+' : format incorrect')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition", "description": "Script sémantique : création d'une nouvelle colonne, qui récupère la valeur du date_first_issue_online et lui donne le format Number", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "year_first_issue", "columnInsertIndex": 34, "baseColumnName": "date_first_issue_online", "expression": "grel:value.split(\"-\")[0].toNumber()", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : création d'une nouvelle colonne, qui récupère la valeur du date_last_issue_online et lui donne le format Number", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "last_year_issue", "columnInsertIndex": 35, "baseColumnName": "date_last_issue_online", "expression": "grel:value.split(\"-\")[0].toNumber()", "onError": "set-to-blank" }, { "op": "core/column-addition-by-fetching-urls", "description": "Script sémantique : indique quel webservice (issnbacon) interroger pour la récupération des informations de référence dans le SUDOC", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "sudoc_print_identifier", "columnInsertIndex": 36, "baseColumnName": "print_identifier", "urlExpression": "grel:'https://bacon.abes.fr/issnbacon/'+value+'.json'", "onError": "set-to-blank", "delay": 10 }, { "op": "core/column-addition", "description": "Script sémantique : indiquer, le cas échéant, l'écart entre le type de média donné par le SUDOC et le type d'identifiant (en l'occurrence papier)", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "erreur_print_media", "columnInsertIndex": 37, "baseColumnName": "sudoc_print_identifier", "expression": "grel:if(value!=null+isNonBlank(cells[\"print_identifier\"].value),(if(value.parseJson()[\"sudoc\"][\"ppn\"][\"media\"]!=\"a\",cells[\"print_identifier\"].value+\" n'est pas un imprime\",forEach(value.parseJson().sudoc,v,[v.ppn.media,v.ppn.content].join(':')).join(' '))),'')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : récupérer les informations associées au webservice issnbacon pour la date de début de couverture", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "sudoc_startdate", "columnInsertIndex": 38, "baseColumnName": "sudoc_print_identifier", "expression": "grel:value.parseJson()[\"sudoc\"][\"ppn\"][\"startdate\"]", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : renvoie le ppn de la notice si la date SUDOC est plus récente que la date de début de couverture, indice d'une métarevue non déployée", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "erreur_print_date", "columnInsertIndex": 39, "baseColumnName": "year_first_issue", "expression": "grel:if(value<cells[\"sudoc_startdate\"].value, cells[\"sudoc_print_identifier\"].value.parseJson()[\"sudoc\"][\"ppn\"][\"content\"],\"\")", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : si la colonne erreur_print_date contient un élément, rappel des dates : date SUDOC > date_first_issue_online", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "date_sudoc>date_first", "columnInsertIndex": 40, "baseColumnName": "erreur_print_date", "expression": "grel:if(isBlank(value),'',cells[\"sudoc_print_identifier\"].value.parseJson()[\"sudoc\"][\"ppn\"][\"startdate\"]+' > '+cells[\"date_first_issue_online\"].value)", "onError": "set-to-blank" }, { "op": "core/column-addition-by-fetching-urls", "description": "Script sémantique : indique quel webservice (issnbacon) interroger pour la récupération des informations de référence dans le SUDOC, pour le online_identifier", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "sudoc_online_identifier", "columnInsertIndex": 41, "baseColumnName": "online_identifier", "urlExpression": "grel:'https://bacon.abes.fr/issnbacon/'+value+'.json'", "onError": "set-to-blank", "delay": 10 }, { "op": "core/column-addition", "description": "Script sémantique : indiquer, le cas échéant, l'écart entre le type de média donné par le SUDOC et le type d'identifiant (en l'occurrence électronique)", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "erreur_online_media", "columnInsertIndex": 42, "baseColumnName": "sudoc_online_identifier", "expression": "grel:if(value!=null+isNonBlank(cells[\"online_identifier\"].value),(if(value.parseJson()[\"sudoc\"][\"ppn\"][\"media\"]!=\"l\",cells[\"online_identifier\"].value+\" n'est pas un imprime\",forEach(value.parseJson().sudoc,v,[v.ppn.media,v.ppn.content].join(':')).join(' '))),'')", "onError": "set-to-blank" }, { "op": "core/column-removal", "description": "Script sémantique : supprime la colonne year_first_issue", "columnName": "year_first_issue" }, { "op": "core/column-removal", "description": "Script sémantique : supprime la colonne last_year_issue", "columnName": "last_year_issue" }, { "op": "core/column-removal", "description": "Script sémantique : supprime la colonne sudoc_startdate", "columnName": "sudoc_startdate" }, { "op": "core/text-transform", "description": "Script syntaxique : p-ISSN non conforme", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "grel:forNonBlank(value,v,if(v.match(/^\\d{4}-\\d{3}(\\d|X)$/)!=null,value,value+\" n'est pas un ISSN conforme\"),'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : e-ISSN non conforme", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "grel:forNonBlank(value,v,if(v.match(/^\\d{4}-\\d{3}(\\d|X)$/)!=null,value,value+\" n'est pas un ISSN conforme\"),'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : vérifie qu'un titre dispose au moins d'un ISSN", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "grel:if(isBlank(value),(if(isBlank(cells[\"online_identifier\"].value),'aucun ISSN',value)),value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : aucun p-ISSN mais un e-ISSN : s'agit-il d'une revue numérique native ?", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "grel:if(isBlank(value)==true,'revue numerique native ?',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : tous les eISSN doivent être renseignés, y compris si la revue a été numérisée (demande à faire auprès du CIEPS)", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "grel:if(isBlank(value)==true,'ISSN obligatoire',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 } ]

Celle pour l’évaluation des livres électroniques :

[ { "op": "core/text-transform", "description": "Script syntaxique : pour chaque ligne, test l'ensemble des champs. Si une ligne ne contient que des champs vides, alors la mention « ligne vide » apparaît dans le champ publication_title de la ligne concernée", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "publication_title", "expression": "grel:if(cells.publication_title.value.length()==0,(if(cells.print_identifier.value.length()==0,(if(cells .online_identifier.value.length()==0,(if(cells.date_first_issue_online.value.length()==0,(if(cells.num_first_vol_online.value.length()==0,(if(cells.num_first_issue_online.value.length()==0,(if(cells.date_last_issue_online.value.length()==0,(if(cells.num_last_vol_online.value.length()==0,(if(cells.num_last_issue_online.value.length()==0,(if(cells.title_url.value.length()==0,(if(cells .first_author.value.length()==0,(if(cells.title_id.value.length()==0,(if(cells.embargo_info.value.length()==0,(if(cells.coverage_depth.value.length()==0,(if(cells.notes.value.length()==0,(if(cells.publisher_name.value.length()==0,(if(cells.publication_type.value.length()==0,(if(cells.date_monograph_published_print.value.length()==0,(if(cells.date_monograph_published_online.value.length()==0,(if(cells.monograph_volume.value.length()==0,(if(cells.monograph_edition.value.length()==0,(if(cells.first_editor.value.length()==0,(if(cells.parent_publication_title_id.value.length()==0,(if(cells.preceding_publication_title_id.value.length()==0,(if(cells.access_type.value.length()==0,'ligne vide',value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)),value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_title", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_url", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_author", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_id", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "coverage_depth", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publisher_name", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_type", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_print", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_online", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_volume", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_edition", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_editor", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "parent_publication_title_id", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Suppression des espaces en début et en fin de cellule", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "access_type", "expression": "value.trim()", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_title", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_url", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_author", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_id", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "coverage_depth", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publisher_name", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_type", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_print", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_online", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_volume", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_edition", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_editor", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "parent_publication_title_id", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : Si plusieurs caractères d’espaces consécutifs, fusion en un seul", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "access_type", "expression": "value.replace(/\\s+/,' ')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_title", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_url", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_author", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_id", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "coverage_depth", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publisher_name", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_type", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_print", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_online", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_volume", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_edition", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_editor", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "parent_publication_title_id", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "SScript syntaxique : suppression du caractère de retour à la ligne", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "access_type", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_title", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_url", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_author", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_id", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "coverage_depth", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publisher_name", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_type", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_print", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_online", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_volume", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_edition", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_editor", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "parent_publication_title_id", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : suppression du caractère d'espace insécable", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "access_type", "expression": "grel:value.replace(/\\u000a/,'').replace(/\\u00A0/,'')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition-by-fetching-urls", "description": "Script sémantique : création d'une colonne contenant les informations du Sudoc à partir du online_identifier grâce au webservice 'isbnbacon'", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "E-ISBN_sudoc_json", "columnInsertIndex": 25, "baseColumnName": "online_identifier", "urlExpression": "grel:if(value!=null,'https://bacon.abes.fr/isbnbacon/'+value+'.json','')", "onError": "set-to-blank", "delay": 10 }, { "op": "core/column-addition", "description": "Script sémantique : création d'une colonne contenant le publication_title nettoyé", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "pub_title_clean", "columnInsertIndex": 25, "baseColumnName": "publication_title", "expression": "grel:toLowercase(trim(value.replace(/\\u00A0/, ' '))).replace(/\\p{Punct}/,' ').replace(/\\u2019/, ' ').replace(/\\u200E/, ' ').replace(/\\s+/, ' ')", "onError": "set-to-blank" }, { "op": "core/text-transform", "description": "Script syntaxique : remplace le x minuscule par un X majuscule pour les p-ISBN", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "print_identifier", "expression": "grel:value.replace(\"x\",\"X\")", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : remplace le x minuscule par un X majuscule pour les e-ISBN", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "online_identifier", "expression": "grel:value.replace(\"x\",\"X\")", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition", "description": "Script sémantique : création d'une colonne contenant le titre sudoc", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-sudoc_title", "columnInsertIndex": 25, "baseColumnName": "E-ISBN_sudoc_json", "expression": "grel:value.parseJson()['sudoc']['ppn']['title']", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : création d'une colonne contenant le E-sudoc_title nettoyé", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-sudoc_title_clean", "columnInsertIndex": 25, "baseColumnName": "E-sudoc_title", "expression": "grel:toLowercase(trim(value.replace(/\\u00A0/, ' '))).replace(/\\p{Punct}/,' ').replace(/\\u2019/, ' ').replace(/\\u200E/, ' ').replace(/\\s+/, ' ')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : préparation du calcul de distance", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-min_clean_title", "columnInsertIndex": 25, "baseColumnName": "pub_title_clean", "expression": "grel:min(length(value),length(cells['E-sudoc_title_clean'].value))", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : résultat du calcul de distance", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-dist_title", "columnInsertIndex": 25, "baseColumnName": "E-min_clean_title", "expression": "grel:jarowinkler(stripAccents(substring(cells['pub_title_clean'].value,0,value)),stripAccents(substring(cells['E-sudoc_title_clean'].value,0,value)))", "onError": "set-to-blank" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "E-sudoc_title" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "E-min_clean_title" }, { "op": "core/column-addition", "description": "Script sémantique : création d'une colonne contenant la valeur 'NOK' si l'ISBN n'est pas électronique", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "error_online_media", "columnInsertIndex": 25, "baseColumnName": "E-ISBN_sudoc_json", "expression": "grel:if(value!=null,if(value.parseJson()['sudoc']['ppn']['media']!='l','NOK',''),'')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Gestion des ppn multiples", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "E-ISBN_multi-ppn", "columnInsertIndex": 25, "baseColumnName": "E-ISBN_sudoc_json", "expression": "grel:forEach(value.parseJson().sudoc,v,[v.ppn.media,v.ppn.content].join(':')).join(' ')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Test sur le type de média", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "E-ISBN_multi-ppn_final", "columnInsertIndex": 25, "baseColumnName": "E-ISBN_multi-ppn", "expression": "grel:if(isBlank(value)==false,if(value.match(/.*l.*/)==null,value,''),'')", "onError": "set-to-blank" }, { "op": "core/column-split", "description": "Séparer le contenu de la colonne P-ISBN_multi_ppn_final en autant de colonnes qu'il y a de ppn", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "E-ISBN_multi-ppn_final", "guessCellType": true, "removeOriginalColumn": true, "mode": "separator", "separator": " ", "regex": false, "maxColumns": 0 }, { "op": "core/column-addition", "description": "Script sémantique : création d'une colonne contenant le first_author nettoyé", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "first_author_clean", "columnInsertIndex": 25, "baseColumnName": "first_author", "expression": "grel:toLowercase(trim(value.replace(/\\u00A0/, ' '))).replace(/\\p{Punct}/,' ').replace(/\\u2019/, ' ').replace(/\\u200E/, ' ').replace(/\\s+/, ' ')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : extraire l'auteur pour comparaison", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-sudoc_author", "columnInsertIndex": 25, "baseColumnName": "E-ISBN_sudoc_json", "expression": "grel:value.parseJson()['sudoc']['ppn']['marcautrel']", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : création d'une colonne contenant l'auteur sudoc nettoyé", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-sudoc_author_clean", "columnInsertIndex": 25, "baseColumnName": "E-sudoc_author", "expression": "grel:toLowercase(trim(value.replace(/\\u00A0/, ' '))).replace(/\\p{Punct}/,' ').replace(/\\u2019/, ' ').replace(/\\u200E/, ' ').replace(/\\s+/, ' ')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : préparation du calcul de distance", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-min_clean_author", "columnInsertIndex": 25, "baseColumnName": "first_author_clean", "expression": "grel:min(length(value),length(cells['E-sudoc_author_clean'].value))", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : résultat du calcul de distance", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-dist_author", "columnInsertIndex": 25, "baseColumnName": "E-min_clean_author", "expression": "grel:if(value!=0,(jarowinkler(stripAccents(substring(cells['first_author_clean'].value,0,value)),stripAccents(substring(cells['E-sudoc_author_clean'].value,0,value)))),'')", "onError": "set-to-blank" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "E-sudoc_author" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "E-min_clean_author" }, { "op": "core/column-addition-by-fetching-urls", "description": "Script sémantique : création d'une colonne contenant les informations du Sudoc à partir du print_identifier grâce au webservice 'isbnbacon'", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "P-ISBN_sudoc_json", "columnInsertIndex": 25, "baseColumnName": "print_identifier", "urlExpression": "grel:if(value!=null,'https://bacon.abes.fr/isbnbacon/'+value+'.json','')", "onError": "set-to-blank", "delay": 10 }, { "op": "core/column-addition", "description": "Script sémantique : création d'une colonne contenant le titre sudoc", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-sudoc_title", "columnInsertIndex": 25, "baseColumnName": "P-ISBN_sudoc_json", "expression": "grel:if(cells['E-ISBN_sudoc_json']==null,value.parseJson()['sudoc']['ppn']['title'],'')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : création, en 16ème position, d'une colonne contenant le P-sudoc_title nettoyé", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-sudoc_title_clean", "columnInsertIndex": 25, "baseColumnName": "P-sudoc_title", "expression": "grel:toLowercase(trim(value.replace(/\\u00A0/, ' '))).replace(/\\p{Punct}/,' ').replace(/\\u2019/, ' ').replace(/\\u200E/, ' ').replace(/\\s+/, ' ')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : préparation, en 17ème position, du calcul de distance", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-min_clean_title", "columnInsertIndex": 25, "baseColumnName": "pub_title_clean", "expression": "grel:min(length(value),length(cells['P-sudoc_title_clean'].value))", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : résultat du calcul de distance, en 18ème position", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-dist_title", "columnInsertIndex": 25, "baseColumnName": "P-min_clean_title", "expression": "grel:if(cells['P-min_clean_title'].value!=0,jarowinkler(stripAccents(substring(cells['pub_title_clean'].value,0,value)),stripAccents(substring(cells['P-sudoc_title_clean'].value,0,value))),'')", "onError": "set-to-blank" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "P-sudoc_title" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "P-min_clean_title" }, { "op": "core/column-addition", "description": "Script sémantique : création d'une colonne contenant la valeur 'NOK' si l'ISBN n'est pas papier", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "erreur_print_media", "columnInsertIndex": 25, "baseColumnName": "P-ISBN_sudoc_json", "expression": "grel:if(value!=null,if(value.parseJson()['sudoc']['ppn']['media']!='a','NOK',''),'')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Gestion des ppn multiples", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "P-ISBN_multi-ppn", "columnInsertIndex": 25, "baseColumnName": "P-ISBN_sudoc_json", "expression": "grel:forEach(value.parseJson().sudoc,v,[v.ppn.media,v.ppn.content].join(':')).join(' ')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Test sur le type de média", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "P-ISBN_multi-ppn_final", "columnInsertIndex": 25, "baseColumnName": "P-ISBN_multi-ppn", "expression": "grel:if(isBlank(value)==false,if(value.match(/.*a.*/)==null,value,''),'')", "onError": "set-to-blank" }, { "op": "core/column-split", "description": "Séparer le contenu de la colonne P-ISBN_multi_ppn_final en autant de colonnes qu'il y a de ppn", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "P-ISBN_multi-ppn_final", "guessCellType": true, "removeOriginalColumn": true, "mode": "separator", "separator": " ", "regex": false, "maxColumns": 0 }, { "op": "core/column-addition", "description": "Script sémantique : extraire l'auteur du json pour comparaison", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-sudoc_author", "columnInsertIndex": 25, "baseColumnName": "P-ISBN_sudoc_json", "expression": "grel:if(cells['E-sudoc_author']==null,value.parseJson()['sudoc']['ppn']['marcautrel'],'')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : création d'une colonne contenant l'auteur sudoc nettoyé", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-sudoc_author_clean", "columnInsertIndex": 25, "baseColumnName": "P-sudoc_author", "expression": "grel:toLowercase(trim(value.replace(/\\u00A0/, ' '))).replace(/\\p{Punct}/,' ').replace(/\\u2019/, ' ').replace(/\\u200E/, ' ').replace(/\\s+/, ' ')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : préparation du calcul de distance", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-min_clean_author", "columnInsertIndex": 25, "baseColumnName": "first_author_clean", "expression": "grel:min(length(value),length(cells['P-sudoc_author_clean'].value))", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : résultat du calcul de distance", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-dist_author", "columnInsertIndex": 25, "baseColumnName": "P-min_clean_author", "expression": "grel:if(value!=0,(jarowinkler(stripAccents(substring(cells['first_author_clean'].value,0,value)),stripAccents(substring(cells['P-sudoc_author_clean'].value,0,value)))),'')", "onError": "set-to-blank" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "P-sudoc_author" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "P-min_clean_author" }, { "op": "core/text-transform", "description": "Script syntaxique : ne conserve que les quatre premiers caractères contenus dans le date_monograph_published_online, à condition qu'ils respectent le format YYYY. Sinon, informe d'une erreur de format", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_online", "expression": "grel:if(value.match(/.*(\\d{4}).*/)[0]==null,value+' : format incorrect',value.match(/.*(\\d{4}).*/)[0])", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : ne conserve que les quatre premiers caractères contenus dans le date_last_issue_online, à condition qu'ils respectent le format YYYY. Sinon, informe d'une erreur de format", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_monograph_published_print", "expression": "grel:if(isNonBlank(value),if(value.match(/.*(\\d{4}).*/)[0]==null,value+' : format incorrect',value.match(/.*(\\d{4}).*/)[0]),value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition", "description": "Script sémantique : extraire la date pour comparaison", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-sudoc_date", "columnInsertIndex": 19, "baseColumnName": "E-ISBN_sudoc_json", "expression": "grel:toString(value.parseJson()['sudoc']['ppn']['pubdate'])", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script sémantique : crée une nouvelle colonne, résultat de la comparaison sur les dates de l'électronique", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "E-sudoc_date_check", "columnInsertIndex": 20, "baseColumnName": "E-sudoc_date", "expression": "grel:if(isNonBlank(cells['date_monograph_published_online'].value),(if(contains(cells['date_monograph_published_online'].value,'format incorrect'),'',(if(value!=cells['date_monograph_published_online'].value,value,'')))),'')", "onError": "set-to-blank" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "E-sudoc_date" }, { "op": "core/column-addition", "description": "Script sémantique : extraire la date pour comparaison", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-sudoc_date", "columnInsertIndex": 18, "baseColumnName": "P-ISBN_sudoc_json", "expression": "grel:toString(value.parseJson()['sudoc']['ppn']['pubdate'])", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Crée une nouvelle colonne, résultat de la comparaison sur les dates du papier", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "P-sudoc_date_check", "columnInsertIndex": 19, "baseColumnName": "P-sudoc_date", "expression": "grel:if(isNonBlank(cells['date_monograph_published_print'].value),(if(contains(cells['date_monograph_published_print'].value,'format incorrect'),'',(if(value!=cells['date_monograph_published_print'].value,value,'')))),'')", "onError": "set-to-blank" }, { "op": "core/column-removal", "description": "Suppression d'une colonne devenue inutile", "columnName": "P-sudoc_date" }, { "op": "core/column-addition", "description": "Script syntaxique : doublons sur le publication_title", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "publication_title_doublon", "columnInsertIndex": 27, "baseColumnName": "publication_title", "expression": "grel:forNonBlank(value,v,facetCount(v,'value','publication_title'),'')", "onError": "set-to-blank" }, { "op": "core/text-transform", "description": "Script syntaxique : vérifie qu'aucun champ du publication_title ne soit vide", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "publication_title", "expression": "grel:if(isBlank(value)==true,'titre manquant',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition", "description": "Script syntaxique : doublons sur le print_identifier", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "print_identifier_doublon", "columnInsertIndex": 28, "baseColumnName": "print_identifier", "expression": "grel:forNonBlank(value,v,facetCount(v,'value','print_identifier'),'')", "onError": "set-to-blank" }, { "op": "core/column-addition", "description": "Script syntaxique : doublons sur le online_identifier", "engineConfig": { "mode": "row-based", "facets": [] }, "newColumnName": "online_identifier_doublon", "columnInsertIndex": 29, "baseColumnName": "online_identifier", "expression": "grel:forNonBlank(value,v,facetCount(v,'value','online_identifier'),'')", "onError": "set-to-blank" }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_first_issue_online", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_first_vol_online", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_first_issue_online", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "date_last_issue_online", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_last_vol_online", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "num_last_issue_online", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : aucun champ vide", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "title_url", "expression": "grel:if(isBlank(value)==true,'URL obligatoire',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/column-addition", "description": "Script syntaxique : la partie fixe du title_url mise de côté, la partie évolutive restante correspond-elle au title_id ? Test I ATTENTION : A ACTUALISER AVANT D'UTILISER LE SCRIPT : remplacer [X] par la partie fixe de l'URL", "engineConfig": { "facets": [], "mode": "row-based" }, "newColumnName": "title_url_bis", "columnInsertIndex": 10, "baseColumnName": "title_url", "expression": "grel:value.replace('[X]','')", "onError": "set-to-blank" }, { "op": "core/text-transform", "description": "Script syntaxique : la partie fixe du title_url mise de côté, la partie évolutive restante correspond-elle au title_id ? Test II", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "title_id", "expression": "grel:if(cells[\"title_url_bis\"].value==cells[\"title_id\"].value,value,\"erreur ? \"+value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "embargo_info", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : contient obligatoirement « fulltext », « selected articles » ou abstract", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "coverage_depth", "expression": "grel:if(isNotNull(value.match(/fulltext|selected articles|abstract/)),value,value+' format incorrect')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : ne peut pas être vide", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "publisher_name", "expression": "grel:if(isBlank(value)!=false,'doit être renseigné',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : contient obligatoirement « monograph »", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "publication_type", "expression": "grel:if(isNotNull(value.match(/monograph/)),value,value+' : format incorrect')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : le contenu du monograph_volume, lorsqu'il n'est pas numérique, suit-il une cohérence ?", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_volume", "expression": "grel:if(isNotNull(value.match(/[0-9]*/)),value,'cohérent ? '+value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : le contenu du monograph_edition, lorsqu'il n'est pas numérique, suit-il une cohérence ?", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "monograph_edition", "expression": "grel:if(isNotNull(value.match(/[0-9]*/)),value,'cohérent ? '+value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : le contenu du first_author est-il une suite de lettres, majuscules ou minuscules, formant un mot unique ?", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "first_author", "expression": "grel:if(isNull(value.match(/[a-zA-Z]*/))==true,value+ ' : erreur ?',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : champ obligatoirement vide", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "preceding_publication_title_id", "expression": "grel:if(isBlank(value)!=true,value+' : doit être vide',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : contient obligatoirement P ou F", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "access_type", "expression": "grel:if(isNotNull(value.match(/[PF]/)),value,value+' : format incorrect')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : print_identifier et online_identifier ne peuvent être vides à la fois, TEST 1", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "print_identifier", "expression": "grel:if(cells.print_identifier.value.length()==0,(if(cells.online_identifier.value.length()==0,'manque ISBN',value)),value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : print_identifier et online_identifier ne peuvent être vides à la fois, TEST 2", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "online_identifier", "expression": "grel:if(cells.print_identifier.value=='manque ISBN',(if(cells.online_identifier.value.length()==0,'manque ISBN',value)),value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : aucun e-ISBN mais un p-ISBN : s'agit-il d'un e-book numérique natif ?", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "print_identifier", "expression": "grel:if(isBlank(value)==true,'e-book natif numérique ?',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : tous les eISBN doivent être renseignés, y compris si le livre a été numérisé (demande à faire auprès du CIEPS)", "engineConfig": { "mode": "row-based", "facets": [] }, "columnName": "online_identifier", "expression": "grel:if(isBlank(value)==true,'ISBN obligatoire',value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : p-ISBN non conforme I", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "grel:value.replace('-','')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : p-ISBN non conforme II", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "print_identifier", "expression": "grel:if(value.match(/^(97(8|9))?\\d{9}(\\d|X)$/)==null,value+\" n'est pas un isbn conforme\",value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : e-ISBN non conforme I", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "grel:value.replace('-','')", "onError": "keep-original", "repeat": false, "repeatCount": 10 }, { "op": "core/text-transform", "description": "Script syntaxique : e-ISBN non conforme II", "engineConfig": { "facets": [], "mode": "row-based" }, "columnName": "online_identifier", "expression": "grel:if(value.match(/^(97(8|9))?\\d{9}(\\d|X)$/)==null,value+\" n'est pas un isbn conforme\",value)", "onError": "keep-original", "repeat": false, "repeatCount": 10 } ]

Avant d’appliquer ces scripts dans OpenRefine et après avoir déposé les fichiers sur un serveur dédié, cinq critères syntaxiques sont préalablement vérifiés :

  • la syntaxe du nom de fichier [6.5.1] (la numérotation entre crochets renvoie à la documentation KBART Phase II)
  • la présence de vingt-cinq colonnes, correctement nommées et ordonnées [6.4.4, 6.4.5]
  • l’obligation de renseigner certaines colonnes, d’en laisser d’autres vides, selon le type de document [6.6]
  • l’encodage du texte en UTF-8 [6.4.3]
  • le séparateur de champs, qui doit être la tabulation [6.4.1]

Ces critères doivent être remplis pour passer à l’étape suivante. Ils sont par ailleurs obligatoires pour un chargement dans la base.
Si un fichier ne répond pas à l’un de ces critères, l’éditeur en est informé. L’évaluation ne peut aller plus loin avant qu’une nouvelle version, corrigée, ne nous soit parvenue.

Dans le cas contraire, le fichier est chargé dans OpenRefine et le script correspondant au type de document est appliqué. Le script applicable aux périodiques contient 97 opérations. Celui pour les e-books, 145. Ce nombre peut varier selon la qualité du fichier, certaines opérations n’ayant pas lieu si aucune correction n’est nécessaire.

Les erreurs de type syntaxique sont mentionnées directement dans la cellule qui les contient. En revanche, les opérations de type sémantique nécessitent de créer des colonnes supplémentaires pour l’affichage des erreurs. En effet, les erreurs sémantiques sont des erreurs potentielles, qui doivent être vérifiées avant d’être validées. Il est nécessaire, pour comprendre ce choix, de savoir que nous communiquons à l’éditeur un fichier, au format html, qui accompagne le rapport écrit transmis après chaque évaluation. Ce fichier est le résultat d’un différentiel entre le fichier KBART qui nous a été transmis par l’éditeur et le fichier évalué sur lequel le script a été appliqué et enrichi des corrections de celui qui l’évalue. L’outil utilisé est DAFF.

Les scripts ont donc été pensés selon le type de document, selon le type d’erreur, mais aussi selon l’usage qui en est fait par les éditeurs. Disposer de ce fichier html leur permet, grâce à un code couleur, de repérer facilement les lignes qui ont été modifiées lors de l’évaluation, qu’il s’agisse d’une modification automatisée grâce au script ou d’une modification manuelle effectuée par l’évaluateur.

Pour résumer, prenons deux exemples d’opérations : celui du format des identifiants, ISSN et ISBN, qui est une opération syntaxique ; celui des métarevues, qui permet de déceler la présence de titres non déployés dans le fichier.
Un identifiant non conforme sera décelé par le script sans équivoque. Un ISSN sans tiret ou contenant la lettre ‘X’ en deuxième position contient nécessairement une erreur.
En revanche, le script permettra de repérer une date de début de couverture (date_first_issue_online) inférieure à la date de début de la publication contenue dans le SUDOC, indice susceptible de révéler la présence d’une métarevue non déployée, mais ne sera pas en mesure d’apporter une réponse plus aboutie afin d’aider l’éditeur à corriger son fichier. Une intervention humaine sera nécessaire afin de consulter le registre ISSN et enrichir le fichier des titres de la métarevue qui en sont absents.

Vous comprenez maintenant pourquoi certaines modifications du fichier par le script doivent être faites non pas directement dans les cellules que contient la version qui nous est livrée par l’éditeur, mais dans des colonnes supplémentaires : pour les tests sémantiques, l’évaluateur modifie les cellules du fichier qui contiennent des erreurs, tout en s’appuyant sur les informations contenues dans les colonnes générées par le script.

Une fois le fichier corrigé des erreurs syntaxiques et sémantiques qu’il contient, il est exporté d’OpenRefine.
Le différentiel est alors généré et son résultat transmis à l’éditeur comme illustration des informations contenues dans le rapport.

Peut-être vous êtes-vous déjà lancé dans l’utilisation des scripts avant d’en arriver là dans la lecture du billet. J’en serais heureux ! Peut-être alors vous êtes-vous trouvé confronté à certaines incompréhensions dans l’analyse du résultat. Rien de plus normal, surtout si vos interrogations portent sur les deux points suivants :

  • les scripts ont été élaborés sous la version 2.5 d’OpenRefine, qui s’appelait encore GoogleRefine à l’époque de sa conception, c’est-à-dire en 2011. Depuis, deux nouvelles versions ont vu le jour. Mais ces dernières sont des versions beta. Nous avons préféré nous appuyer sur la dernière version stable, la 2.5. Bien que les scripts semblent compatibles avec les versions plus récentes, tous les tests n’ont pas encore été effectués pour le confirmer.
  • la colonne ‘P-dist_author’ du script e-books ne laisse apparaître aucune information, voire n’a pas été générée. Rien de plus normal : elle contient le résultat d’un calcul de distance entre les chaînes de caractères contenues dans le ‘publication_title’ et la zone 200 de la notice SUDOC renvoyée par l’ISBN papier. Or ce calcul de distance s’appuie sur une fonction présente sur le serveur qui héberge OpenRefine à l’Abes. Vous ne pouvez donc pas y faire appel. Cette restriction est valable pour d’autres opérations. Notez, pour les plus curieux, qu’OpenRefine dispose de tels outils par défaut.

Ne pas être en mesure d’exploiter pleinement ces scripts pourrait être frustrant… C’est pourquoi nous proposons à ceux qui souhaitent en savoir plus sur la manière de les utiliser de rejoindre le premier des CERCLES mené dans le cadre de BACON. Pour en savoir plus, rendez-vous au prochain (et dernier) billet de la série.

N.B. : les scripts communiqués correspondent à une version. Ils ne sont en rien figés et nous serions très heureux de les enrichir de vos suggestions.

Cyril Leroy

OpenRefine au service de BACON : quelle évaluation pour les fichiers KBART ? [2] – Un outil : OpenRefine

[Lire le billet qui introduit cette série « OpenRefine au service de BACON : quelle évaluation pour les fichiers KBART ? »]

OpenRefine est un outil open source conçu pour manipuler des données dont la qualité nécessite un traitement. Mais il permet bien plus que de nettoyer un fichier tabulé des scories qu’il contient. Comparable à Excel, son principal intérêt est de permettre l’appel à des services web. Il est alors possible, et facile, de comparer le contenu d’un fichier avec une base de référence disposant d’une API.

Ce billet est un accompagnement dans vos premiers pas avec OpenRefine : comment l’installer, charger un fichier, effectuer ses premiers traitements.
Étant donné le nombre de tutoriels déjà disponibles sur cet outil, il sera surtout l’occasion de vous communiquer une bibliographie.

     1. Installation

OpenRefine est disponible sous Windows, Mac et Linux. Son installation s’effectue sans difficulté, quel que soit l’environnement sous lequel vous évoluez : il suffit de lancer le fichier d’installation correspondant au vôtre, téléchargeable depuis le site officiel.
Un environnement Java est requis.
Vous noterez, sur la même page, la liste des extensions qu’il est possible d’installer afin, par exemple, de permettre les exports en RDF.

     2. Chargement d’un fichier

Après avoir lancé OpenRefine, votre navigateur par défaut offre un nouvel onglet. Vous voyez alors apparaître :

accueil_OR

A gauche, trois onglets permettent de créer un projet (onglet actif sur l’illustration), d’ouvrir un projet existant ou d’importer un projet précédemment exporté.

A l’import, OpenRefine accepte de multiples formats. Pour illustrer notre propos, l’exemple utilisé sera celui d’un fichier tabulé (.tsv), ayant pour séparateur la tabulation, encodé en UTF-8. Ce fichier est issu de BACON : « Lavoisier_Global_AllJournals_2016-07-01.txt »

Pour importer un tel fichier après son téléchargement, cliquer sur « Parcourir », sélectionner le fichier dans l’arborescence de l’ordinateur puis cliquer sur « Next ».

Une nouvelle fenêtre apparaît, qui permet de choisir différentes options. Cette copie d’écran reproduit la partie inférieure de l’écran :

chargement_OR

Les options sélectionnées ne correspondent pas à la configuration proposée par défaut, mais aux besoins inhérents au fichier ainsi qu’aux traitements que nous allons opérer.
Il s’agit bien d’un fichier tabulé (fenêtre de gauche à fond bleu), dont le séparateur est la tabulation (« tabs »). La première ligne contient les intitulés de colonnes et doit donc être considérée comme telle (« Parse next »). Il ne nous reste plus qu’à cliquer sur « Create Project ».

     3. Présentation de l’interface

Appliquer des traitements sur les données que contient un projet peut s’opérer de deux manières complémentaires : par l’interface graphique ou en appliquant un script. OpenRefine accepte trois langages de programmation différents : GREL (General Refine Expression Language), Jython et Clojure.
Lors de nos traitements, nous utilisons GREL. Avec une  subtilité : la fonctionnalité qui permet d’appliquer un script accepte en réalité du Json, qui encapsule l’un des trois langages, dont le GREL.

Par exemple :

 {
 "op": "core/column-addition",
 "description": "Contient obligatoirement P ou F",
 "engineConfig": {
 "mode": "row-based",
 "facets": []
 },
 "newColumnName": "access_type_format",
 "columnInsertIndex": 55,
 "baseColumnName": "access_type",
 "expression": "grel:if(isNotNull(value.match(/[PF]/)),value,value+' : format incorrect')",
 "onError": "set-to-blank"
 }

Ce script vérifie le contenu des cellules de l’access_type, cette colonne du fichier KBART qui informe sur le type d’accès pour un titre : payant (« P ») ou gratuit (« F »). Il respecte la syntaxe Json mais, comme vous pouvez le remarquer, la ligne 11, intitulée « expression » et qui comporte l’appel aux fonctions, déclare en prémisse que le contenu de l’expression suit la syntaxe « grel ».

La méthode par script n’est pas la plus évidente à mettre en œuvre lors d’une première utilisation. La prise en main d’OpenRefine gagnera à se faire par l’interface graphique. Mais, très vite, il est nécessaire d’avoir recours à l’un des langages de programmation, nombre de fonctions n’étant pas accessibles par l’interface.

En revanche, pour s’initier au GREL, l’interface est un excellent outil qui permettra d’ailleurs un gain de temps considérable. En effet, plutôt que de coder directement en Json, mieux vaut utiliser l’interface graphique pour renseigner les expressions GREL. Il sera ensuite toujours possible de récupérer, par une extraction de l’historique, les expressions GREL qui apparaîtront alors directement revêtues de leur habit de Json.
Voilà pourquoi les deux méthodes sont complémentaires.

Pour reprendre l’exemple précédent, voici la méthode a priori la plus simple pour parvenir au résultat escompté.

  • dans l’interface, sélectionner la flèche correspondant à la colonne sur laquelle mener l’opération. Sélectionner « Edit cells » > « Transform ».

access_type1_OR

  • cette action a pour conséquence l’ouverture d’une nouvelle fenêtre, depuis laquelle nous allons renseigner l’expression correspondant à l’opération que nous voulons mener (2), en GREL (1). Le résultat sur les cellules est directement visible (3).
    [Les valeurs « l » (l. 1) et « F » (l.3) ont été modifiées pour les besoins de l’exemple]

access_type2_OR

Nous ne nous arrêterons pas dans le détail sur la manière dont l’expression est construite. Ce qui nous importe ici est le résultat obtenu et le moyen de le reproduire facilement en récupérant le script au format Json.

  • pour ce faire, après avoir appliqué l’opération en cliquant sur « OK », nous allons sélectionner l’option « Extract » depuis l’historique.
    Remarquons que trois actions ont été menées jusqu’à présent sur ce projet : les opérations 1 et 2 correspondent à l’édition des lignes 1 et 3 de la colonne access_type afin de rendre l’exemple plus parlant. La troisième, celle qui nous intéresse réellement, correspond à la vérification du contenu de cette colonne : si l’une des cellules qui la constituent contient une valeur autre que « P » ou « F », alors la valeur initiale doit apparaître, suivie de la mention « format incorrect ». Dans le cas contraire, seule la valeur initiale doit apparaître.

access_type3_OR

  • après avoir cliqué sur « Extract » une nouvelle fenêtre nous permet de sélectionner la partie du code, formaté en Json, qui nous intéresse. Ici, seulement celle qui correspond à la troisième étape, d’ailleurs la seule accessible, l’édition manuelle de contenu ne pouvant être exportée.

access_type4_OR

Il est alors facile de copier le code afin de le conserver pour une utilisation ultérieure. Il suffira, sur un nouveau projet, de coller le code correspondant, au format Json, dans la fenêtre accessible en cliquant sur « Apply » dans l’historique puis de valider à l’aide de « Perform Operations »

access_type5_OR

 

access_type6_OR

Vous avez peut-être remarqué la présence d’une différence entre le script tel que je vous l’ai présenté en début de ce chapitre et celui qui a été généré par OR et copié tel quel dans la fenêtre « Apply Operation History » ci-dessus.
Il s’agit de la « description » du code. En Json, les commentaires apparaissent dans cette partie, en texte libre pourvu que le texte soit entre guillemets. Pour une meilleure lisibilité et afin d’apporter des éléments plus précis que ceux contenus dans la description générée automatiquement par OpenRefine, son contenu a été modifié dans le script du début de chapitre.

A venir : Dans le prochain billet, nous vous communiquerons les scripts utilisés afin d’évaluer les fichiers KBART.

Bibliographie :

Cyril Leroy

OpenRefine au service de BACON : quelle évaluation pour les fichiers KBART ? [1] – Introduction

Cette série de billets exposera la méthode d’évaluation appliquée aux fichiers KBART, transmis à l’Abes par les éditeurs francophones ayant accepté de collaborer avec nous.
Pour le dernier d’entre eux, l’occasion sera donnée d’exposer une nouvelle déclinaison du dispositif CERCLES, appliquée à BACON.

  1. Introduction (ce billet)
  2. Un outil : OpenRefine
  3. Cas pratique
  4. Dispositif CERCLES dans le cadre de BACON

 

 Logo Bacon

La BAse de COnnaissance Nationale (BACON) est un entrepôt de métadonnées libres pour le signalement de la documentation électronique.
Son contenu, exposé sur bacon.abes.fr, peut être interrogé et téléchargé par webservices ou via l’interface graphique du site web.

Le modèle qui organise la base est conforme à la recommandation KBART NISO-RP-9-2014. Le premier niveau d’accès au contenu est celui du titre, pour les livres électroniques comme pour les périodiques. L’ISBN et l’ISSN électroniques constituent les portes d’entrée sur l’ensemble des métadonnées contenues dans les 25 champs de la recommandation.

Au second niveau, les titres sont regroupés par bouquets et masterlists. Il est en effet possible de différencier les fichiers mis à disposition selon leur nature : les masterlists décrivent l’ensemble du contenu d’une plate-forme pour un éditeur donné ; les bouquets correspondent aux offres commerciales proposées.

BACON contient, à ce jour, 178 bouquets et masterlists de ressources proposées par l’édition scientifique francophone. Ce résultat, non définitif, a été atteint en informant les éditeurs de l’intérêt d’appliquer la recommandation KBART pour l’amélioration de la qualité des métadonnées qui permettent le signalement et l’accès à la documentation électronique. Corriger à la source bénéficie à l’ensemble des intervenants qui redistribuent ou utilisent ces métadonnées.

Les éditeurs sensibles à nos arguments, qui acceptent de mettre en place un circuit de production de fichiers au format KBART, se voient proposer une évaluation des fichiers ainsi produits et une expertise sur la recommandation, avant de voir leurs fichiers chargés dans la base.

Pour mener à bien les évaluations, nous mettons en œuvre une procédure qui s’articule principalement autour d’un outil : OpenRefine.

Cyril Leroy

Mettre nos données en réseau – un démonstrateur. [2] Inventaire des données.

[ Lire le billet qui introduit cette série « Mettre nos données en réseau – un démonstrateur » ]

Pour les besoins de la démonstration, nous avons agrégé des données diverses et variées, mais finalement cette auberge espagnole n’est pas si anarchique : tout mène à tout, et on peut regrouper les jeux de données de différentes manières :

  • Données descriptives vs Référentiels
  • Données produites par les réseaux ABES vs Données de tiers
  • Données du monde des bibliothèques vs Données d’autres mondes (science, administration, etc.)
  • Données récupérées en RDF vs Données produites en RDF

Mais dans ABES, il y a B : notre réseau de données se déploie autour des données bibliographiques, qui décrivent des livres, des revues, mais également des chapitres et des articles.

Un jeu de données = un graphe nommé dans la base

Chaque jeu de données chargé dans la base RDF demeure un sous-ensemble bien identifié, un « graphe nommé« . Les données se croisent mais conservent leur pedigree.

Dans une requête SPARQL, on peut préciser ne vouloir interroger que les données de tel graphe – ou de plusieurs graphes. La requête suivante va chercher des titres de document dans le seul graphe des documents HAL :


PREFIX dcterms: <http://purl.org/dc/terms/>
select ?titre
from <http://hub.abes.fr/ccsd/docs/paris4>
where {
?document dcterms:title ?titre.
} LIMIT 10

Pourtant, il n’est pas conseillé d’utiliser le graphe comme un filtre de recherche documentaire : une même base peut être partitionnée en graphes de mille manières différentes ; on pourrait même tout mettre dans un seul graphe. L’organisation par graphes obéit moins à une logique documentaire qu’à des contraintes prosaïques de gestion de la base (regrouper les données ayant la même origine, par exemple) . Cette organisation fera davantage penser aux magasins du CTLES qu’aux salles de bibliothèque en libres accès.

Attention : le nom d’un graphe est une URI, comme http://hub.abes.fr/ccsd/docs/paris4 par exemple, mais inutile de cliquer dessus : elle ne mènera rien, elle sert d’identifiant unique, pas d’adresse web.

Les documents ISTEX

Dans le cadre du projet hub de métadonnées, cette approche « web sémantique » a d’abord été appliquée aux métadonnées livrées dans le cadre d’ISTEX, programme d’acquisition massive de documentation électronique. Ce cadre se prêtait parfaitement à cette approche : les éditeurs nous livrent des données riches et hétérogènes. Notre travail est de conserver toute cette richesse, de l’enrichir encore et de redistribuer librement ces données.

Dans le démonstrateur on trouvera ces données ISTEX :

Revue OUP

Contenu : Métadonnées de la revue Oxford Economic Papers : articles (2112), fascicules, volumes, périodique.

Graphe : http://hub.abes.fr/oup/journals/oxecon

Modélisation : ABES

Exemple :

<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://purl.org/dc/terms/subject>    <http://zbw.eu/beta/external_identifiers/jel#O33> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://purl.org/dc/terms/subject>    <http://zbw.eu/beta/external_identifiers/jel#F23> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://purl.org/dc/terms/subject>    <http://zbw.eu/beta/external_identifiers/jel#O34> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://rdaregistry.info/Elements/w/P10072>   <http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/m/web> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://purl.org/ontology/bibo/Article> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://vivoweb.org/ontology/core#relatedBy>  <http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/authorship/1-1> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://purl.org/dc/terms/isPartOf>   <http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/w> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://hub.abes.fr/namespace/articleType>    <http://hub.abes.fr/oup/articletype/researcharticle> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://purl.org/dc/terms/subject>    <http://zbw.eu/beta/external_identifiers/jel#F13> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://rdaregistry.info/Elements/c/C10001> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://rdaregistry.info/Elements/w/P10072>   <http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/m/print> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://vivoweb.org/ontology/core#relatedBy>  <http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/authorship/1-2> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://purl.org/dc/terms/subject>    <http://zbw.eu/beta/external_identifiers/jel#O14> .
<http://hub.abes.fr/oup/periodical/oep/2009/volume_61/issue_3/101093/oep/gpn036/w>    <http://purl.org/dc/terms/title>  "On welfare reducing technological change in a North-South framework"^^<http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral> .

 

Revues Nature (NPG)

Contenu : Tous les articles de toutes les revues Nature (NPG), dont la fameuse Nature.

Ce jeu de données a ceci de particulier qu’au lieu de convertir en RDF les métadonnées XML livrées par l’éditeur, nous avons privilégié les données RDF générées par l’éditeur lui-même. Ce sont des données d’assez bonne qualité, plus riches que les livraisons XML par certains côtés, moins par d’autres.

Côté plus, l’éditeur a fait un gros travail d’indexation des articles selon un thesaurus maison et un très précieux travail d’alignement de ce thesaurus vers les versions RDF de Wikipedia et MeSH. Ces alignements nous ont tout particulièrement intéressés, vous vous en doutez…

Côté moins, la version RDF est très pauvre en informations sur les auteurs, tandis que la version XML possède des données d’affiliation et des emails, par exemple.

Il s’agit donc d’un cas singulier, mais prometteur et appelé à se généraliser : l’éditeur ouvre lui-même ses données en RDF, mais ces données ne sont pas exhaustives. Il demeure pertinent d’exiger de lui une livraison de données brutes, XML dans ce cas, pour en extraire de informations précieuses et complémentaires. Selon les cas, on pourra redistribuer ces informations ou bien se contenter de les exploiter en interne, par exemple pour générer des alignements.

Graphes (nombreux) :
http://ns.nature.com/graphs/articles
http://ns.nature.com/graphs/contributors
http://ns.nature.com/graphs/map-article-types-dbpedia
http://ns.nature.com/datasets/npg-core-ontology
http://ns.nature.com/graphs/map-journals-dbpedia
http://ns.nature.com/graphs/map-journals-wikidata
http://ns.nature.com/graphs/map-subjects-dbpedia
http://ns.nature.com/graphs/map-subjects-mesh
http://ns.nature.com/graphs/map-subjects-wikidata
http://ns.nature.com/article-types
http://ns.nature.com/blogs
http://ns.nature.com/terms
http://ns.nature.com/journals
http://ns.nature.com/publish-states
http://ns.nature.com/relations
http://ns.nature.com/review-states
http://ns.nature.com/subjects
http://ns.nature.com/graphs/articles-dbpedia
http://ns.nature.com/summary-types

Modélisation : NPG

Exemple :

<http://ns.nature.com/articles/ajg20001205>	<http://ns.nature.com/terms/hasJournal>	<http://ns.nature.com/journals/ajg> .
<http://ns.nature.com/articles/ajg20001205>	<http://purl.org/ontology/bibo/doi>	"10.1111/j.1572-0241.2000.02953.x" .
<http://ns.nature.com/articles/ajg20001205>	<http://ns.nature.com/terms/hasContributor>	<http://ns.nature.com/contributors/jamie-barkin-s-ajg20001205> .
<http://ns.nature.com/articles/ajg20001205>	<http://purl.org/dc/elements/1.1/title>	"Urinary retention: a systemic complication of botulinum toxin injection therapy for achalasia" .

 

Ebooks Springer

Contenu : plus de mille livres Springer, composés de plus de 300 000 chapitres.

Graphe : http://hub.abes.fr/springer/ebooksLN2011/SPR_EBOOK_ALL_25DEC

Modélisation : ABES

Exemple :

<http://hub.abes.fr/springerB/ebook/0-387-97089-4/w>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://purl.org/ontology/bibo/Book> .
<http://hub.abes.fr/springerB/ebook/0-387-97089-4/w>	<http://hub.abes.fr/namespace/subTitle>	"A Case Study in Pipelined Architecture and Vector Processing" .
<http://hub.abes.fr/springerB/ebook/0-387-97089-4/w>	<http://purl.org/dc/terms/subject>	<http://www.idref.fr/027756688/id> .

 

Les documents HAL

Contenu : environ 8 500 documents ayant pour affiliation Paris 4.

Graphe : http://hub.abes.fr/ccsd/docs/paris4

Modélisation : ABES

Exemple :

<https://hal.archives-ouvertes.fr/resource/document/hal-00201077/w>	<http://vivoweb.org/ontology/core#relatedBy>	<https://hal.archives-ouvertes.fr/resource/document/hal-00201077/authorship/1> .
<https://hal.archives-ouvertes.fr/resource/document/hal-00201077/w>	<http://purl.org/dc/terms/title>	"Diversité linguistique en Nouvelle-Calédonie"@fr .
<https://hal.archives-ouvertes.fr/resource/document/hal-00201077/w>	<http://purl.org/dc/terms/subject>	<https://hal.archives-ouvertes.fr/resource/domain/shs.anthro-se> .

 

Les documents Sudoc

Contenu :

  • Ebooks Dalloz (BND)
  • Livres papier et électroniques correspondant aux ebooks Springer
  • Documents liés aux auteurs IdRef mentionnés dans la base (description bibliographique succincte, non structurée)

Il faudra bien, plus tard, verser tout le Sudoc : toutes les notices ; tous les champs MARC de ces notices . Ce qui est une autre paire de manches. On y travaille…

Graphe :
http://www.sudoc.fr (Ebooks Dalloz)
http://hub.abes.fr/springer/ebooksLN2011/SPR_EBOOK_ALL_25DEC/SUDOC/ELEC (Springer)
http://hub.abes.fr/springer/ebooksLN2011/SPR_EBOOK_ALL_25DEC/SUDOC/PRINT (Springer)
http://www.idref.fr (entre autres, références des documents liés à une autorité chargée dans ce graphe)

Modélisation : ABES

Exemple :

<http://www.sudoc.fr/19116433X/id>	<http://id.loc.gov/vocabulary/relators/aut>	<http://www.idref.fr/060265310/id> .

 

Les référentiels de personnes

 

VIAF

Contenu : chaque mois, nous récupérons et traitons le dump VIAF des alignements entre fichiers d’autorité. Nous n’avons donc que les liens, et pas le contenu des autorités. (Et encore, nous ne gardons qu’une partie des liens, ceux qui relient des fichiers qui ont pignon sur rue. Mais cela fait tout de même près de 24 000 000 de liens.)

Graphe : http://hub.abes.fr/referentiel/linksviaf_03_2016

Modélisation : ABES

Exemple :

<http://viaf.org/viaf/10001226>	<http://www.w3.org/2002/07/owl#sameAs>	<http://www.idref.fr/05019321X/id> .
<http://viaf.org/viaf/10001226>	<http://www.w3.org/2002/07/owl#sameAs>	<http://hub.abes.fr/frbn/13490714> .
<http://viaf.org/viaf/10001226>	<http://www.w3.org/2002/07/owl#sameAs>	<http://id.loc.gov/authorities/names/n85098625> .
<http://viaf.org/viaf/10001226>	<http://www.w3.org/2002/07/owl#sameAs>	<http://www.wikidata.org/entity/Q18911870> .
<http://viaf.org/viaf/10001226>	<http://www.w3.org/2002/07/owl#sameAs>	<http://isni.org/isni/0000000121203999> .

 

ORCID

Contenu : chaque année, nous récupérons et traitons le dump ORCID (nou$ aimerion$ bien pa$$er à un dump men$uel). Il s’agit d’un dump XML que nous convertissons en 111 000 000 triplets RDF.

ORCID annonce 1 500 000 profils ORCID dans leur base :


PREFIX foaf: &lt;http://xmlns.com/foaf/0.1/&gt;
select (count(?s) as ?nb)
from &lt;http://hub.abes.fr/referentiel/ORCID2015&gt;
where { ?s a foaf:PersonalProfileDocument }

mais beaucoup n’ont qu’un nom et un prénom, aucune référence de document, ce qui rend ces profils moins fiables et moins utiles.

Graphe : http://hub.abes.fr/referentiel/ORCID2015

Modélisation : ABES

Exemple :

<http://orcid.org/0000-0002-0018-0588>	<http://www.w3.org/ns/org#hasMembership>	<http://orcid.org/0000-0002-0018-0588/affiliation/1> .
<http://orcid.org/0000-0002-0018-0588>	<http://xmlns.com/foaf/0.1/familyName>	"Cain" .
<http://orcid.org/0000-0002-0018-0588>	<http://xmlns.com/foaf/0.1/givenName>	"Jeff" .
<http://orcid.org/0000-0002-0018-0588>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://xmlns.com/foaf/0.1/Person> .
<http://orcid.org/0000-0002-0018-0588>	<http://www.w3.org/2002/07/owl#sameAs>	<http://hub.abes.fr/referentiel/scopusAuthorID/9247844700> .

 

IdRef

Contenu : Nous aurions pu charger toutes les personnes IdRef, mais ces 2 000 000 d’entités auraient pu noyer le reste des données du démonstrateur. Nous avons seulement chargé les triplets RDF correspondant à un identifiant IdRef mentionné quelque part dans la base (en général, dans les alignements).

Graphe : http://www.idref.fr

Modélisation : ABES

Exemple :

<http://www.idref.fr/02670000X/id>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://xmlns.com/foaf/0.1/Person> .
<http://www.idref.fr/02670000X/id>	<http://www.w3.org/2002/07/owl#sameAs>	<http://data.bnf.fr/ark:/12148/cb11889814d#foaf:Person> .
<http://www.idref.fr/02670000X/id>	<http://xmlns.com/foaf/0.1/name>	"Bacot, Jacques" .
<http://www.idref.fr/02670000X/id>	<http://www.w3.org/2002/07/owl#sameAs>	<http://isni.org/isni/0000000121400095> .

 

L’annuaire des chercheurs de trois laboratoires de Paris 4

Contenu : près de 800 chercheurs, rattachés à trois équipes de recherche de Paris 4. Dans ce graphe, on ne sait pas grand chose de chaque chercheur : son nom, son prénom, son laboratoire, trois informations glanées sur le site de l’université. Aucun LDAP n’a été maltraité pendant cette opération.

Graphe : http://hub.abes.fr/paris4/labos/auteurs

Modélisation : ABES

Exemple :

<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://xmlns.com/foaf/0.1/givenName>	"Mahamane" .
<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://xmlns.com/foaf/0.1/Person> .
<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://www.w3.org/2002/07/owl#sameAs>	<http://www.idref.fr/083406964/id> .
<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://schema.org/memberOf>	<http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/199812914A> .
<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://xmlns.com/foaf/0.1/familyName>	"DJOUDOU" .

 

Les référentiels d’organismes

 

Référentiel National des Structures de Recherche (RNSR)

Contenu : Paris 4 et ses structures

Nous avons converti en RDF un export partiel de la base RNSR.

Graphe : <http://hub.abes.fr/rnsr/structures/paris4&gt;

Modélisation : ABES

Exemple :

<http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/199812927P>	<http://schema.org/name>	"CENTRE D'ETUDE DE LA LANGUE ET DE LA LITTERATURE FRANCAISES DES XVIIEME ET XVIIIEME SIECLES" .
<http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/199812927P>	<http://hub.abes.fr/namespace/sigle>	"UMR8599" .
<http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/199812927P>	<http://schema.org/foundingDate>	"1998" .
<http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/199812927P>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://data.enseignementsup-recherche.gouv.fr/rnsr/vocab/typStruct/UR> .
<http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/199812927P>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://schema.org/Organization> .

 

Référentiel des structures de HAL

Contenu : Paris 4 et ses structures

Nous avons récupéré les données via l’API de HAL et les avons converti en RDF.

Graphe : http://hub.abes.fr/ccsd/structures/paris4

Modélisation : ABES

Exemple :

<https://hal.archives-ouvertes.fr/resource/structure/1349>	<http://hub.abes.fr/namespace/sigle>	"CELLFXXS" .
<https://hal.archives-ouvertes.fr/resource/structure/1349>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<https://hal.archives-ouvertes.fr/resource/typStruct/laboratory> .
<https://hal.archives-ouvertes.fr/resource/structure/1349>	<http://www.w3.org/2002/07/owl#sameAs>	<http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/199812927P> .
<https://hal.archives-ouvertes.fr/resource/structure/1349>	<http://schema.org/name>	"Centre d'\u00E9tude de la langue et de la litt\u00E9rature fran\u00E7aises des\n                XVIIe et XVIIIe si\u00E8cles [CELLFXXS]" .
<https://hal.archives-ouvertes.fr/resource/structure/1349>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://schema.org/Organization> .
<https://hal.archives-ouvertes.fr/resource/structure/1349>	<http://hub.abes.fr/namespace/structCode>	"UMR8599" .

 

Les référentiels d’analyse du contenu

 

RAMEAU

Contenu : dump BnF (avril 2015)

Graphe : http://hub.abes.fr/rameau_avril2015

Modélisation : BnF

Exemple :

<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/2004/02/skos/core#related>	<http://data.bnf.fr/ark:/12148/cb120000024> .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/2000/01/rdf-schema#seeAlso>	<http://catalogue.bnf.fr/ark:/12148/cb12041722r> .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/2002/07/owl#sameAs>	<http://www.idref.fr/028618106/id> .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/2002/07/owl#sameAs>	<http://stitch.cs.vu.nl/vocabularies/rameau/ark:/12148/cb12041722r> .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://www.w3.org/2004/02/skos/core#Concept> .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/2004/02/skos/core#closeMatch>	<http://dewey.info/class/915/> .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/2004/02/skos/core#prefLabel>	"Portugal -- Colonies -- Afrique"@fr .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/2004/02/skos/core#closeMatch>	<http://dewey.info/class/950/> .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://data.bnf.fr/ontology/bnf-onto/FRBNF>	"12041722"^^<http://www.w3.org/2001/XMLSchema#integer> .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/2004/02/skos/core#broader>	<http://data.bnf.fr/ark:/12148/cb11979529k> .
<http://data.bnf.fr/ark:/12148/cb12041722r>	<http://www.w3.org/2004/02/skos/core#narrower>	<http://data.bnf.fr/ark:/12148/cb16661249d> .

 

LCSH

Contenu : dump LCSH (octobre 2014)

Graphe : http://hub.abes.fr/lcsh_27oct2014

Modélisation : LoC

Exemple :

<http://id.loc.gov/authorities/subjects/sh85147558>	<http://www.w3.org/2004/02/skos/core#broader>	<http://id.loc.gov/authorities/subjects/sh96010352> .
<http://id.loc.gov/authorities/subjects/sh85147558>	<http://www.w3.org/2004/02/skos/core#prefLabel>	"Businesswomen"@en .
<http://id.loc.gov/authorities/subjects/sh85147558>	<http://www.w3.org/2004/02/skos/core#narrower>	<http://id.loc.gov/authorities/subjects/sh86006258> .

 

MeSH

Contenu : dump NLM

Graphe : http://id.nlm.nih.gov/mesh

Modélisation : NLM

Exemple :

<http://id.nlm.nih.gov/mesh/D000035>	<http://id.nlm.nih.gov/mesh/vocab#nlmClassificationNumber>	"WM 420.5.A2" .
<http://id.nlm.nih.gov/mesh/D000035>	<http://id.nlm.nih.gov/mesh/vocab#broaderDescriptor>	<http://id.nlm.nih.gov/mesh/D013811> .
<http://id.nlm.nih.gov/mesh/D000035>	<http://www.w3.org/2000/01/rdf-schema#label>	"Abreaction"@en .

 

FMeSH (MeSH en français)

Contenu : Notices FMeSH chargées annuellement dans IdRef

Graphe : http://hub.abes.fr/referentiel/idref/mesh/14042016

Modélisation : ABES

Exemple :

<http://www.idref.fr/038961830/id>	<http://www.w3.org/2004/02/skos/core#inScheme>	<http://id.nlm.nih.gov/mesh> .
<http://www.idref.fr/038961830/id>	<http://www.w3.org/2004/02/skos/core#altLabel>	"tendances (qualificatif)" .
<http://www.idref.fr/038961830/id>	<http://www.w3.org/2004/02/skos/core#altLabel>	"trends" .
<http://www.idref.fr/038961830/id>	<http://www.w3.org/2004/02/skos/core#altLabel>	"TD" .
<http://www.idref.fr/038961830/id>	<http://www.w3.org/2004/02/skos/core#prefLabel>	"tendances"@fr .
<http://www.idref.fr/038961830/id>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://www.w3.org/2004/02/skos/core#Concept> .

 

Thesaurus Nature (NPG)

Contenu : dump NPG

Graphe : http://ns.nature.com/subjects

Modélisation : NPG

Exemple : <http://ns.nature.com/subjects/enteric-nervous-system&gt; (description)

<http://ns.nature.com/subjects/enteric-nervous-system>	<http://www.w3.org/2004/02/skos/core#closeMatch>	<http://id.nlm.nih.gov/mesh/D017615> .
<http://ns.nature.com/subjects/enteric-nervous-system>	<http://ns.nature.com/terms/hasRoot>	<http://ns.nature.com/subjects/biological-sciences> .
<http://ns.nature.com/subjects/enteric-nervous-system>	<http://www.w3.org/2004/02/skos/core#prefLabel>	"Enteric nervous system"@en .
<http://ns.nature.com/subjects/enteric-nervous-system>	<http://www.w3.org/2004/02/skos/core#closeMatch>	<http://dbpedia.org/resource/Enteric_nervous_system> .

 

Journal of economic literature (JEL) classification system

Contenu : dump RDF de cette classification spécialisée

Graphe : http://hub.abes.fr/graph/jel

Modélisation : ZBW

Exemple :

<http://zbw.eu/beta/external_identifiers/jel#C25>	<http://www.w3.org/2004/02/skos/core#prefLabel>	"C25 - Modèles de r"gression discrète et de choix qualitatif; Régresseurs discrets; Proportions; Probabilités"@fr .
<http://zbw.eu/beta/external_identifiers/jel#C25>	<http://www.w3.org/2004/02/skos/core#prefLabel>	"C25 - Discrete Regression and Qualitative Choice Models; Discrete Regressors; Proportions; Probabilities"@en .
<http://zbw.eu/beta/external_identifiers/jel#C25>	<http://www.w3.org/2004/02/skos/core#prefLabel>	"C25 - Diskrete Regressionsmodelle und qualitative Auswahlmodelle; Diskrete Regressoren; Gr\u00F6\u00DFenverh\u00E4ltnisse; Wahrscheinlichkeiten"@de .

 

Les référentiels de bouquet

 

Bouquet Dalloz

Contenu : modélisation en KBART très light de la collection des ebooks Dalloz

Graphe : http://hub.abes.fr/dalloz/bn/kbart/lite

Modélisation : GoKB (modélisation non finalisée)

Exemple :

<http://hub.abes.fr/bndalloz/ebook/9782247041091/m/web/tipp>	<http://www.loc.gov/standards/mods/modsrdf/v1/#locationUrl>	"http://dallozbndpro-pvgpsla5.dalloz-bibliotheque.fr/fr/pvpage2.asp?puc=4236&amp;amp;amp;nu=36&amp;amp;amp;selfsize=1" .
<http://hub.abes.fr/bndalloz/ebook/9782247041091/m/web/tipp>	<http://gokb.org/tipp/#hasTitle>	<http://www.sudoc.fr/191183768/id> .
<http://hub.abes.fr/bndalloz/ebook/9782247041091/m/web/tipp>	<http://gokb.org/tipp/#belongsToPkg>	<https://bacon.abes.fr/package2kbart/dalloz_global_bnd> .

 

Les localisations

 

Bibliothèques possédant le bouquet Dalloz

Contenu : Liste des bibliothèques « possédant » le bouquet dalloz (d’après ERE).

Graphe : http://hub.abes.fr/dalloz/bn/who

Modélisation : ABES

Exemple :

<http://data.enseignementsup-recherche.gouv.fr/uai/0134031L>	<http://schema.org/owns>	<https://bacon.abes.fr/package2kbart/dalloz_global_bnd> .
<http://data.enseignementsup-recherche.gouv.fr/uai/0134031L>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://schema.org/Organization> .

 

Les alignements

Nous considérons que les alignements sont des jeux de données comme les autres, à côté des autres. On a intérêt à les gérer à part et à les diffuser à part : il est important de garder la traçabilité des données, de pouvoir faire le tri entre les données d’origine et les enrichissements ajoutés.
 

Alignements entre des auteurs NPG et ORCID

Contenu : quelques milliers d’alignements entre les identifiants locaux des auteurs NPG et les identifiants ORCID

Graphe : http://ns.nature.com/graphs/contributors/align/orcid

Exemple :

<http://ns.nature.com/contributors/jamie-barkin-s-ajg20001205>	<http://xmlns.com/foaf/0.1/givenName>	"Jamie" .
<http://ns.nature.com/contributors/jamie-barkin-s-ajg20001205>	<http://xmlns.com/foaf/0.1/name>	"Jamie Barkin S" .
<http://ns.nature.com/contributors/jamie-barkin-s-ajg20001205>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://ns.nature.com/terms/Contributor> .
<http://ns.nature.com/contributors/jamie-barkin-s-ajg20001205>	<http://xmlns.com/foaf/0.1/familyName>	"Barkin S" .

 

Alignements entre des auteurs NPG et ISNI

Contenu : quelques milliers d’alignements entre les identifiants locaux des auteurs NPG et les identifiants ORCID, obtenus via Qualinca

Graphe : http://ns.nature.com/graphs/contributors/align/isni

Exemple :

<http://ns.nature.com/contributors/w-h-irwin-mclean-ng.276> owl:sameAs <http://isni.org/isni/0000000124496002> .

 

Alignements entre des auteurs HAL et IdRef

Contenu : quelques centaines d’alignements entre les auteurs HAL et les auteurs IdRef. Beaucoup d’autres sont prévus.

Graphe : http://hub.abes.fr/ccsd/docs/paris4/align/idref

Exemple :

<https://hal.archives-ouvertes.fr/resource/author/1087935>	<http://www.w3.org/2002/07/owl#sameAs>	<http://www.idref.fr/111217776/id> .

 

Alignements entre des chercheurs de Paris 4 et IdRef

Contenu : La grande majorité de nos chercheurs de Paris 4 alignés vers IdRef.

Graphe : http://hub.abes.fr/paris4/labos/auteurs/align/idref

Exemple :

<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://xmlns.com/foaf/0.1/givenName>	"Mahamane" .
<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>	<http://xmlns.com/foaf/0.1/Person> .
<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://www.w3.org/2002/07/owl#sameAs>	<http://www.idref.fr/083406964/id> .
<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://schema.org/memberOf>	<http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/199812914A> .
<http://hub.abes.fr/paris4/person/qe_paris4_1004>	<http://xmlns.com/foaf/0.1/familyName>	"DJOUDOU" .

 

Alignements entre des auteurs de Persée et IdRef

Contenu : Plus de 10 000 alignements entre Persée et IdRef. Des milliers d’autres seront bientôt générés, dans le cadre d’une fructueuse collaboration avec Persée. Les URIs qui identifient les auteurs Persée sont pour l’instant fictives, mais nos collègues Lyonnais travaillent à l’exposition de leur base sur le web de données.

Graphe : http://hub.abes.fr/persee/auteurs/align/idref

Exemple :

<http://data.persee.fr/person/10004#Person>	<http://www.w3.org/2002/07/owl#sameAs>	<http://www.idref.fr/068894449/id> .

 

Alignements entre auteurs Nature (NPG)

Contenu : Plus de 10 000 alignements entre auteurs Nature. Dans le dump RDF de Nature, les auteurs ne sont pas identifiés : si un même auteur a publié deux articles, il apparaîtra avec deux URIs différentes. Pour l’identifier, on peut soit l’aligner sur un référentiel extérieur (ce qu’on fait par ailleurs, dans le cadre de notre projet de recherche Qualinca), soit, à défaut, aligner entre elles les URIs sous lesquelles il est nommé au sein du jeu de données. C’est ce qui a été fait en exploitant l’email, absent du dump RDF mais présent dans les données XML ISTEX : si deux personnes ont le même email et des noms très proches, alors on considère que c’est la même personne. A terme, nous créerons des URIs pivot vers lesquelles pointeront toutes les URIs rapprochées. Pour l’instant, on ajoute des relations owl:sameAs entre chaque paire d’URIs, ce qui est plus bavard.

Graphe : http://ns.nature.com/graphs/contributors/align/email

Exemple :

<http://ns.nature.com/contributors/aaron-f-straight-ncb1899>    owl:sameAs <http://ns.nature.com/contributors/ns1:aaron-f-straight-nature10379> .

 

Alignements entre les auteurs Springer et IdRef

Contenu : Près de 20 000 alignements entre des auteurs d’ebooks (voire de chapitres) et des auteurs IdRef. D’autres alignements seront générés, soit par programme, soit par les catalogueurs du réseau Sudoc, notamment dans le cadre du dispositif CERCLES.

Graphe : http://hub.abes.fr/springer/ebooksLN2011/SPR_EBOOK_ALL_25DEC/personnes/idref

Exemple :

<http://hub.abes.fr/springerB/ebook/10904251/caofrederic>  owl#sameAs  <http://www.idref.fr/094231737/id> .

 

Alignements entre les documents Springer et RAMEAU

Contenu : Plus de 70 000 liens entre les documents Springer et les identifiants IdRef de RAMEAU, obtenus grâce à l’alignement entre le thesaurus d’indexation matière de Springer, LCSH et RAMEAU.

Graphe :
Liens les documents et le RAMEAU IdRef : http://hub.abes.fr/springer/ebooksLN2011/SPR_EBOOK_ALL_25DEC/rameauppn
Alignements entre le RAMEAU officiel (BnF) et le RAMEAU Idref : http://hub.abes.fr/rameau_avril2015/ppns
Alignements entre le thesaurus d’indexation matière de Springer, LCSH et RAMEAU : http://hub.abes.fr/theses/referentiel/concepts/springer/8janvier2016

Exemple :

<http://hub.abes.fr/springerB/ebook/0-387-97089-4/w>	dcterms:subject	<http://www.idref.fr/027239519/id> .

 

Alignement entre les domaines HAL et Dewey

Contenu : Alignement manuel entre les domaines HAL et la classification Dewey. Ces alignements de concepts sont toujours délicats. Ils mériteraient d’être revus et amendés de manière collaborative, d’autant qu’ils peuvent être utiles à beaucoup de collègues dans les bibliothèques et les laboratoires.
Depuis la fermeture du site dewey.info par OCLC, les URI Dewey sont en déshérence.

Graphe :
http://hub.abes.fr/ccsd/domaines/align/dewey

Exemple :

<https://hal.archives-ouvertes.fr/resource/domain/info.info-ai>	 skos:closeMatch  <http://dewey.info/class/006.3/> .

 

Alignement entre les structures de recherche de Paris 4 dans les référentiels RNSR, HAL et IdRef

Contenu : Alignement manuel.

Graphe :
http://hub.abes.fr/alignements/structures/rnsr/idref/ccsd

Exemple :

<https://hal.archives-ouvertes.fr/resource/structure/74682>  owl:sameAs  <http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/200615326M> .
<https://hal.archives-ouvertes.fr/resource/structure/107600>  owl:sameAs  <http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/200615326M> .
<http://www.idref.fr/031896596/id>  owl:sameAs  <http://data.enseignementsup-recherche.gouv.fr/rnsr/structure/200615326M> .

BACON et la labellisation des données : à quelle aune mesure-t-on la qualité d’un fichier KBART ?

rvb-sloganLa recommandation KBART  , portée par la NISO, a une immense qualité : elle est relativement simple à comprendre et à implémenter. Un fichier KBART doit répondre à des exigences très peu contraignantes de prime abord : des intitulés de colonnes normalisés et parlants (‘publication_title’, ‘first_author’, …), une sortie sous la forme d’un fichier .txt, format universel s’il en est, encodage en UTF-8,… Faire un fichier KBART à la main  n’est donc pas compliqué en soi. La première vérification faite  à l’ABES consiste donc à vérifier que le fichier fourni par un éditeur remplit bien toutes les obligations pour qu’il soit conforme à la recommandation KBART. Sans entrer dans les détails de la recommandation, soulignons ici que nous sommes particulièrement vigilants sur les points suivants :

•    Nom du fichier normalisé (Editeur_consortium/région_package_date.txt)
•    Encodage UTF-8
•    Fichier tabulé (.tsv, .csv, .ssv)
•    Présence des 25 colonnes obligatoires
•    Colonnes correctement nommées
•    Colonnes correctement remplies (respect de la norme ISO 8601 pour les dates, de la description de la volumaison, des valeurs fermées le cas échéant,…)

Les difficultés émergent lorsque l’on essaye de confronter la simplicité apparente de la recommandation avec la réalité, parfois tordue il est vrai, des plates-formes   de périodiques et ou de livres en ligne. KBART est simple, simpliste si on le compare au MARC. La version 2 de la recommandation améliore sa précision (prise en compte des livres électroniques, de l’open access, de l’histoire d’un périodique), sans doute au détriment de sa facilité d’implémentation qui heureusement reste élevée, mais elle n’est toujours pas en mesure de décrire les cas complexes  .
Ce n’est pas un problème en soi : KBART se focalise sur l’accès à des ressources qui peuvent – et doivent – être décrites dans des formats adaptés si on veut en présenter toute la richesse et la complexité. Pour autant, pour que cette complémentarité     entre description bibliographique (MARC) et métadonnées permettant l’accessibilité aux documents (KBART) puisse se faire, deux éléments sont impératifs au niveau du fichier KBART:

•    La description de l’accès à la ressource doit être pertinente : le champ title_url doit effectivement pointer vers la ressource, le champ title_id doit permettre de comprendre comment se structurent les liens d’accès aux volumes, fascicules, articles ou chapitres de la ressource.
•    Les identifiants utilisés (ISSN et ISBN) doivent être corrects et le découpage de l’histoire d’une revue en ses différents avatars doit se retrouver en ligne, comme d’ailleurs le stipule une autre recommandation, PIE-J.

L’analyse effectuée par l’ABES pour vérifier la qualité de ces données débouche sur un diagnostic transmis à l’éditeur qui sait alors précisément par où ses métadonnées pèchent. S’ensuit un dialogue avec ce dernier, voire un accompagnement de ses équipes techniques qui doit aboutir à une mise à jour de la plate-forme, processus qui peut être long et difficile (sous-traitance, restructuration de certains contenus,…). A l’issue de ce dialogue et au vu des améliorations apportées par l’éditeur, l’ABES peut alors attribuer le label de qualité de données, preuve de l’engagement de l’éditeur dans sa démarche globale d’amélioration de description et de signalement de son contenu. Si un éditeur ne peut que fournir un fichier KBART syntaxiquement correct mais ne respectant pas les recommandations plus fines de description, il verra ses fichiers intégrés dans BACON  tels quels et sans label, puisqu’il n’est pas question de modifier les fichiers se rapportant à des produits en abonnement courant.
La démarche est un peu différente pour les bouquets ISTEX. Dans ce cas, les fichiers KBART sont générés non pas par l’éditeur mais par l’équipe du Hub de métadonnées de l’ABES. Les découpages de revues qui ne sont pas présents sur le site de l’éditeur sont quand même indiqués sur le fichier KBART  . L’inconvénient de cette pratique est que la matière première utilisée, les listes contractuelles et le SUDOC, ne permettent pas par exemple de retrouver systématiquement toutes les informations de volumaison , notamment le numéro du premier volume/fascicule appartenant à une revue que l’éditeur n’a pas identifié comme telle (l’équipe du HUB est cependant en train de tenter de régler ce problème en agrégeant les informations trouvées dans les métadonnées d’articles). Son avantage en revanche est de pousser les éditeurs à s’interroger sur leurs pratiques  et à les faire éventuellement évoluer, comme est en train de le faire la Royal Society of Chemistry. En ce sens la démarche adoptée par le HUB rejoint celle de BACON.

Dans un prochain billet, nous expliquerons en détail comment nous réalisons les différentes vérifications.