8 Enrichir ses données et aligner sur des sources extérieures

Cas d’usage :

  • ville -> coordonnées, population, pays…
  • coordonnées -> ville
  • nom de personne -> identifiant -> dates, biographies, oeuvres, références…

Techniques :

  1. API Web : En réponse à une requête HTTP, une API web renvoit des informations directement utilisables informatiquement, en général formatées suivant la syntaxe XML ou JSON.
  2. Service de Réconciliation : Spécifique à OpenRefine
  3. Scraping web

8.1 Analyser une réponse en JSON

8.1.1 Le format JSON

Format d’échange de données très léger et populaire. Spécification : https://www.json.org/

Six type de données sont possibles en JSON : * 4 types simples * Chaîne de caractères : une séquence de 0 ou plus caractères Unicode, obligatoirement encadrés de par des guillemets doubles.

Ex: "texte"

  • Nombre : un nombre décimal signé qui peut contenir une part fractionnable ou élevée à la puissance (notation E). Le Json n’admet pas les nombres inexistants (NaN), et ne fait aucune distinction entre un entier et un flottant.

Ex : 10 ou 10.4 ou -10.4

  • Valeur Booléenne : true ou false

  • Valeur nulle : valeur vide, indiquée par null

  • 2 types complexes :

    • Tableau : une liste ordonnée de 0 valeurs ou plus, pouvant être de n’importe quel type, encadrées par des crochets et séparées par des virgules.

Ex : [1,2] ou [] ou [“a”,23] ou [23,“a”,null,true] ou [“a”,[“b”,“c”]]

  • Objet : une liste non ordonnée de paires nom -> valeur (ou clé -> valeur). Chaque nom est séparé de sa valeur par :. Les noms sont des chaînes entre guillemets doubles et doivent de préférence être uniques au sein de chaque objet. Les valeurs peuvent être de n’importe quel type. Les paires sont encadrés par des accolades et séparées par des virgules.

Ex : {“texte”:“x”, “nombre”:2, “tableau”:[1,2,“w”, null], “objet”:{“jour”:“lundi”, “mois”:“mars”}}

Les navigateurs présentent en général les valeurs JSON sous forme assez lisible, un élément par ligne. Si ce n’est pas le cas, utiliser un service comme JSON Formatter https://jsonformatter.org/

Ex :

JSON Formatter

8.1.2 Exemple de réponses d’API web en JSON

Une API renvoit en général un objet JSON ou plus rarement un tableau, contenant plusieurs niveaux d’éléments imbriqués.

Ex : l’API de Wikipédia renvoie un tableau pour une recherche sur Victor Hugo

URL : https://fr.wikipedia.org/w/api.php?action=opensearch&format=json&formatversion=2&search=victor%20hugo&namespace=0&limit=3&suggest=true

Réponse :

[
  "victor hugo",
  [
    "Victor Hugo",
    "Victor Hugo et la conquête de l'Algérie",
    "Victor Hugo, ennemi d'État"
  ],
  [
    "Victor Hugo est un poète, dramaturge, prosateur, romancier et dessinateur romantique français, né le 26 février 1802 (7 ventôse an X selon le calendrier républicain encore en vigueur) à Besançon et mort le 22 mai 1885 à Paris.",
    "Victor Hugo s'est peu exprimé sur la question de la colonisation de l'Algérie, qui a constitué pourtant la principale aventure coloniale de la France de son époque.",
    "Victor Hugo, ennemi d’État est une mini-série de drame historique française en 4 épisodes de 52 minutes créée par Iris Bucher et diffusée entre le 11 octobre 2018 et le 18 octobre 2018 sur La Trois."
  ],
  [
    "https://fr.wikipedia.org/wiki/Victor_Hugo",
    "https://fr.wikipedia.org/wiki/Victor_Hugo_et_la_conqu%C3%AAte_de_l%27Alg%C3%A9rie",
    "https://fr.wikipedia.org/wiki/Victor_Hugo,_ennemi_d%27%C3%89tat"
  ]
]

Analyse : tableau de 4 éléments (une chaîne et 3 tableaux) : terme recherché, tableau des titres des pages, tableau des descriptifs, tableau des URL des pages

Ex : l’API de Geonames renvoie un objet pour une recherche sur Paris en France :

