cf. la première partie : https://www.slideshare.net/lespetitescases/ralisation-dun-mashup-de-donnes-avec-dss-de-dataiku-premire-partie
Tutoriel pour réaliser un mashup à partir de jeux de données libres téléchargés sur data.gouv.fr et Wikidata entre autres avec le logiciel DSS de Dataiku. Cette deuxième partie permet d'aborder le requêtage de Wikidata avec une requête SPARQL puis montre comment relier les jeux de données de data.gouv.fr et les données issues de Wikidata. Enfin, il aborde la visualisation des données via l'application en ligne Palladio.
Ce tutoriel a servi de support de cours au Master 2 "Technologies numériques appliqués à l'histoire" de l'Ecole nationale des chartes lors de l'année universitaire 2016-2017.
5. Les limites de Dbpedia
• Données structurées complexes à modifier
dans les Wikipedias
• Délai d’attente pour disposer de la mise à jour
(dbpedia mis à jour une fois par an)
• Données dispersées dans les différentes
versions de Dbpedia
• Dbpedia ne propose pas un niveau de service
compatible avec des impératifs de production
• Erreurs dans les extractions
6. Wikidata
• Projet officiel de la Wikimedia
Foundation
• Développée à partir de 2012 à
l’initiative de l’association
Wikimedia Deutschland
• Ouvert à tous
• Les données sont libres : CC0
• Le site est entièrement multilingue
• Objectif 1er
: centraliser et faciliter la
maintenance des données
structurées des Wikipedias
7. La gestion des liens interlangues
Ancien système Nouveau système
Gestion disséminée (données
dispersées sur 280 Wikipédias)
Gestion centralisée
Maintenance par une noria de robots Collecte par robots (sauf
ambiguïté), maintenance à la
main
8. La gestion des liens interlangues
[[af:Victor Hugo]]
[[als:Victor Hugo]]
[[an:Victor Hugo]]
[[ar:]]
[[arz:]]
[[ast:Victor Hugo]]
[[az:Viktor Hüqo]]
[[bat-smg:Victor Hugo]]
[[ba: , ]]Гюго Виктор
[[be-x-old: ]]Віктор Юго
[[be: ]]Віктор Гюго
[[bg: ]]Виктор Юго
[[bn:]]
[[br:Victor Hugo]]
[[cv: ]]Виктор Гюго
[[cy:Victor Hugo]]
[[da:Victor Hugo]]
[[de:Victor Hugo]]
[[diq:Victor Hugo]]
[[el: ]]Βίκτωρ Ουγκώ
[[en:Victor Hugo]]
Ancien système
Wikipédia
Nouveau système
Wikidata
9. La gestion des infobox
Ancien système Nouveau système
données dispersées (280 Wikipédias) données centralisées
mise à jour variable selon les Wikipédias gestion simplifiée des données
10. La gestion des infobox
{{Infobox Conjoint politique
| nom = Berthe Faure
| image = Faure.1212301544-
1-.jpg
| légende = Dessin supposé de
Berthe Faure, debout et de dos, lors du
décès de son mari (une du ''[[Le Petit
Journal (quotidien)|Petit Journal]]'').
| statut = [[Liste des épouses
des présidents de la République française|
Épouse du {{7e}} président de la République
française]]
| début = {{date|17|janvier|
1895}}
| fin = {{date|16|février|
1899}}<br /><small>(4 ans et 29
jours)</small>
| conjoint = [[Félix Faure]]
| prédécesseur = [[Hélène Casimir-
Perier]]
| successeur = [[Marie-Louise
Loubet]]
| nom de naissance = Marie-Mathilde Berthe
Belluot
| date de naissance = {{date de naissance|
21|février|1842}}
| lieu de naissance =
| date de décès = [[1920]] (à 78 ans)
| lieu de décès =
| profession =
}}
21. Résumé des ressources intéressantes
• Etiquette de l’entité
• Alias de l’entité
• Nature de l’entité : P31
• Date de publication : P577
• Identifiant Imdb : P345
• Film : Q11424
22. et les URIS correspondantes
• http://www.w3.org/2000/01/rdf-schema#label
• http://www.w3.org/2004/02/skos/core#altLabel
• http://www.wikidata.org/prop/direct/P31
• http://www.wikidata.org/prop/direct/P577
• http://www.wikidata.org/prop/direct/P345
• http://www.wikidata.org/entity/Q11424
23. Attention à la hiérarchie des natures
Ce n’est pas la nature « Film » mais ses sous-classes…
24. Attention à la hiérarchie des natures
Dans ce cas, il s’agit d’une sous-classe directe de film
mais la hiérarchie peut être plus importante avec des
entités associées à chaque niveau à prendre en
compte dans la construction de la requête !
25. Construire la requête SPARQL
SPARQL endpoint de Wikidata : https://query.wikidata.org/
Zone de saisie de la requête SPARQL
Choix des préfixes à ajouter dans la requête
Bouton pour lancer la requête
Zone d’affichage des résultats de la requête
29. Chercher les entités d’une
nature précise
Nombre de résultats : 191 153 résultats pour des entités de
nature « film » mais ce résultat ne prend pas en compte les
entités qui ont pour nature une sous-classe de film
30. Chercher les entités d’une
nature précise et ses sous-classes
Cette ligne signifie : « les entités d’un type dont la super-
classe quelque soit le niveau dans la hiérarchie est Film ». On
utilise le caractère « * » placé juste après la propriété
wdt:P279 = sous-classe de
31. Chercher les entités d’une
nature précise et ses sous-classes
Nombre de résultats : 435 030 résultats pour des entités de
nature « film » ou une de ses sous-classes
32. Ajout de la fonction « blazegraph » pour
récupérer les étiquettes des ressources
Indication de la langue des étiquettes à récupérer
Ajout de la chaîne « Label » à la variable
de la ressource
33. Ajout de la fonction « blazegraph » pour
récupérer les étiquettes des ressources
La requête échoue car elle est trop large
46. Construction de l’URL de requêtage
URL du web service
https://query.wikidata.org/bigdata/namespace/wdq/sparql
Format de la réponse de la requête SPARQL valeur du paramètre « format »
format=json
Requête SPARQL avec l’encodage URL valeur du paramètre « query »
query=PREFIX%20wd%3A%20%3Chttp%3A%2F%2Fwww.wikidata.org%2Fentity%2F%3E%0APREFIX%20wdt%3A%20%3Chttp%3A%2F
%2Fwww.wikidata.org%2Fprop%2Fdirect%2F%3E%0APREFIX%20wikibase%3A%20%3Chttp%3A%2F%2Fwikiba.se%2Fontology%23%3E
%0APREFIX%20p%3A%20%3Chttp%3A%2F%2Fwww.wikidata.org%2Fprop%2F%3E%0APREFIX%20ps%3A%20%3Chttp%3A%2F
%2Fwww.wikidata.org%2Fprop%2Fstatement%2F%3E%0APREFIX%20pq%3A%20%3Chttp%3A%2F%2Fwww.wikidata.org%2Fprop%2Fqualifier
%2F%3E%0APREFIX%20rdfs%3A%20%3Chttp%3A%2F%2Fwww.w3.org%2F2000%2F01%2Frdf-schema%23%3E%0APREFIX%20bd%3A
%20%3Chttp%3A%2F%2Fwww.bigdata.com%2Frdf%23%3E%0A%0ASELECT%20DISTINCT%20%3Ffilm%20%3FfilmLabel%20%3FaltLabel
%20%3FimdbID%20%3Fyear%0AWHERE%20%7B%0A%20%7B%7B%3Ffilm%20wdt%3AP31%20wd%3AQ11424.%7D%20UNION%20%7B%3Ffilm
%20wdt%3AP31%20%3Ftype.%20%3Ftype%20wdt%3AP279*%20wd%3AQ11424%7D%7D%0A%20%20%3Ffilm%20wdt
%3AP345%20%3FimdbID.%0A%20%20OPTIONAL%20%7B%3Ffilm%20skos%3AaltLabel%20%3FaltLabel.%20FILTER%20(lang(%3FaltLabel)%3D
%27fr%27)%7D%0A%20%20%3Ffilm%20wdt%3AP577%20%3Fdate%0A%20%20BIND%20(year(%3Fdate)%20AS%20%3Fyear)%0A%20%20FILTER
%20(%3Fdate%20%3E%3D%20%222008-01-01T00%3A00%3A00Z%22%5E%5Exsd%3AdateTime)%0A%20%20FILTER%20(%3Fdate%20%3C%3D
%20%222015-12-31T00%3A00%3A00Z%22%5E%5Exsd%3AdateTime)%0A%20%20SERVICE%20wikibase%3Alabel%20%7B%20%0A%09bd
%3AserviceParam%20wikibase%3Alanguage%20%22fr%22%0A%20%20%7D%0A%20%20%0A%7D
47. Astuce : service en ligne pour encoder une
chaîne pour une URL
http://meyerweb.com/eric/tools/dencoder/
48. Astuce : service en ligne pour encoder une
chaîne pour une URL
http://meyerweb.com/eric/tools/dencoder/
84. Objectifs
• Obtenir une ligne par titre ou titre alternatif à
comparer avec l’autre jeu de données
• Conserver uniquement les colonnes
nécessaires à la comparaison
• Normaliser le texte de la chaîne de la même
manière que dans l’autre jeu de données
85. Créer une chaîne de caractère à
partir du titre et du titre alternatif
86. Créer une ligne pour chaque partie
de la chaîne créée précédemment
91. Problématique et objectifs
L’année de publication dans Wikidata correspond à l’année de
production du film alors que l’année dans le jeu de données du
CNC correspond à l’année de sortie du film en France, il peut
parfois se passer plusieurs années entre les deux.
Pour optimiser les chances de jointure sans trop augmenter le
risque d’erreur, il est nécessaire de comparer les deux jeux de
données à deux années près. C’est-à-dire dans le jeu de données
provenant de Wikidata de créer autant de lignes que d’années
en plus (deux ans avant, un an avant, un an après, deux après).
117. Utilisation du site OMDb API
OMDb API est un service gratuit qui
met à disposition une API pour
obtenir des informations sur les films
dont les images des affiches.
Un film est trouvé via
son identifiant IMDb
ou son titre
118. Récupérer les données d’OMDb API
Un plugin Dataiku propose une recette
spécifique pour récupérer les infos à
partir de l’identifiant IMDDB ce qui
correspond parfaitement à notre besoin.
Malheureusement, un petit bug empêche
son utilisation (cf.
https://github.com/dataiku/dataiku-contrib/issues/42
)
Pour simplifier le tutoriel, un jeu
de données contenant les
informations d’OMDb pour les
films traités est mis à disposition
sur GitHub :
https://github.com/lespetitescases/datasets/blob/master/imdbInformations.csv?raw=true
142. Interface de configuration d’un champ
Configuration du type de
données
Si le champ contient un
identifiant, il est posible
de charger les données
associées via un autre
fichier CSV
143. Gestion des champs à valeurs multiples
Configuration du
caractère de séparation
des valeurs
153. Modifier le script python
# -*- coding: utf-8 -*-
import dataiku
import pandas as pd, numpy as np
from dataiku import pandasutils as pdu
# Chargement du jeu de donnée Dataiku
Dataset_en_entree = dataiku.Dataset(« Nom_du_dataset")
# Transformation du jeu de donnée en Panda Dataframe
Dataset_en_entree _df = Dataset_en_entree .get_dataframe()
#Réorganisation et sélection des colonnes dans l’ordre de déclaration ci-dessous
final_df = Dataset_en_entree _df [[‘nom colonne 1', 'tnom colonne 2',‘nom colonne 3']]
# Déclaration d’un nouveau jeu de donnée Dataiku
final = dataiku.Dataset("final")
# Alimentation du jeu de donnée avec le dataframe obtenu précédemment
final.write_with_schema(final_df)
Par défaut, le script Python contient les déclarations d’imports de bibliothèques,
le jeu de données en entrée , le jeu de données en sortie
156. Modifier le script python
# -*- coding: utf-8 -*-
import dataiku
import pandas as pd, numpy as np
from dataiku import pandasutils as pdu
# Chargement du jeu de donnée Dataiku
Dataset_en_entree = dataiku.Dataset(« Nom_du_dataset")
# Transformation du jeu de donnée en Panda Dataframe
Dataset_en_entree _df = Dataset_en_entree .get_dataframe()
#Supprimer les lignes en doublon en prenant en compte les valeurs de toutes les colonnes
final_df = Dataset_en_entree _df.drop_duplicates()
#Supprimer les lignes en doublon en prenant en compte les valeurs d’une colonne
#final_df = Dataset_en_entree _df drop_duplicates(subset=‘nom de la colonne')
#Supprimer les lignes en doublon en prenant en compte les valeurs de plusieurs colonnes
#final_df = Dataset_en_entree _df drop_duplicates(subset=[‘nom de la colonne 1‘, ‘nom de la colonne 2‘])
# Déclaration d’un nouveau jeu de donnée Dataiku
final = dataiku.Dataset("final")
# Alimentation du jeu de donnée avec le dataframe obtenu précédemment
final.write_with_schema(final_df)
160. Modifier le script python
# -*- coding: utf-8 -*-
import dataiku
import pandas as pd, numpy as np
from dataiku import pandasutils as pdu
# Chargement du jeu de donnée Dataiku
Dataset_en_entree = dataiku.Dataset(« Nom_du_dataset")
# Transformation du jeu de donnée en Panda Dataframe
Dataset_en_entree _df = Dataset_en_entree .get_dataframe()
#Supprimer les lignes en doublon en prenant en compte les valeurs de toutes les colonnes
groupby= Dataset_en_entree _df.groupby(‘nom colonne distincte‘)[‘nom colonne liste'].apply(lambda x:
x.tolist()).to_frame().reset_index().to_dict(orient='list')
#Transformer un dictionnaire Python en dataframe Panda
final_df = pd.DataFrame.from_dict(groupby)
# Déclaration d’un nouveau jeu de donnée Dataiku
final = dataiku.Dataset("final")
# Alimentation du jeu de donnée avec le dataframe obtenu précédemment
final.write_with_schema(final_df)