Publication de références culturelles dans un triple-store

Le gouvernement a publié des références culturelles et artistiques pouvant servir dans l’enseignement. Pour chaque référence proposée, une fiche a été établie qui contient différents renseignements  à son sujet, notamment la ville éventuellement concernée par la référence, le nom de l’artiste, le titre et la nature de l’oeuvre, ainsi que des tags et mots-clefs, des références aux étapes du programme scolaire qui peuvent être concernées par l’oeuvre.

Ces données sont disponibles ici:

http://www.data.gouv.fr/DataSet/30382368?xtmc=D%C3%A9partement%20des%20programmes%20num%C3%A9riques&xtcr=5

sous forme d’un fichier CSV.

(on verra avec intérêt un ensemble de ressources similaires publiées suivant les principes de l’Open Data ici http://www.data.gouv.fr/fr/dataset/les-grands-reperes-chronologiques-par-domaine-artistique)

Nous avons procédé à divers traitements pour améliorer l’utilisabilité automatique de ces données. Le fichier CSV a été transformé en XML après avoir séparé les mots-clefs, séparé les tags et procédé à quelques autres améliorations sur la structure des données. Ces traitements ont largement été automatisés, notamment grâce à des feuilles de styles XSLT.

Ensuite, grâce à l’outil de publication de données Datalift, autilisé localement sur une de nos machines, nous avons transformé le fichier XML en RDF.

Enfin, grâce à l’outil ARC (http://arc.semsol.org/), nous avons publié les données dans un Triple Store, accessible pour l’instant uniquement via un Sparql Endpoint à l’adresse suivante:

http://givingsense.eu/arcstore/arc2-master/ilot-tests/refCultureSparqlRq.php

Cela permet par exemple de faire la requête suivante:

SELECT ?p (COUNT(?p) AS ?pTotal) WHERE {
?s ?p ?o
}
GROUP BY ?p

 

Cette requête nous donne un bon aperçu du jeux de données sur lequel nous travaillons:

  • 4776 fiches (row, en fait, lignes dans le tableur d’origine)
  • à presque chaque ligne est associée un titre, une url, une description, un format,  un domaine,
  • 4034 peuvent être associées à une des séquences d’enseignement du primaire
  • 4279 peuvent être associées à une des séquences d’enseignements du collège
  • 3704 peuvent être associées à une des séquences d’enseignements du lycée
  • 504 -seulement- sont associées à une ville
  • 61125 tags ont servis à décrire ces références.

A ce niveau de mon exploration, je me demande que sont les ‘domaines’ renseignés dans les fiches.

La requête suivante (qui ressemble beaucoup à la précédente) va  nous renseigner:

PREFIX rfha: <http://givingsense.eu/onto/refCulture/refHistArts.rdf#>
SELECT ?v (COUNT(?v) AS ?vTotal) WHERE {
?s rfha:domaine ?v
}
GROUP BY ?v

Elle donne le résultat suivant:

v vTotal
Arts du visuel 2941
Arts de l espace 961
Arts du langage 629
Arts du quotidien 770
Arts du son 388
Arts du spectacle vivant 499

 

On voit que plus de 2000 références concernent les Arts du visuel.

En fait, on retrouve ces domaines dans le programme d’Histoire de l’Art et probablement dans le programme d’histoire. Nous verrons dans un prochain billet comment ces liens peuvent permettre d’explorer les références lorsqu’on travaille sur une partie d’un programme et, aussi, d’aller chercher des références similaires dans des ressources telles que DBPedia, Europeana ou les données publiées par le Centre Pompidou.

Pour finir, voilà une requête un peu plus élaborée:

PREFIX rfha: <http://givingsense.eu/onto/refCulture/refHistArts.rdf#>
SELECT ?fiche ?titre ?url WHERE { 
    ?fiche rfha:tags ?s . 
    ?s  rfha:tag "Normandie" . 
    ?s  rfha:tag "Peinture" . 
    ?fiche rfha:titre ?titre . 
    ?fiche rfha:url ?url 
} LIMIT 20

 

Nous retenons les fiches qui ont des tags et parmi ces tags nous voulons qu’il y ait “Peinture” et “Normandie”. Dans les fiches ainsi sélectionnées, nous récupérons le titre et l’url associée à l’oeuvre.

qui nous donne le résultat:

fiche titre url
rfha:row_6 Bonnard en Normandie http://www.mdig.fr/IMG/pdf/dossierpedagogique_Bonnard_bd.pdf
rfha:row_1511 Villégiature et bains de mer (dossier en deux parties) http://www.musees-haute-normandie.fr/IMG/pdf/Villegiature.pdf
rfha:row_1515 Joseph Flouest http://www.musees-haute-normandie.fr/IMG/pdf/A4_Flouest_BD.pdf
rfha:row_1517 Histoire du port de Dieppe (dossier en deux parties) http://www.musees-haute-normandie.fr/IMG/pdf/Histoire_port.pdf
rfha:row_3129 Dufy et la représentation de la rue http://www.histoire-image.org/site/etude_comp/etude_comp_detail.php?i=844&amp;d=61&amp;t=331

Cela nous laisse entrevoir les multiples possibilités qui peuvent être offertes, par exemple à un enseignant, pour explorer les ressources à sa disposition. Bien sûr, cela suppose un travail sur l’interface, mais les travaux dans le domaine de la recherche par facette nous donnent des pistes…

Analyse automatisée des programmes de l’enseignement secondaire

cloud

Nous avons assuré de façon directe, avec l’outil Protégé, la conception d’ontologies pour la représentation des programmes d’histoire des classes de 6 ème et 5 ème, et de géographie de 5 ème.

Conscients que:

  • une ontologie a surtout de la valeur si elle est partagée par une large communauté d’utilisateurs,
  • notre travail est un premier jet qui doit être amendé et complété, notamment par des personnes connaissant bien les sujets abordés dans chaque programme, et les démarches pédagogiques,
  • notre travail n’a porté que sur une toute petite partie des programmes,

nous avons la préoccupation de rendre possible la contribution à ces ontologies de personnes qui ne peuvent ou ne veulent pas acquérir toutes les notions et méthodes spécifiques des ontologies.

Nous avons donc entrepris une démarche de conception d’outils d’aide à la création d’ontologies.

Pour commencer, nous avons travaillé, avec l’aide d’étudiants, à l’analyse automatisée d’une grande partie des programmes scolaires de l’enseignement secondaire français.

Le résultat de cette analyse fournit trois outils de visualisation qui peuvent aider à créer de nouvelles ontologies et compléter les ontologies existantes. Cette analyse exploite des méthodes classiques d’analyse de texte et combine certains résultats avec notre ontologie de Bloom. Celle-ci est une représentation sous forme d’ontologie de la taxonomie de Bloom qui propose une classification des activités pédagogiques.

Le premier outil permet de voir chaque programme en mettant en évidence:

  • les mots qui semblent particulièrement significatifs de ce programme,
  • les verbes, en distinguant ceux qui apparaissent dans notre ontologie de Bloom de ceux qui n’y sont pas,
  • les entités nommées (noms de personnes de lieux…).

Le deuxième outil présente de façon visuelle l’importance relative des verbes de notre ontologie de Bloom dans l’ensemble des programmes analysés.

Le troisième outil permet de voir les verbes de Bloom présents dans chaque programme, de voir dans quels autres programmes ils sont utilisés et de mettre en contexte leur utilisation.

Ces résultats peuvent être vus à partir de cette page:

http://perso.telecom-paristech.fr/~moissina/paf2013/

Des défauts demeurent -en particulier pour la détection des entités nommées- et des compléments doivent être mis en oeuvre, mais ces résultats montrent déjà que notre démarche de création d’outils d’aide à la conception d’ontologies est pertinente.

 

Usage de la librairie RDFaParser

Lyon_librairie_083
Librairie à Lyon
(Auteur: Frachet, Source : Wikimédia )

La librairie Javascript rdf-lib.js permet d’exploiter des marquers RDFa introduits dans des pages. Dans cet article, nous allons présenter comment l’utiliser.

rdf-lib.js permet de retrouver tous les attributs rdfa présents dans une page web.

Exemples basé sur une page HTML simple (disons person.html)

<!DOCTYPE html>
<html prefix="dc: http://purl.org/dc/terms/ schema: http://schema.org/">
<head>
<meta charset="UTF-8" />
<link property="profile" href="http://www.w3.org/1999/xhtml/vocab" />
<title>Nxhoaf's Home Page</title>
<base href="http://example.org/nxhoaf/" />
<meta property="dc:creator" content="Hoa Nguyen" />
<link rel="foaf:primaryTopic" href="#me" />
</head>
<body about="http://example.org/nxhoaf/#me"
prefix="foaf: http://xmlns.com/foaf/0.1/">
<h1>Nxhoaf's Home Page</h1>
<p>My name is <span property="foaf:nick">nxhoaf</span> and I like
<a href="http://www.amazon.com/" property="foaf:interest"
lang="en">Amazon</a>.
</p>
<p>
My
<span property="foaf:interest" resource="urn:ISBN:978-0321356680">
favorite <br>
<span resource="urn:ISBN:978-0321356680">
book is the inspiring <br>
<cite property="dc:title">Effective Java</cite> by
<span property="dc:creator">Joshua Bloch</span>
</span>
</span>
</p>
</body>
</html>

En premier lieu, rdf-lib.js dépend de la librairie jQuery, aussi nous devons inclure jQuery par exemple avec ces lignes:

<head>
<meta charset="UTF-8" />
<title>Nxhoaf's Home Page</title>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="./rdf-lib.js"></script>
</head>

Maintenant, nous avons intégré jQuery, nous pouvons l’utiliser pour attendre l’évènement “ready”. Lorsque la page est prête, nous pouvons réaliser les actions suivantes:

  • Retrouver les préfixes rdfa utilisés dans la page.

  • Retrouver les attributs rdfa.

  • Obtenir les triplets associés à un élément HTML cliqué.

Pour cela, nous créons a nouvel objet rdf:

var rdfLib = new RdfLib();

Retrouver les préfixes rdfa

Tous les préfixes rdfa peuvent être retrouvés avec l’appel:

var prefixes = rdfLib.getAllPrefixes(html);

Le résultat est la table prefeixes contenant tous les préfixes rdfa contenus dans la page. Dans notre exemple, nous aurons:

prefixes[dc] = "http://purl.org/dc/terms/";
prefixes[schema] = "http://schema.org/";
prefixes[foaf] = "http://xmlns.com/foaf/0.1/";

Pour boucler sur tous les préfixes, nous pouvons utiliser le code suivant:

for (var prefix in prefixes) {
console.log(prefix + ": " + prefixes[prefix]);
}

Retrouver les attributs rdfa

Maintenant, nous pouvons obtenir tous les attributs rdfa contenus dans la page avec le code suivant:

var triples = rdfLib.getAllTriples(html);

triples est une table de triplets. Chaque triplet est une structure composée de trois champs:

triple.subject
triple.predicate
triple.object

dans lequel chacun des champs {subject, predicate, object} associe deux valeurs {key, value} où key est le nom associé à une valeur représentés par  value:

subject.key
subject.value

predicate.key
predicate.value

object.key
object.value

Ici, nous avons un exemple d’une façon de parcourir la structure rdfa pour afficher tous les triplets. Supposez que dans notre page, nous avons un élément ‘div’ avec l’id “log”:

html = document.getElementsByTagName("html")[0];
var triples = rdfLib.getAllTriples(html);
output += "<b>All attributes: </b><br>";
for (var i = 0; i < triples.length; i++) {
triple = triples[i];
if (triple.subject != null) {
output += "subject: " + triple.subject.key + ":" + triple.subject.value;
output += "<br>";
}

if (triple.predicate != null) {
output += "predicate: " +  triple.predicate.key + ":" + triple.predicate.value;
output += "<br>";
} else {
output += "predicate: null";
output += "<br>";
}

if (triple.object != null) {
output += "object: " +  triple.object.key + ":" + triple.object.value;
output += "<br>";
}
output += "------------------------------<br>";
}
var log = document.createElement("div");
log.id = "log";
$('body').append(log);
$("#log").html(output);

Ci-dessous figure un extrait du résultat obtenu sur notre exemple  example html:

subject: about:http://localhost:8888/OwlProject/rdfa/person.html
predicate: property:profile
object: href:http://www.w3.org/1999/xhtml/vocab
------------------------------
subject: about:http://localhost:8888/OwlProject/rdfa/person.html
predicate: property:dc:creator
object: content:Hoa Nguyen
------------------------------
subject: about:http://localhost:8888/OwlProject/rdfa/person.html
predicate: rel:foaf:primaryTopic
object: undefined:#me
------------------------------
subject: about:http://example.org/nxhoaf/#me
predicate: property:foaf:nick
object: literal:nxhoaf
------------------------------
subject: about:http://example.org/nxhoaf/#me
predicate: property:foaf:interest
object: href:http://www.amazon.com/
------------------------------

Obtenir les triplets associés à un élément HTML cliqué

La librairie rdfalib fournit un moyen d’obtenir les triplets rdfa associés à un élément HTML cliqué. Nous avons deux possibilités:

  1. L’élément cliqué n’a pas de sujet explicite; par exemple <span property=”dc:creator”>Joshua Bloch</span>

  2. L’élément cliqué a un sujet; par exemple <span resource=”urn:ISBN:978-0321356680″>

Dans les deux cas, nous essayons d’obtenir un triplet dans la zone cliquée:

var triple = rdfLib.getTriple(event.target);

Si la zone cliquée ne contient aucun triplet, rien ne se passe:

if (triple == null ||
((triple.predicate == null) && (triple.subject == null))) {
return;
}

Sinon, nous poursuivons…

* si l’élément cliqué n’a pas de sujet explicite:

Dans ce cas, nous obtenons le sujet de la façon suivante:

var subjectTriple = rdfLib.getSubjectTriple(event.target);
triple.subject = subjectTriple.subject;

rdfLib.getSubjectTriple() est une fonction récursive, qui parcours l’arbre DOM de bas en haut pou retrouver un sujet. Si elle remonte jusqu’à la racine de l’arbre sans trouver de sujet, c’est l’url de la page courante qui constitue le sujet par défaut.

C’est ce qui fait que certains triplets de notre exemple ont le sujet suivant:

subject: about:http://shadok.enst.fr/ilot/OwlProject/rdfa/person.html

Une fois obtenu le sujet, nous afficons le triplet. Le code pour afficher le résultat est le même que précédemment.

Consider an example, when you click on <span property=”dc:creator”>Joshua Bloch</span>, rdfLib.getSubjectTriple() will go up and then find out that <span resource=”urn:ISBN:978-0321356680″> is the subject of the current triple:

<span resource="urn:ISBN:978-0321356680">
book is the inspiring <br>
<cite property="dc:title">Effective Java</cite> by
<span property="dc:creator">Joshua Bloch</span>
</span>

 As a result, we have:

subject: resource:urn:ISBN:978-0321356681
predicate: property:dc:creator
object: literal:Joshua Bloch

 * si l’élément cliqué a un sujet

Lorsque l’élément cliqué a un sujet, il est la base d’un triplet.

Nous parcourons alors l’arbre DOM vers le bas pour trouver tous les fils de cet élément qui permettent de compléter des triplets.

en utilisant l’appel

rdfLib.getAllTriples(event.target);

Supposez que nous cliquons sur l’élément <span resource=”urn:ISBN:978-0321356680″>, l’affichage des triplets pourra être obtenu ainsi:

var triples = RdfLib.getAllTriples(event.target);
for (var i = 0; i < triples.length; i++) {
triple = triples[i];
if (triple.subject != null) {
output += "subject: " + triple.subject.key + ":" + triple.subject.value;
output += "<br>";
}

if (triple.predicate != null) {
output += "predicate: " +  triple.predicate.key + ":" +
triple.predicate.value;
output += "<br>";
}

if (triple.object != null) {
output += "object: " +  triple.object.key + ":" + triple.object.value;
output += "<br>";
}
output += "------------------------------<br>";
}

 alors le résultat sera:

-----------------------
subject: resource:urn:ISBN:978-0321356681
predicate: property:dc:title
object: literal:Effective Java
------------------------------
subject: resource:urn:ISBN:978-0321356681
predicate: property:dc:creator
object: literal:Joshua Bloch
------------------------------

Noter que lorsque utilisé sur la racine de l’arbre DOM, l’appel RdfLib.getAllTriples(event.target) listera tous les triplets définis dans la page.

Ignorer certains triplets

La spécification  RDFa prime specification indique que lorsque nous avons un élément contenant les attributs ‘rel’ et ‘href’ simultanément,

le contenu de l’attribut ‘rel’ doit être considéré comme prédicat (predicate) et l’attribut ‘href’ doit être considéré comme object.

Malheureusement, il y a des execptions. Pae exemple, la déclaration d’un css externe répond à ces règles:

<link rel="stylesheet" type="text/css" href="http://link/to/file.css">

 Evidemment, cela n’est pas ce que nous voulons. La librairie fournit une manière d’éviter ces résultats inappropriés.

Tout ce dont nous avons besoin est de déclarer une table contenant les éléments que nous souhaitons ignorer:

var ignoreArray = [
"stylesheet",
"an element with space",
"other-element",
"yetAnotherElement",
];

où “stylesheet”, “an element with space” sont les valeurs de prédicat qui doivent être ignorés. Nous passons la table ignoreArray à la fonction addToIgnoreArray

rdfLib.addToIgnoreArray(ignoreArray);

 Cette fonction doit être appelée avant d’utiliser d’autres fonctions de la librairie.

Voir person.html pour plus de détails sur l’exemple.

(Source d’image : http://commons.wikimedia.org/wiki/File:Lyon_librairie_083.JPG )

Enrichir des documents pédagogiques grâce à DBPedia

 Lod-cloud-2011

Depuis plusieurs années, DBpedia donne une représentation formalisée des contenus de Wikipedia, donnant ainsi un accès manipulable par des algorithmes des données de Wikipedia. Le marquage sémantique d’éléments de contenus permet d’enrichir considérablement la recherche et l’exploitation de contenus.

Dans cette optique de marquage,  après avoir exploité des marquages RDFa dans les pages Web, fin 2012, Google a introduit le knowledge graph pour les utilisateurs français. Au même moment, une initiative soutenue par le Ministère de la Culture et Wikimédia a annoncé un effort accru pour une branche française de DBpedia, nommée SemanticPedia.

Nous allons voir ici comment ces initiatives peuvent contribuer à l’enrichissement de ressources pédagogiques. Les résultats présentés ici sont des ébauches pour introduire l’idée.

Ressources pédagogiques

Nous allons prendre comme support de travail un extrait d’un livre scolaire produit par lelivrescolaire.fr, disponible en ligne ici. Il s’agit d’un livre d’histoire-géographie, correspondant au programme de 6ème en France en 2013.

La méthode proposée peut se décliner sur le programme d’histoire-géographie d’autres classes ou d’autres documents sur le même programme, mais aussi sur d’autres disciplines comme les sciences de la vie. L’adaptation à des disciplines comme le français ou les mathématiques demandera probablement plus de réflexion. Pour la géométrie, un important travail a déjà été fat par le projet GeoSkills.

Nous allons utiliser le langage SPARQL. Il s’agit d’un langage d’interrogation de données liées -Linked Data- publiées dans un triple store.

Données sur les lieux

L’idée de départ est de récupérer des données sur les lieux et les événements cités.

Pour les lieux, nous pouvons nous intéresser à leur localisation géographique exacte, afin de les localiser sur une carte, à leur appartenance administrative -ex: la Bourgogne est une région de France-, à quelques données factuelles comme le nombre d’habitants ou le type de production le plus significatif en ce lieu.

Nous allons commencer par la localisation géographique.

Web sémantique et données culturelles

Nous voyons que le livre d’histoire aborde les pyramides de Gizeh. Nous pouvons aisément trouver la page correspondante de dbpedia: Gizeh

Observons les différents champs disponibles sur cette page et proposons quelques utilisations. Le lien contient la chaîne ‘resource’ et pointe vers une représentation exploitable automatiquement. Ce lien exploité dans un navigateur renvoie vers une page HTML présentant les mêmes données sous forme d’une page web.

La propriété dbpedia-owl:wikiPageWikiLink permet de récupérer un ensemble de liens vers des pages de Wikipedia relatives à Gizeh. Nous pouvons présenter une partie de ces liens comme sources d’informations complémentaires. Il serait surement utile de filtrer un peu cette liste; ce besoin sera l’objet d’un prochaine billet: filtrage automatique ou humain? effectué au niveau de l’ontologie de programme ou collaborativement par les enseignants?…

Les propriétés prop-fr:latitude et prop-fr:longitude nous donnent la position géographique. Cela peut aisément nous permettre de proposer des compléments grâce à une recherche par la position. Le complément le plus évident est l’affichage d’une carte, par exemple avec l’API de Google Maps.

Ce qui serait intéressant, par exemple, c’est trouver où il y d’autres pyramides afin de situer ce type d’architecture dans le temps et dans l’espace.

Que faire pour y arriver?

http://fr.dbpedia.org/page/Pyramides_d’%C3%89gypte

Dans cette page, on trouve des liens vers différentes pyramides, mais au milieu d’autres liens dans la propriété

dbpedia-owl:wikiPageWikiLink

qui prend par exemple la valeur

dbpedia-fr:Sékhemkhet

et

http://fr.wikipedia.org/wiki/Localisation_des_pyramides_%C3%A9gyptiennes

Nous voyons là qu’il y a des ressourceson peut imaginer une interface qui propose ces ressources et permet à un humain de faire une sélection. il est probablement beaucoup plus difficile de concevoir un processus automatique qui sélectionne de façon pertinente des ressources qui répondent à une attente précise.

Que faire encore?

Nous avons supposé qu’un lien était proposé entre le contenu d’une partie du livre et l’Egypte antique. Un scénario simple est celui où un utilisateur humain établi ce lien. Nous aborderons dans un prochain billet la question d’identifier dans le livre d’histoire les mots qui constituent probablement des références à des lieux, afin d’automatiser la recherche complémentaire de données sur ces lieux tel que nous venons de la voir.

[source d’image : http://semhpst.hypotheses.org/17 ]