URL : http://api.geonames.org/searchJSON?name=paris&country=FR&maxRows=3&username=formationbulac1

Résultat :

{
  "totalResultsCount": 1163,
  "geonames": [
    {
      "adminCode1": "11",
      "lng": "2.3488",
      "geonameId": 2988507,
      "toponymName": "Paris",
      "countryId": "3017382",
      "fcl": "P",
      "population": 2138551,
      "countryCode": "FR",
      "name": "Paris",
      "fclName": "city, village,...",
      "adminCodes1": {
        "ISO3166_2": "IDF"
      },
      "countryName": "France",
      "fcodeName": "capital of a political entity",
      "adminName1": "Île-de-France",
      "lat": "48.85341",
      "fcode": "PPLC"
    },
    {
      "adminCode1": "11",
      "lng": "2.77863",
      "geonameId": 6698160,
      "toponymName": "Disneyland Park Paris",
      "countryId": "3017382",
      "fcl": "L",
      "population": 0,
      "countryCode": "FR",
      "name": "Disneyland Resort Paris",
      "fclName": "parks,area, ...",
      "adminCodes1": {
        "ISO3166_2": "IDF"
      },
      "countryName": "France",
      "fcodeName": "amusement park",
      "adminName1": "Île-de-France",
      "lat": "48.86785",
      "fcode": "AMUS"
    },
    {
      "adminCode1": "11",
      "lng": "2.3486",
      "geonameId": 2968815,
      "toponymName": "Paris",
      "countryId": "3017382",
      "fcl": "A",
      "population": 2257981,
      "countryCode": "FR",
      "name": "Paris",
      "fclName": "country, state, region,...",
      "adminCodes1": {
        "ISO3166_2": "IDF"
      },
      "countryName": "France",
      "fcodeName": "second-order administrative division",
      "adminName1": "Île-de-France",
      "lat": "48.8534",
      "fcode": "ADM2"
    }
  ]
}

8.1.3 Exploitation de JSON en GREL

Les valeurs JSON sont d’abord récupérées et stockées sous forme de chaîne de caractères.

Elles sont analysées avec la fonction GREL parseJson() qui les transforme en objet spécial.

L’objet JSON peut ensuite être manipulée en parcourant l’index des tableaux ou en récupérant la valeur d’une clé :

  • Le Nième élément d’un tableau est récupérable avec la syntaxe [N].
  • La valeur correspondant à une clé est récupérable avec la syntaxe .clé ou [“clé”] ou get(“clé”)

Ex : ‘[“a”,“b”,12]’.parseJson()[0]

Résultat : “a”

Ex : ‘{“a” : 1,“b” : 2}’.parseJson().a

ou ‘{“a” : 1,“b” : 2}’.parseJson()[‘a’]

ou ‘{“a” : 1,“b” : 2}’.parseJson().get(“a”)

Résultat : 1

Exemple d’exploitation d’un objet complexe (objet -> tableau -> 2 objets) :

{
  "liste":[
    {"id":"id001","name":"nom1"},
    {"id":"id002","name":"nom2"}
]
}

Récupération du 1er objet du tableau liste :

‘{“liste”:[{“id”:“id001”,“name”:“nom1”},{“id”:“id002”,“name”:“nom2”}]}’.parseJson().liste[0]

Récupération de la valeur correspondant à la clé “name” du 1er objet du tableau liste :

‘{“liste”:[{“id”:“id001”,“name”:“nom1”},{“id”:“id002”,“name”:“nom2”}]}’.parseJson().liste[0].name

Résultat : “nom1”

Pour éviter les formules trop compliquées on peut créer une colonne temporaire avec le contenu du tableau “liste”, et refaire des requêtes plus précises à partir d’elle.

Les éléments d’un tableau peuvent être listés et manipulés avec forEach() (qui parcourt un tableau) et filtrés avec filter() (qui renvoie les éléments du tableau correspondant à certains critères).

Pour récupérer un tableau contenant la clé “name” pour tous les objets du tableau liste :

forEach('{"liste":[{"id":"id001","name":"nom1"},{"id":"id002","name":"nom2"}]}'.parseJson().liste,v,v["name"])

Résultat : [ “nom1”, “nom2” ]

Pour récupérer le nom de l’élément id001:

