OpenRefine

De Bibliopedia
Aller à : navigation, rechercher

OpenRefine (anciennement Google Refine) destinée à la transformation et au nettoyage de fichiers de données.

Pistes d'usages[modifier]

En combinaison avec les web services abes[modifier]

Fichier après enrichissement

En partant d'un fichier dont une colonne contient des isbn.

Récupération des PPN associés aux isbn[modifier]

  • Colonne ISBN > Edit column > Add column by fetching url
  • Donner un nom à la colonne et utiliser comme expression : "http://www.sudoc.fr/services/isbn2ppn/" + value + "&format=text/json" (conserver les guillemets). On pourra aussi diminuer le délai entre deux interrogations au serveur (5000ms = 5s, 1000ms ou 500ms semble acceptable).
  • On analysera ce contenu json en créant une nouvelle colonne à partir de ce contenu Json > Edit column > Add column based on this column en utilisant l'expression suivante :
// Attention, ce script va bugger dans le cas où on a un isbn qui correspond exactement à 19 PPN
if (value.parseJson().sudoc.query.result.length() == 19, 
  value.parseJson().sudoc.query.result.ppn,
  forEach(
    value.parseJson().sudoc.query.result, 
    item,
    item.ppn
  ).join(", ")
)
  • On pourra ensuite "éclater" la cellule sur plusieurs lignes dans le cas où l'on a plusieurs PPN : Edit cells > Split multi-valued cells et en utilisant le séparateur ","

Récupération des RCR associés à des PPN[modifier]

Sur le même principe que ci-dessus on pourra appeler le WS multiwhere pour récupérer la liste des PPN : "http://www.sudoc.fr/services/multiwhere/" + value + "&format=text/json"

On peut éventuellement vérifier la présence de l'ouvrage dans l'une des bibliothèques qui nous intéresse à l'aide de la formule suivante à partir de la colonne contenant le résultat Json de l'appel à multiwhere :

filter(
  value.parseJson().sudoc.query.result.library, 
  item,
  item["rcr"] == "010532201"
).join(",")

Dans la colonne résultante, on pourra créer une facette automatique pour isoler les cellules qui contiennent quelque chose.

Mise à jour d'un fichier de PPN avec les PPN fusionnés[modifier]

En partant d'un fichier de PPN et en utilisant le WS merged on va pouvoir contrôler les PPN, voir lesquels n'existent plus et les remplacer par le PPN de la notice fusionnée. Pour cela on va partir d'un fichier qui contient une colonne nommée "PPN" (le mieux est de charger un fichier au format CSV pour s'affranchir des problèmes liés aux 0 situés en début de PPN, en pensant au moment de la création du projet à décocher la case Parse cell text into numbers, dates, ...).

À partir de cette colonne PPN, on va aller interroger le WS merged (clic sur la flèche en haut de colonne > Edit Column > Add column by fetching URL, penser à réduire le temps entre deux appels, fixé par défaut à 5 secondes, cela peut être long pour un fichier conséquent) à l'aide de l'expression suivante :

"http://www.sudoc.fr/services/merged/"+value+"&format=text/json"

On obtient alors une colonne qui va contenir, pour les notices non fusionnées un tableau JSON vide ({"sudoc":null}) et pour les autres les informations sur le PPN source et le PPN cible sous la forme suivante :

{"sudoc":{"query":{"ppn":"PPN source","result":{"ppn":"PPN cible"}}}}

