Lodex permet l’enrichissement et le traitement des colonnes du jeu de données à travers l’usage de web service. Cette fonctionnalité peut également être utilisées en “mode avancé” pour créer de nouvelle colonne à partir des colonnes existantes, voici quelques recettes prêtes à l’emploi :
Créer une colonne avec une valeur fixe et identique
[assign] path = value value = fix('OK')
Ces instructions créent une colonne où chaque ligne a comme valeur “OK”
Créer une colonne avec une valeur fixe et identique (bis)
[assign] path = value value = OK
Ces instructions créent une colonne où chaque ligne a comme valeur “OK”
Créer un champ booléen indiquant la présence de certaines valeurs
[assign] path = contientAouB value = get('value).castArray().some(v => ['VAL A', 'VAL B'].includes(v))
Ces instructions créent une colonne (contientAouB) contenant une valeur booléenne indiquant si certaines valeurs (VAL A ou VAL B) sont contenues dans une liste ou un tableau de chaines de caractères (value).
Créer un champ booléen indiquant la présence de certaines valeurs (bis)
[assign] path = contientPresqueMIL value = get('value').castArray().some(v => String(v).search(/mil[aeiuo]+/i) !== -1 )
Ces instructions créent une colonne (contientPresqueMIL) contenant une valeur booléenne indiquant si certaines valeurs contenues dans une liste ou un tableau de chaines de caractères respectent une expression régulière particulière (/mil[aeiou]+/i).
Créer une colonne à partir de la valeur d’un objet d’une autre colonne
[assign] path = value value = get('value.unpaywall.is_oa')
Ces instructions créent une colonne contenant une valeur (is_oa) contenu dans l’objet d’une autre colonne (unpaywall)
Créer une colonne à partir de la valeur modifiée d’une autre colonne
[assign] path = value value = get('value.definition@fr', 'VIDE').toLower().prepend('PREFIX>').append('<SUFIXE')
Ces instructions créent une colonne où chaque ligne contient la valeur de la colonne “definition@fr” mise en minuscule et à laquelle est ajouté un préfixe et un suffixe. Si la colonne “definition@fr” est vide ou n’existe pas, la valeur par défaut sera “VIDE”.
Remplacer les lignes vides ou inexistantes d’une colonne par un texte prédéfini
[assign] path = value value = get('value.definition@en') [swing] test = get('value').isEmpty() [swing/assign] path = value value = fix('non renseigné')
Ces instructions remplacent les lignes vides ou inexistantes par la chaîne “non renseigné”.
Modifier le contenu de toutes les lignes d’une colonne sans en créer une nouvelle
[assign] path = value value = get('value.title').capitalize()
Ces instructions transforment toutes les valeurs de la colonne “title” en s’assurant que le premier caractère sera en majuscule et que les suivants seront en minuscule.
IMPORTANT : pour modifier directement une colonne, il est nécessaire de créer un enrichissement ayant le même nom que la colonne à modifier.
Remplacer la colonne URI générée automatiquement par une colonne préexistante
[assign] path = value value = get('value.UT')
Ces instructions utilisent la colonne “UT” pour remplacer la colonne “uri” générée automatiquement.
NOTE : pour modifier directement une uri, il est nécessaire de créer un enrichissement ayant comme nom “uri”.
WARNING : la colonne uri doit impérativement contenir des valeurs distinctes. Si ce n’est pas le cas, la publication et d’autres enrichissements seront impossibles.
Créer une colonne URI avec valeurs distinctes.
[identify] path = value
Ajouter un identifiant pérenne de type ARK
[assign] path = value value = get('value.uri') [expand] size = 10 path=value [expand/URLConnect] url = https://ark-tools.services.inist.fr/v1/67375/stamp?subpublisher=XXX
Ces instructions vont attribuer un identifiant pérenne à chaque ligne. XXX est à remplacer par le code du “subpublisher” approprié et enregistré dans le registre de l’Inist : http://inist-registry.ark.inist.fr/
WARNING : Chaque identifiant ARK créé par ce web service est créé uniquement une seule fois. Si il n’est pas utilisé, l’identifiant est perdu.
ASTUCE : Pour remplacer l’uid attribué automatiquement par Lodex, il suffit de créer un enrichissement nommé uri.
Remplacer des UID par des identifiants ARK
[assign] path = value value = get('value.uri') [swing] test = get('value').startsWith('uid:/') [swing/expand] size = 10 path = value [swing/expand/URLConnect] url = https://ark-tools.services.inist.fr/v1/67375/stamp?subpublisher=XXX
Ces instructions vont attribuer un identifiant pérenne à chaque ligne si et seulement si elle possède un uid comme uri. XXX est à remplacer par le code du “subpublisher” approprié et enregistré dans le registre de l’Inist : http://inist-registry.ark.inist.fr/
WARNING : Chaque identifiant ARK créé par ce web service est créé uniquement une seule fois. Si il n’est pas utilisé, l’identifiant est perdu.
ASTUCE : Pour remplacer l’uid attribué automatiquement par Lodex, il suffit de créer un enrichissement nommé uri.
Créer une colonne avec le préfixe d’un DOI
[assign] path = value value = get('value.DI').split('/').head()
Modifier et/ou corriger certaines valeurs d’une colonne
[assign] path = value value = get('value.Revue').replace('Nature Phys.','Nature Physics.')
NOTE : pour modifier directement une colonne, il est nécessaire de créer un enrichissement ayant comme nom le même nom que la colonne à modifier.
Créer une colonne en s’assurant que toutes les lignes contiennent un tableau (même vide)
[assign] path = value value = get("value.Entités nommées (Unitex).placeName", [])
Ces instructions créent une colonne à partir du sous champ “placeName” de la colonne “Entités nommées (Unitex). S’il n’y a pas de valeur, le tableau sera vide.
Créer une colonne en séparant des champs multivalués (en fonction d’un séparateur) en vue de leur enrichissement
[assign] path = value value = get("value.Keywords").toString().split(';').filter(Boolean)
Ces instructions créent une colonne à partir du champ “Keywords” en découpant chaque ligne en fonction du caractère “;” . Le résultat est un tableau de valeur.
Créer une colonne à partir de la concaténation de deux autres colonnes
[assign] path = value value = fix(self.value.Title, self.value.Abstract).join('>')
Ces instructions créent une colonne à partir des champs “Title” & “Abstract” en les concaténant dans une même colonne. Dans cet exemple, les 2 valeurs seront collées avec le caractère “>”
Créer une colonne à partir de la concaténation de deux autres colonnes (bis)
[assign] path = value value = get("value.Title").append(">").append(self.value.Abstract)
Ces instructions créent une colonne à partir des champs “Title” & “Abstract” en les concaténant dans une même colonne. Dans cet exemple, les 2 valeurs seront collées avec le caractère “>”
Créer un objet par défaut pour toutes les lignes qui contiennent la valeur n/a
[assign] path = value value = get("value.loterre") [swing] test = get('value').isEqual('n/a') [swing/replace] path = value.information value = Aucune réponse
Ces instructions créent une colonne à partir du champs “loterre” et remplacent toutes cellules contenant la valeur n/a par un objet :
{ information: "Aucune réponse" }
Récupérer dans une liste d’objets deux valeurs simples
[assign] path = value value = get('value.concepts loterre').map(item => _.pick(item, ['prefLabel@en', 'about']))
Ces instructions créent une colonne à partir d’une liste d’objets en simplifiant chaque objet pour ne garder que 2 champs différents de chaque objet.
Dans cet exemple, seules les propriétés ‘prefLabel@en’ et ‘about’ seront conservées. Les autres champs de l’objet sont ignorés.
Récupérer dans un valeur dans une liste de liste d’objets
[assign]
path = lesAdresses
value = get('auteurs').map('affiliations').flatten().map('address')
Ces instructions créent une colonne des adresses contenues dans l’objet affiliation lui-même étant dans l’objet address. Les champs affiliations et address sont des listes d’objets, on utilisera donc “map” à la place de “get”.
Transformer une liste d’objets en liste de valeurs simples
[assign] path = value value = get("value.Catégories").map((categorie) =>`${categorie.rang}-${categorie.code.value}`))
Ces instructions créent une colonne à partir d’une liste d’objets en créant une chaîne de caractères composée par 2 champs différents de chaque objet.
Dans cet exemple, “item.rang” et “item.code.value” seront collées avec le caractère “-”. Les autres champs de l’objet sont ignorés.
Transformer une liste d’objets en liste de valeurs simples (bis)
[assign] path = value value = get("value.Domaines").map((domaine, i) => `${i+1} - ${domaine.code.value}`)
Ces instructions créent une colonne à partir d’une liste d’objets en créant une chaîne de caractères composée par 2 champs différents de chaque objet.
Contrairement à l’exemple précédent, le rang est calculé automatiquement à partir de l’indice de l’élément dans le tableau.
Filtrer une liste de valeurs avec une autre liste (intersection)
[assign] path = value value = get("value.pays").filter(x => ['ITALIE', 'ALLEMAGNE', 'FRANCE', 'BELGIQUE'].includes(x))
Ces instructions créent une colonne à partir d’une liste de pays en s’assurant qu’ils ont présents dans une liste spécifique.
Dans cet exemple, la liste résultant du traitement contiendra uniquement les pays déclarés dans le liste de 4.
Filtrer une liste de valeurs avec une autre liste (différence)
[assign] path = value value = get("value.pays").filter(x => !['ITALIE', 'ALLEMAGNE', 'FRANCE', 'BELGIQUE'].includes(x))
Ces instructions créent une colonne à partir d’une liste de pays en excluant les pays présents dans une liste spécifique.
Dans cet exemple, les 4 pays seront exclut de la liste résultant du traitement.
Nettoyer une liste de termes (simple)
[assign] path = value value = get('Termes génériques').map(v => String(v).trim())
Ces instructions suppriment les caractères parasites au début et en fin de chaque terme de la liste.
Nettoyer une liste de termes (avancé)
[assign] path = value value = get('Termes génériques').map(v =>_.chain(v).deburr().replace(/[^\w]/, ' ').replace(/\s+/, ' ').trim().lowerCase().value())
Ces instructions appliquent une série de transformation sur l’ensemble des termes d’une liste.
Dans cet exemple deburr supprimera les caractère accentués, replace supprimera tous les caractères non alphanumériques et remplacera tous les espaces doubles par des espaces simples, trim supprimera les espaces en fin et début de mot, et lowerCase mettra tous les mots en minuscules.
Créer une colonne avec une valeur JSON
[assign] path = value value = get('value.jsonValue').thru(JSON.parse)
Ces instructions créent une colonne à partir d’une autre colonne (nommée jsonValue) contenant des valeurs formatées en JSON.
Inverser des valeurs dans un tableau (simple)
[assign] path=value value=get("value.nomdecolonne").reverse()
Cette instruction inverse les valeurs à l’intérieur d’un tableau. [“A”,”B”,”C”] devient [“C”,”B”,”A”]
Inverser des bouts de chaîne de caractères (avancé)
[assign] path=value value=get("value.nomdecolonne").map(x=>x.split(", ").reverse().join(", "))
Cet enchaînement d’instructions transforme, par itération, des chaînes de caractères contenues dans un tableau.
Dans un tableau de type noms d’auteurs tel que [“Durand, Jacques”,”Dubois, Daniel”] on modifie chaque valeur (map) que l’on transforme en tableau afin d’inverser l’ordre, puis on la restitue en string. Ce qui donne [“Jacques, Durand”,”Daniel, Dubois”].
Pour aller plus loin
Les recettes Lodex sont composées d’une série d’instructions qui s’enchaînent séquentiellement pour chaque ressource du dataset.
Les instructions ont un nom entre crochet, exemple :
[assign]
Chaque instruction possède ou non plusieurs paramètres. Chaque paramètre a un nom et une valeur, exemple:
[assign] path = doi value = 0.1007/s00300-012-1156-9
la valeur d’un paramètre peut être dynamique, c’est à dire calculé à partir de chaque ressource, ces calculs sont réalisés par un enchaînement de fonctions, une fonction se reconnaît par un nom suivi de parenthèses, exemple:
[assign] path = doi value = get("value.crossrefID")
La liste des instructions utilisables dans lodex et leurs paramètres associés est disponible ici : https://inist-cnrs.github.io/ezs/#/plugin-core
La liste des fonctions utilisables dans les paramètres est disponible ici: https://lodash.com/docs/4.17.15