filter('{"liste":[{"id":"id001","name":"nom1"},{"id":"id002","name":"nom2"}]}'.parseJson().liste,v,v["id"]=="id001")[0]["name"]

Résultat : “nom1”

8.1.4 Exploitation de JSON en Python

Le recours à Python est nécessaire pour explorer un objet JSON dont on ne connaît pas la clé. Ex de l’API de Wikidata, qui renvoit un objet dont la clé est variable (identifiant de l’élément).

Exemple :

import json
donnees = json.loads ('{"clevariable":{"id":"id001","name":"nom1"}}')
for cle, valeur in donnees.items():
    return (valeur['name'])

Résultat : nom1

Le mot clé value peut être utilisé en Python comme en GREL.

8.2 Analyser une réponse en XML

8.2.1 Le format XML

Chaque élément est délimité par une balise ouvrante <balise> et fermante </balise>. Un élément vide est représenté par une balise auto-fermante <balise />.

Les balises peuvent contenir des attributs sous la forme clé=“valeur” : <balise cle="valeur" >

Les éléments peuvent être imbriqués.

Les éléments et les attributs peuvent comporter des espaces de noms (préfixes séparés du nom de l’élément ou de la clé de l’attribut par :) : <dc:title>

Pour faciliter la lecture du XML utilisez un service comme https://jsonformatter.org/xml-formatter

8.2.2 Exemples de réponses d’API web en XML

Même exemple Wikipédia que plus haut

URL : https://fr.wikipedia.org/w/api.php?action=opensearch&format=xml&search=victor%20hugo&namespace=0&limit=3&suggest=true

Réponse :

<SearchSuggestion version="2.0"
    xmlns="http://opensearch.org/searchsuggest2">
    <Query xml:space="preserve">victor hugo</Query>
    <Section>
        <Item>
            <Text xml:space="preserve">Victor Hugo</Text>
            <Url xml:space="preserve">https://fr.wikipedia.org/wiki/Victor_Hugo</Url>
            <Description xml:space="preserve">Victor Hugo est un poète, dramaturge, prosateur, romancier et dessinateur romantique français, né le 26 février 1802 (7 ventôse an X selon le calendrier républicain encore en vigueur) à Besançon et mort le 22 mai 1885 à Paris.</Description>
            <Image source="https://upload.wikimedia.org/wikipedia/commons/thumb/2/25/Victor_Hugo_001.jpg/37px-Victor_Hugo_001.jpg" width="37" height="50"/>
        </Item>
        <Item>
            <Text xml:space="preserve">Victor Hugo et la conquête de l'Algérie</Text>
            <Url xml:space="preserve">https://fr.wikipedia.org/wiki/Victor_Hugo_et_la_conqu%C3%AAte_de_l%27Alg%C3%A9rie</Url>
            <Description xml:space="preserve">Victor Hugo s'est peu exprimé sur la question de la colonisation de l'Algérie, qui a constitué pourtant la principale aventure coloniale de la France de son époque.</Description>
        </Item>
        <Item>
            <Text xml:space="preserve">Victor Hugo, ennemi d'État</Text>
            <Url xml:space="preserve">https://fr.wikipedia.org/wiki/Victor_Hugo,_ennemi_d%27%C3%89tat</Url>
            <Description xml:space="preserve">Victor Hugo, ennemi d’État est une mini-série de drame historique française en 4 épisodes de 52 minutes créée par Iris Bucher et diffusée entre le 11 octobre 2018 et le 18 octobre 2018 sur La Trois.</Description>
        </Item>
    </Section>
</SearchSuggestion>

Même exemple Geonames que plus haut :

URL : http://api.geonames.org/search?name=paris&country=FR&maxRows=3&username=formationbulac1

Réponse :