On peut alors partir de cette colonne pour créer une nouvelle colonne contenant seulement le PPN cible (s'il existe), en ajoutant (clic sur la flèche de haut de colonne > Edit column > Add column based on this column) en utilisant l'expression suivante :

value.parseJson()["sudoc"]["query"]["ppn"]

Dans la nouvelle colonne ainsi créée, les lignes correspondant à des PPN ayant été fusionnés recevront donc le nouveau PPN, les autres la valeur null. On peut alors créer une dernière colonne qu'on appellera PPN final et qui correspondra : soit au PPN fusionné quand il existe, soit au PPN original. Pour cela sur la dernière colonne créér, on cliquera sur la flèche de haut de colonne > Edit column > Add column based on this colum et on entrera l'expression suivante :

if ((value != null), value, cells["PPN"].value)

Cette expression indique à OpenRefine de faire un test : si la colonne n'est pas null on reprend la valeur dans la nouvelle colonne créée (value), sinon on va chercher la valeur dans une autre colonne (ici la colonne PPN, à adapter en fonction du nom de la colonne dans votre fichier initial) : cells["PPN"].value.

Recherche des ID idref de personnes physiques[modifier]

Voir http://punktokomo.abes.fr/2015/07/10/911/

Contrôle d'accès à des ouvrages de numilog[modifier]

En deux mots : vérifier que l'on a toujours accès à des ouvrages acquis il y a quelques années

Il y a quelques années une bibliothèque avait passé une commande chez numilog pour des ouvrages en achat pérenne ET des ouvrages en abonnement. Aujourd'hui il faut vérifier qu'il ne reste plus dans le catalogue que des ouvrages pour lesquels on dispose encore d'un accès (les achats pérennes, les abonnements étant désormais terminés). Il suffit pour cela de vérifier que le bouton "Télécharger" est présent sur la page (exemple).

Toutes les pages d'ouvrages sont accessibles par une url toujours construite de la même manière : http://www.numilog.com/bibliotheque/u-bordeaux3/fiche_livre.asp?idprod=XXX où XXX correspond à un identifiant de la notice. On va partir pour le contrôle d'un fichier dont nous disposons et qui contient un identifiant par ligne. On va donc créer un projet avec au départ cette seule colonne.

Sur cette première colonne, on va cliquer sur la flèche dans l'en-tête et choisir : "Edit column > Add column by fetching URLs". On choisit un nom à cette colonne (code source page) et on va utiliser l'expression suivante pour construire les url :

"http://www.numilog.com/bibliotheque/u-bordeaux3/fiche_livre.asp?idprod=" + value.replace(".0", "")

Explication : on assemble le préfixe commun à toutes les url avec la valeur présente dans la colonne de base (après avoir supprimé le .0 qui se trouvait à la fin de toutes ces valeurs que Google Refine avait reconnues comme des nombres). Après validation, OpenRefine va aller récupérer dans une nouvelle colonne le code source des pages distantes.

On peut alors à partir de cette colonne "code source" créer une nouvelle colonne qui va nous indiquer si oui ou non le document est disponible au téléchargement. Pour cela on va vérifier la présence dans le code source de l'image b_telecharger_down.gif qui correspond au bouton. On clique sur la flèche en haut de la colonne puis : Edit column > Add column based on this column. On va alors créer une colonne qu'on va appeler "Disponible ?" par exemple et à laquelle on va associer une valeur vrai ou faux selon que le bouton télécharger est disponible. Pour cela il suffit de vérifier que le code source de la page contient (contains) l'image. On utilise donc l'expression :

value.contains("b_telecharger_down.gif")

Une fois cette colonne créée on peut supprimer la colonne code source qui ne nous est plus utile (flèche de haut de colonne > Edit column > Remove this column). Il nous reste alors une colonne identifiant et une colonne "Disponible ?". On va aller en haut de cette dernière colonne pour choisir d'ajouter une facette : Facet > Text facet. La facette va apparaître sur la gauche et devrait contenir deux valeurs : true & false. Tous les false correspondent à des notices qui ne sont plus accessibles et qu'il va falloir retirer de son catalogue.

Interrogation de la base Relire[modifier]

Objectif : vérifier si des auteurs sont dans la base Relire

Instructions d'installation de Google Refine

Préalable : disposer d'une liste des noms de famille des auteurs, par exemple sous la forme d'un tableur contenant une colonne AUTEUR. Créer un projet à partir de ce tableur.

Sur la colonne AUTEUR, cliquer sur la flèche dans l'en-tête et choisir : "Edit column > Add column based on column". Nommer cette colonne, ici RECHERCHE. Valeur de la colonne (grel) :

"http://relire.bnf.fr/recherche?champsTitre=&champsEditeur=&champsDate=&typer=a&champsAuteur=" + value.replace(".0", "")

Toujours sur la colonne AUTEUR, cliquer sur la flèche dans l'en-tête et choisir : "Edit column > Add column by fetching URLs". Nommer cette colonne, ici PAGE. Valeur de la colonne (grel) :

"http://relire.bnf.fr/recherche?champsTitre=&champsEditeur=&champsDate=&typer=a&champsAuteur=" + value.replace(".0", "")

Sur la colonne PAGE, cliquer sur la flèche dans l'en-tête et choisir : "Edit column > Add column based on column". Nommer cette colonne, ici TEST. Valeur de la colonne (grel) :

value.contains("Aucun résultat")

Si la valeur est false, alors ce nom d'auteur est dans la base Relire et la colonne RECHERCHE permet d'aller vérifier la liste des titres sur Relire. Si la valeur est true, la recherche dans Relire ne renvoie pas de résultat pour cet auteur.

Pour plus de lisibilité, on peut masquer la colonne PAGE : flèche dans l'en-tête, puis "View > Collapse this column". Sur la colonne TEST, flèche dans l'en-tête, puis "Facet > Text facet" permettra ensuite de ne sélectionner que les lignes portant "false", soit la liste des auteurs potentiellement concernés par Relire.

Extraire des données d'une page web[modifier]

Objectif : à partir d'un identifiant (ici le code-barre) récupérer une page web et en extraire des données qui nous manquent (ici l'ISBN)