<geonames style="MEDIUM">
    <totalResultsCount>1163</totalResultsCount>
    <geoname>
        <toponymName>Paris</toponymName>
        <name>Paris</name>
        <lat>48.85341</lat>
        <lng>2.3488</lng>
        <geonameId>2988507</geonameId>
        <countryCode>FR</countryCode>
        <countryName>France</countryName>
        <fcl>P</fcl>
        <fcode>PPLC</fcode>
    </geoname>
    <geoname>
        <toponymName>Disneyland Park Paris</toponymName>
        <name>Disneyland Resort Paris</name>
        <lat>48.86785</lat>
        <lng>2.77863</lng>
        <geonameId>6698160</geonameId>
        <countryCode>FR</countryCode>
        <countryName>France</countryName>
        <fcl>L</fcl>
        <fcode>AMUS</fcode>
    </geoname>
    <geoname>
        <toponymName>Paris</toponymName>
        <name>Paris</name>
        <lat>48.8534</lat>
        <lng>2.3486</lng>
        <geonameId>2968815</geonameId>
        <countryCode>FR</countryCode>
        <countryName>France</countryName>
        <fcl>A</fcl>
        <fcode>ADM2</fcode>
    </geoname>
</geonames>

8.2.3 Exploitation de XML en GREL

Les données en XML sont d’abord récupérées et stockées sous forme de chaîne de caractères.

Elles sont analysées avec la fonction GREL parseXml() qui les transforme en objet spécial.

L’objet peut ensuite être manipulé avec d’autres fonctions :

  • select() sélectionne un ou plusieurs éléments, renvoyés dans un tableau
  • xmlAttr() permet de récupérer l’attribut d’un élément
  • toString() transforme un élément en chaîne (y compris ses balises ouvrantes et fermantes)
  • xmlText() renvoie sous forme de chaîne le contenu d’un élément (sans ses balises) en intégrant celui des éléments enfants.
  • ownText() renvoie sous forme de chaîne le contenu d’un élément (sans ses balises) sans intégrer les éléments enfants
  • innerHtml() renvoie sous forme de chaîne le contenu d’un élément (sans ses balises) en intégrant les éléments enfants
  • innerXml() renvoie sous forme de chaîne le contenu des éléments enfants d’un élément (avec leur balises), mais sans le contenu de l’élément ciblé.

A part select() toutes ces fonctions ne s’appliquent qu’à des éléments et non à des tableaux d’éléments. Il faut utiliser forEach() et filter() pour les appliquer à un tableau.

La fonction select() repose sur le parseur jsoup (https://jsoup.org), qui utilise des sélecteurs identiques aux sélecteurs CSS3 et Jquery.

Voir la documentation complète : https://jsoup.org/apidocs/org/jsoup/select/Selector.html

Interface de démonstration (pour tester une expression jsoup) : https://try.jsoup.org/

Exemples:

<liste>
<notice><livre lang="eng">Hamlet</livre><auteur>Shakespeare</auteur></notice>
<notice><livre lang="fre">La Chute</livre><auteur>Camus</auteur></notice>
</liste>

Formule :

'<liste>
<notice><livre lang="eng">Hamlet</livre><auteur>Shakespeare</auteur></notice>
<notice><livre lang="fre">La Chute</livre><auteur>Camus</auteur></notice>
</liste>'.parseXml().select ('liste')

Réponse :

[ <liste>
 <notice>
  <livre lang="eng">
   Hamlet
  </livre>
  <auteur>
   Shakespeare
  </auteur>
 </notice>
 <notice>
  <livre lang="fre">
   La Chute
  </livre>
  <auteur>
   Camus
  </auteur>
 </notice>
</liste> ]

Formule :

'<liste>
<notice><livre lang="eng">Hamlet</livre><auteur>Shakespeare</auteur></notice>
<notice><livre lang="fre">La Chute</livre><auteur>Camus</auteur></notice>
</liste>'.parseXml().select ('livre')

Réponse :

[ <livre lang="eng">
 Hamlet
</livre>, <livre lang="fre">
 La Chute
</livre> ]

Formule :

'<liste>
<notice><livre lang="eng">Hamlet</livre><auteur>Shakespeare</auteur></notice>
<notice><livre lang="fre">La Chute</livre><auteur>Camus</auteur></notice>
</liste>'.parseXml().select ('notice livre')

Réponse : idem

Formule :

'<liste>
<notice><livre lang="eng">Hamlet</livre><auteur>Shakespeare</auteur></notice>
<notice><livre lang="fre">La Chute</livre><auteur>Camus</auteur></notice>
</liste>'.parseXml().select ('livre[lang=eng]')

Réponse :

[ <livre lang="eng">
 Hamlet
</livre> ]

Formule :

'<liste>
<notice><livre lang="eng">Hamlet</livre><auteur>Shakespeare</auteur></notice>
<notice><livre lang="fre">La Chute</livre><auteur>Camus</auteur></notice>
</liste>'.parseXml().select ('livre[lang=eng]')

Réponse :

[ <livre lang="eng">
 Hamlet
</livre> ]

Formule :

'<liste>
<notice><livre lang="eng">Hamlet</livre><auteur>Shakespeare</auteur></notice>
<notice><livre lang="fre">La Chute</livre><auteur>Camus</auteur></notice>
</liste>'.parseXml().select ('notice:has(livre[lang=eng])')

Réponse :

[ <notice>
 <livre lang="eng">
  Hamlet
 </livre>
 <auteur>
  Shakespeare
 </auteur>
</notice> ]

Formule :

'<liste>
<notice><livre lang="eng">Hamlet</livre><auteur>Shakespeare</auteur></notice>
<notice><livre lang="fre">La Chute</livre><auteur>Camus</auteur></notice>
</liste>'.parseXml().select ('notice:has(livre[lang=eng]) auteur')

Réponse :

[  <auteur>
  Shakespeare
 </auteur> ]

Tester des les fonctions de récupération de texte à partir des formules précédentes.

8.2.4 Exploitation de XML en Python

Il est également possible d’écrire du code en Jython en utilisant la librarie xml.etree, ce qui peut être plus simple que GREL dans certains cas. La syntaxe XPATH est utilisée à la place de Jsoup.

Ex : récupérer le titre et l’auteur de livres anglais

from xml.etree import ElementTree
element = ElementTree.fromstring('<liste><notice><livre lang="eng">Hamlet</livre><auteur>Shakespeare</auteur></notice><notice><livre lang="fre">La Chute</livre><auteur>Camus</auteur></notice></liste>'.encode("utf-8"))
listeResultats = element.findall(".//livre[@lang='eng']/..")
for resultat in listeResultats:
    return (resultat.find('livre').text + " / " + resultat.find('auteur').text)

Renvoit :

Hamlet / Shakespeare

8.3 Récupérer les données

Nombreux tutoriels. Voir par exemple en français 2 vidéos d’E. Rizza: - Web scraping dynamique avec Open Refine - interroger Wikipedia sans programmation

8.3.1 Choisir une source de données et préparer la requête

Quelle(s) API propose(nt) les données qui nous intéressent ?

S’il y en a plusieurs, y-a-t-il des différences (fiabilité technique, fiabilité des données, besoin de se faire un compte, facilité de construction de la requête, facilité d’interprétation des résultats…) ?

Ex : données géographiques sur des villes Françaises :

Analyser la syntaxe de l’API retenue et la syntaxe des réponses.

Le choix du format (XML, JSON ou autre) est parfois défini dans un entête HTTP et non dans un paramètre de l’URL.

8.3.2 Principes

OpenRefine peut interroger une API de manière répétée pour chaque ligne d’un projet. La réponse XML ou JSON est copiée dans une nouvelle colonne et peut être analysée avec des fonctions dédiées.

  1. L’URL doit figurer dans une colonne xxx
  2. Colonne xxx : menu Editer la colonne > Ajouter une colonne en moissonnant les URL
  3. Options utiles
  • Délai entre chaque requête (5000 ms par défaut ; peut être réduit à 0 ou à quelques ms pour une requête sur une API - consulter la documentation de chaque API - , mais laisser au moins 1000 ms pour le scrapping web)
  • Entêtes HTTP : parfois utile pour simuler une navigation avec un navigateur ou pour préciser le type de données (Accept: application/XML ou Accept: application/json) si l’API supporte la négociation de contenu
  • Pour débugguer en cas de problème : cocher “En cas d’erreur : conserver l’erreur”

Ajouter une colonne en moissonnant des données

Important : Les paramètres d’une requête HTTP (après le ? dans http://nomdedomaine.fr/chemin?) ne doivent pas contenir certains caractères. La fonction GREL value.escape('url') permet de faire ce nettoyage.

Limites à noter :

  • impossible de faire des requêtes POST (possible en intégrant des scripts Python)
  • impossible de suivre directement les redirections, notamment les redirections http -> https

8.3.3 Exercice

Rechercher les informations suivantes : code postal, longitude, latitude, population et affichez les dans 4 colonnes distinctes, pour les 3 villes suivantes : Nice, Dijon, Le Havre

Répartissez-vous en 3 groupes :

  • Recherche dans Geonames, en récupérant les données en JSON

Documentation : http://www.geonames.org/export/geonames-search.html Racine de l’API : http://api.geonames.org/searchJSON? clé d’API formationbulac1

  • Recherche dans Geonames, en récupérant les données en XML

Documentation : http://www.geonames.org/export/geonames-search.html Racine de l’API : http://api.geonames.org/search? clé d’API formationbulac1

  • Recherche dans le Géoportail, en récupérant les données en JSON

Documentation : https://geo.api.gouv.fr/decoupage-administratif Racine de l’API : https://geo.api.gouv.fr/communes

8.4 Alignement de données avec des référentiels externes

Récupérer des identifiants et d’autres informations correspondant aux données dans des référentiels externes (vocabulaire Rameau, Wikidata, etc) pour faciliter l’enrichissement des données.

Deux possibilités:

  • Appeler une API dédiée (ex: API du Sudoc ou de la BNF) pour récupérer un numéro d’identifiant à partir d’un contenu (en utilisant la procédure décrite plus haut)
  • Utiliser un service de « réconciliation» spécialement conçu pour OpenRefine (on pourrait aussi traduire « rapprochement»).

8.4.1 Les services de réconciliation

Un service de réconciliation propose pour chaque valeur une liste de concepts ou d’entités « candidats» issus d’un vocabulaire contrôlé ou d’une autre source de données normalisées.

Si le vocabulaire comprend des formes rejetées, elles seront utilisées par le service. Ex : « Emile Ajar» renverra l’entité « Romain Gary»

Si plusieurs réponses sont possibles, l’usager pourra choisir la bonne directement dans l’interface d’OpenRefine.

Attention : le processus peut être lent (plusieurs minutes). A tester sur un petit échantillon!

8.4.3 Réconcilier des données avec Wikidata

Par défaut, le seul service de réconciliation installé est celui de Wikidata.

Wikidata : Base de donnée accessible en ligne, libre et collaborative qui collecte des données structurées, destinée à alimenter Wikipedia et les autres projets du mouvement Wikimédia, mais largement utilisée par d’autres acteurs.

Triple intérêt :

  • identifier des “entités”
  • leur attribuer des propriétés
  • servir de pivot pour les relier à d’autres référentiels.

Chaque entité de Wikidata (identifié par un Q suivi d’un nombre), et relié à d’autres éléments par des propriétés (identifiées par un P suivi d’un nombre)

Schéma des entités et propriétés Wikidata

Exemple :

à partir d’un projet contenant ces deux lignes, récupérer les identifiants correspondant aux deux auteurs dans Wikidata

(la colonne metier est facultative, mais pourra être utilisé par le service de réconciliation pour préciser la requête)

Exemple

Pour éviter que les données ne soient écrasées par la réconciliation : Créer une nouvelle colonne nom-reconcilie à partir de nom

<span class="or-menu>nom-reconcilie > Réconcilier > Démarrer la réconciliation

Sélectionnez le type d’entité commun aux éléments de chaque ligne.

OpenRefine analyse les données et propose plusieurs choix. Ici : human, book, etc. Si un choix est satisfaisant (ni trop précis ni trop large…), sélectionnez le. Sinon choisissez manuellement un type, ou réconciliez sans type.

Ici, “human” est un bon choix, mais on pourrait aussi chercher un type plus précis.

Résultat : « Emile Ajar » reconnu comme étant « Romain Gary »

Exemple après réconciliation : Romain Gary

« victor hugo » traité comme « hugo victor »

Exemple après réconciliation : Victor Hugo

Problème : une vingtaine de Victor Hugo dont 4 reconnus à 100% de probabilité…

Exemple après réconciliation : homonymes

Pour trouver le bon Victor Hugo, cliquer sur chaque nom. Ici le 2e est le bon. Cliquer sur “Apparier cette cellule”

Exemple après réconciliation : choix parmi des homonymes

Note : Si la cellule “Victor Hugo” avait contenu ses dates de naissance et de mort, le service de réconciliation aurait pris en compte ces propriétés pour filtrer la recherche.

8.5 Récupérer les données de réconciliation

Pour récupérer la forme de référence et l’identifiant, une formule GREL est nécessaire :

Colonne nom-reconcile > Editer la colonne> Ajouter une colonne en fonction de cette colonne

*Pour récupérer les identifiants :

Nouvelle colonne id ; Saisir la formule cell.recon.match.id

Récupérer des identifiants

Vérification : aller à l’URL https://www.wikidata.org/wiki/Q157322 (Romain Gary)

*Pour récupérer la forme de référence :

Nouvelle colonne id ; Saisir la formule cell.recon.match.name

Pour récupérer les propriétés de l’entité Wikidata, deux solutions :

  • Editer la colonne > ajouter une colonne en moissonnant des URL en utilisant l’API JSON de Wikidata, avec l’identifiant de l’entité : https://www.wikidata.org/wiki/Special:EntityData/Q157322.json
  • Editer la colonne > ajouter des colonnes à partir de valeurs réconciliées puis choisir une propriété

Récupérer des propriétés

Note : Cette fonction n’est pour l’instant disponible que sur le service de réconciliation de Wikidata.

8.5.1 Effacer les données de réconcilation

Réconcilier > Actions > Effacer les données de réconcilations

8.6 Affiner le tri des résultats en utilisant une propriété de l’entité recherchée

Lancer une nouvelle réconcilation en utilisant les informations de la colonne metier . Dans le panneau de gauche, cocher metier et saisir la propriété occupation (en anglais, spécifique de l’ontologie Wikidata)

Affiner le tri des résultats

Le métier (ici novelist) est maintenant pris en compte pour le classements des Victor Hugo. Le romancier est le 1er de la liste et le seul à 100% de probabilité !

Affiner le tri des résultats : ex de Victor Hugo

Pour le service interrogeant Wikidata il est possible de lier une colonne à une expression complexe combinant plusieurs propriétés.

Ex : P27/P297 = la colonne doit contenir le code à deux lettres (FR, GB…) d’un pays lié à l’entité recherchée

Ex : P27|P297 = la colonne doit contenir le code à deux lettres (FR, GB…) d’un pays lié à l’entité recherchée ou bien le nom complet du pays

Affiner le tri des résultats : combiner des critères

P27|P297 = la colonne doit contenir soit le code à deux lettres soit le nom complet du pays

8.6.1 Au delà de Wikidata : autres services de réconciliation

En plus de Wikidata d’autres services existent et peuvent être ajoutés facilement, notamment http://refine.codefork.com/ qui donne accès à plusieurs sources utiles en bibliothèque : VIAF, auteurs BNF (via VIAF), ORCID, Open Library

Mais aussi: * en numismatique : http://nomisma.org/apis/reconcile

8.6.2 Réconciliation étendue avec l’extension RDF

L’extension RDF (https://github.com/stkenny/grefine-rdf-extension/releases) permet de créer un service de réconciliation à partir n’importe quelle source exposée en RDF (standard du « web de données ») depuis un SPARQL Endpoint ou depuis sa propre machine.

Installez l’extension si ce n’est pas déjà fait.

Démonstration avec https://data.idref.fr/sparql ou http://data.persee.fr/sparql

Si la source de données contient différents types d’objets (personnes, documents…) il est possible de créer un service personnalisé.

Exemple : Créer un service personnalisé pour ne rechercher que les auteurs dans Persée :

Service de réconciliation personnalisé

Activité

Réconcilier un auteur (ex: Pierre Bourdieu) avec ce service personnalisé, puis créer une colonne avec l’identifiant (formule cell.recon.match.id), récupérer toutes les données sur l’auteur en XML à partir de son identifiant, puis créer une colonne “biographie” à partir des données XML.

L’extension permet également de créer un service à partir d’un fichier RDF

8.7 Scraping web

A partir du site de l’Assemblée nationale (http://www2.assemblee-nationale.fr/deputes/liste/alphabetique) récupérez le nom et la date de naissance de chaque député

Les fonctions à utiliser sont les mêmes que pour le scraping en XML, mais “XML” est à remplacer par “HTML” dans le nom des fonctions. Ex : parseHtml()

Plusieurs étapes peuvent être nécessaires