OpenRefine dispose d'une fonction bien utile d'analyse de page web : parseHtml(). Cette fonction peut être utilisée pour accéder facilement au contenu d'une page web. Dans cet exemple la demande est de trouver les ISBN correspondant à une liste de codes barres exemplaires. Pour cela, nous avons besoin d'un OPAC interrogeable à partir d'un code barre. C'est le cas de Babord+, le catalogue utilisé à Bordeaux qui à partir permet d'utiliser des URL de ce type : http://babordplus.univ-bordeaux.fr/resultat.php?type_rech=ra&index[]=cab&value[]=3SCD0002498. On peut donc en partant d'une colonne code barre, dans un premier temps récupérer le code source des pages correspondantes. "Add column by fetching URL" puis choisir l'expression (en adaptant à son catalogue :

"http://babordplus.univ-bordeaux.fr/resultat.php?type_rech=ra&index[]=cab&value[]=" + value

À partir de là on va devoir extraire de l'information du code HTML de la page. Pour cela on dispose de la fonction parseHtml() qui permet d'accéder à la plupart des informations de la page. Dans le cas qui nous intéresse on sait qu'à chaque ligne l'ISBN est utilisé pour appeler la vignette de couverture, qu'elle existe ou non, et que cette vignette est contenue dans un div ayant pour class "sid-image". On va donc construire à partir de la colonne contenant le code source (Edit columns > Add column based on this column) le code suivant :

split(value.parseHtml().select("div.sid-image")[0].select("img")[0].htmlAttr("src"), "=")[1]

Si l'on détaille les opérations utilisées, en partant de value, le code source de la page :

value.parseHtml().select("div.sid-image") // renvoie la liste des div ayant pour class sid-image
value.parseHtml().select("div.sid-image")[0] // retourne le premier élément du tableau (on n'en a qu'un de toutes manières)
value.parseHtml().select("div.sid-image")[0].select("img") // renvoie les balises <img> qui se trouvent dans le div
value.parseHtml().select("div.sid-image")[0].select("img")[0] // retourne la première image (on n'en a qu'une de toutes manières)
value.parseHtml().select("div.sid-image")[0].select("img")[0].htmlAttr("src") // retourne l'attribut src de l'image, du type "http://babordplus.univ-bordeaux.fr/vignette.php?isbn=9780333393970"

// Le split général nous permet alors de scinder (''to split'') cette chaîne autour du signe = 
split(value.parseHtml().select("div.sid-image")[0].select("img")[0].htmlAttr("src"), "=")

// On récupère la deuxième zone, donc ce qui se trouve après le = (indice 1, comme on l'a vu dans le reste de l'exemple [0] correspond à la première case du tableau, logiquement, [1] est la deuxième.
split(value.parseHtml().select("div.sid-image")[0].select("img")[0].htmlAttr("src"), "=")[1]

// On a bien l'ISBN
9780333393970

Vérification d'un chantier de recotation[modifier]

Dans le cadre d'une opération de recotation, chaque semaine, un fichier contenant : code barre, nouvelle cote, identifiant de notice est envoyé au service informatique. OpenRefine est utilisé pour vérifier que la recotation a bien été effectuée pour tous les exemplaires (cela pose parfois problème quand le code barre a été remplacé, que l'exemplaire a été rattaché à une nouvelle notice ...). Pour cela, on charge le fichier contenant a minima le code barre et la nouvelle cote attendue.

À partir de la colonne code barres : Edit column > Add colmun by fetching URL et on va utiliser la formule suivante :

"http://babordplus.univ-bordeaux.fr/notice.php?q=cab:%28"+value+"%29&ct=bx3_ws"

Cette opération va avoir pour effet de nous charger dans une nouvelle colonne le code source de la page Babord+ (notre Opac) qui correspond à l'affichage de la notice qui correspond au code barre passé en paramètre. À partir de ce code source HTML : Add a column > Based on this column puis on va entrer la formule suivante :

value.contains(cells["cote_dew"].value)

Cette formule a pour fonction de vérifier que la colonne courante contient l'information qui se trouve dans la colonne choisie (ici code_dew). On a a alors une colonne qui contient True ou False et sur laquelle on va pouvoir faire une facette qui nous permettra d'identifier les lignes qui correspondent à des recotations posant problème.

Vérification du dépôt d'articles dans HAL en fonction des couleurs RoMEO à partir du WoS[modifier]

Objectif : vérifier pour une année/institution si les articles sont présents dans HAL et s'ils ne le sont pas si la politique de l'éditeur le permet

1. Obtenir dans le Web of Science la liste des articles publiés pour une année par une institution.

Dans le WoS sélectionner Search > Web of Science Core Collection, sélectionner Organization-Enhanced comme index et rechercher l'institution dans Select from Index. Lancer la recherche en sélectionnant une année. Exporter ensuite la liste des résultats avec Save to Other File Formats, Number of Records: Records [1] to [500], Record Content: Author, Title, Source, File Format: Tab-delimited (Win, UTF-8). Si vous obtenez plus de 500 résultats il faudra exporter la liste en plusieurs fois ou passer par le formulaire de demande de téléchargement de données. Créer un projet dans OpenRefine avec les données exportées.

2. Interrogation de l'API HAL

À partir de la colonne TI, on va aller interroger le WS HAL (clic sur la flèche en haut de colonne > Edit Column > Add column by fetching URL, penser à réduire le temps entre deux appels, fixé par défaut à 5 secondes, cela peut être long pour un fichier conséquent) à l'aide de l'expression suivante :

"http://api.archives-ouvertes.fr/search/?q=title_t:%22"+ value.replace(/\s/,"%20") +"%22~&wt=json&fl=title_s"

A partir de cette colonne on va créer une nouvelle colonne contenant seulement la réussite de l'opération de comparaison (clic sur la flèche de haut de colonne > Edit column > Add column based on this column) en utilisant l'expression suivante :

if ((value.parseJson().response.numFound >=1), "OK", "KO")

3. Interrogation de l'API RoMEO

À partir de la colonne SN, on va aller interroger le WS RoMEO (clic sur la flèche en haut de colonne > Edit Column > Add column by fetching URL) à l'aide de l'expression suivante :

"http://www.sherpa.ac.uk/romeo/api29.php?issn=" + value

A partir de cette colonne on va créer une nouvelle colonne contenant seulement la couleur RoMEO (clic sur la flèche de haut de colonne > Edit column > Add column based on this column) en utilisant l'expression suivante :

value.parseHtml().select('romeocolour')[0].replace('<romeocolour>','').replace('</romeocolour>','')

4. Comparaison

On peut maintenant placer les colonnes de résultat en début de tableau avec (clic sur la flèche de haut de colonne > Edit column > Move column to beginning) ou bien produire une dernière colonne avec :

if( and( cells['RoMEOcolor'] == "

 green
",cells['HALok'].value == "KO"), "Contacter l'auteur", "Ne rien faire" )

Divers[modifier]

Bibliographie[modifier]