Décembre 2012, Google propose le knowledge graph à ses utilisateurs français. Octobre 2012, l’Inria, le Ministère de la Culture et Wikimédia officialisent l’existence du dbpdia français sous le nom de code sémanticpédia. Ca bouge !
Et nos catalogues ? Comment les enrichir automatiquement avec dbpedia ?
Pour répondre à cette question ouverte par Lully sur son blog, j’ai tenté quelques observations et expériences avec le langage d’interrogation SPARQL.
Certaines des requêtes que vous aurez l’occasion de rencontrer peuvent sembler inutilies, des pages wikipédia existent pour décrire les mêmes résultats. Le but était d’expérimenter. En outre, ces requêtes peuvent être réutilisées pour en découvrir plus.
L’idée de départ est de récupérer la biographie des auteurs, musiciens et réalisateurs, ainsi que les prix et distinctions dont ils sont lauréats. Une fois ces données trouvées, il faudra ajouter un lien à chaque prix afin d’afficher tous les lauréats. Ceci étant dit, commençons l’exploration du web sémantique culturelle !
Exploration du graphe d’un auteur.
Observons la ressource Milan Kundera. Plusieurs informations sont disponibles :
- La propriété (appelé aussi prédicat) rdfs:label pour le nom au format chaîne. Il faut donc lire : l’Uri http://fr.dbpedia.org/page/Milan_Kundera a pour label (nom) la chaîne de catactère Milan Kundera
- La propriété dbpedia-owl:abstract qui lie le sujet Milan Kundera au résumé de sa page wikipédia.
- La propriété dbpedia-owl:award pour les prix et autres distinctions reçues par l’auteur. Dans le cas de Kundera :
- La propriété prop-fr:distinctions pour les prix mais les objets sont au format chaîne de caractère.
A première vue, on peut donc se dire que ces propriétés suffisent. Pourtant en suivant dbpedia-fr:Prix_Médicis, 21 auteurs sont liés au prix par l’intermédiaire du prédicat « is dbpedia-owl:award of ». On peut aussi retrouver ces informations grâce à la requête saisie dans l’éditeur SPARQL qui retourne les résultats:
SELECT ?nom WHERE { {?auteur dbpedia-owl:award dbpedia-fr:Prix_Médicis} UNION {?auteur prop-fr:distinctions "Prix_Médicis"} ?auteur rdfs:label ?nom. } ORDER BY ?nom
Analyse quantitative des prix représentés
Intéressons nous maintenant au nombre de lauréats par prix littéraires, essayons la requête suivante :
PREFIX categorie:<http://fr.dbpedia.org/resource/Catégorie:>; SELECT ?nomPrix,(COUNT(?nom) AS ?nombreLaureats) WHERE { # Récupère tous les graphes ayant un prédicat award ?s dbpedia-owl:award ?prix { # Permet de récupérer tous les prix littéraires français { ?prix dcterms:subject categorie:Prix_littéraire_en_France} UNION {?prix dbpedia-owl:wikiPageWikiLink dbpedia-fr:Prix_littéraire} ?prix rdfs:label ?nomPrix. } ?s rdfs:label ?nom } ORDER BY DESC (?nombreLaureats)
Soient 166 prix dont 31 prix avec plus de 10 lauréats et 55 avec 1 seul lauréat.
Cette solution était la plus attirante. Simple (pas de traitement de chaîne, de filtre), rapide (un DESCIRBE de la ressource suffisait). Elle n’est pas pourtant exhaustive et ne répond pas aux problèmes des homonymies. Par exemple, l’auteur de BD Boulet qui est décrit comme étant un boulet.
Il faut donc trouver une autre technique.
Et les catégories entrent en scène
La puissance de wikipédia et donc de dbpédia réside aussi dans la catégorisation des données qui ne ferait pas rougir un catalogueur. Ce principes va nous servir pour améliorer la qualité et la quantité des résultats retrouvés.
En regardant de nouveau la notice de Milan Kundera, le prédicat dcterms:subject retourne toutes les catégories de la page wikipédia de l’auteur. Parmi ces catégories :
- dbpedia-fr:Catégorie:Lauréat_du_prix_mondial_Cino_Del_Duca
- dbpedia-fr:Catégorie:Lauréat_du_prix_Médicis_étranger
- dbpedia-fr:Catégorie:Lauréat_du_grand_prix_de_littérature_de_l’Académie_française
On récupère donc l’information pour le prix de l’académie française, mais on perd les prix de Jérusalem, le Prix Herder et le Prix de la BnF. Par contre, quand on passe la requête suivant dans l’éditeur SPARQL :
PREFIX categorie:<http://fr.dbpedia.org/resource/Catégorie:>; SELECT ?nom WHERE { ?auteur dcterms:subject categorie:Lauréat_du_prix_Médicis. ?auteur rdfs:label ?nom. } ORDER BY DESC(?nom)
On obtient les résultats suivants. Soient 53 résultats pour le prix Médicis. Le compte est bon. Au moment de la génération de la base, le 2012 n’était pas connu.
Pour un « grand prix », ça fonctionne mais pour les autres prix ? Essayons la requête suivante qui retourne le nombre de lauréats pour tous les prix littéraires.
<span class="br0">PREFIX categorie:<http://fr.dbpedia.org/resource/Catégorie:>; SELECT DISTINCT ?nomPrix,(COUNT(?nom) AS ?nombreLaureats) WHERE { ?auteur dcterms:subject ?sujet. ?auteur rdfs:label ?nom. { { #Récupération des sujets ayant un lien avec les prix littéraires. ?sujet skos:broader categorie:Lauréat_de_prix_littéraire. ?sujet rdfs:label ?nomPrix. } } } ORDER BY DESC (?nombreLaureats)</span>
Soient 68 prix (donc moins que pour la méthode précédente) mais seulement 9 prix avec moins de 10 lauréats.
Pour les autres prix,. le prix décembre, ça marche (14). Prix de Flore (c’est bon). Par contre, pour le prix Locus (28) par exemple, on est bien loin du compte. Pour s’en convaincre, la page wikipédia du prix.
La requête qui récupère tous les lauréats du Médicis et les informations biographiques.
PREFIX categorie:<http://fr.dbpedia.org/resource/Catégorie:>; SELECT ?nom,?image,?abstract WHERE { ?auteur dcterms:subject categorie:Lauréat_du_prix_Médicis. ?auteur rdfs:label ?nom. OPTIONAL { ?auteur dcterms:subject ?naissance FILTER REGEX(?naissance, "Naissance_en_1", "i")} OPTIONAL { ?auteur dbpedia-owl:thumbnail ?image} OPTIONAL { ?auteur dbpedia-owl:abstract ?abstract} } ORDER BY ?naissanc
En conclusion
La seconde méthode semble donc plus complète mais ça n’est toujours pas exhaustif. En plus, il va falloir spécifier que tel sujet est un prix et que tel autre n’est qu’une date de naissance ou une fonction, donc récupérer les sujets contenant « lauréat », « meilleur » ou « prix ». On passera donc peut être à côté d’informations intéressantes.
Une autre solution est de faire une union du champs « award » et du sujet filtré. Il faut donc faire « comprendre » au programme que la catégorie « Lauréat du prix Médicis » correspond à la ressource « Prix médicis ». Le problème ? La relation est la suivante :
Catégorie:Lauréat_du_prix_Médicis – skos :broader -> dbpedia-fr:Catégorie:Prix_Médicis – is dcterms:subject of -> http://fr.dbpedia.org/page/Prix_Médicis
Cette relation ne fonctionnera pas dans tous les cas. En plus, si j’ai bien compris, SPARQL n’est pas conçu comme un langage de recherche mais comme un langage de requête. Ce qui réduit encore le champ d’application.
Enfin dbpedia français est en encore en version béta. Les résultats dans ce cadre sont pourtant satisfaisants. Alors qu’est ce qu’on fait ? Le dbpedia français n’a que quelques mois et on peut imaginer que les méthodes de croisement des données vont sûrement évoluer pour parvenir à plus de précision. Les articles wikipédia vont s’étoffer. On pourrait même imaginer (rêvons… C’est quand même le premier article du blog !) que les bibliothécaires arrêtent de cataloguer pour enrichir wikipédia qui enrichirait le catalogue !!!
Soyons optimistes… Une expérience d’enrichissement du catalogue peut donc être tentée. Ca tombe bien . C’est déjà fait. Vous pouvez voir une des notices de Milan Kundera et la liste des lauréats du prix Médicis Etranger Comment on fait ? Dans un prochain article…
UPDATE 18/01/2013 : DBpedia en français a réalisé une nouvelle extraction ce matin. Le prédicat dbpedia-owl:abstract a disparu.Dans tous les cas, une alternative est possible :
Interroger le chapitre en langue anglaise avec la requête suivante :
PREFIX db:<http://dbpedia.org/resource/>; PREFIX dbo:<http://dbpedia.org/ontology/>; PREFIX dcterms:<http://purl.org/dc/terms/>; SELECT DISTINCT ?abstract WHERE { {?auteur rdfs:label "Milan Kundera"@fr} UNION {?auteur foaf:name "Milan Kundera"@fr}. {?auteur a dbo:Person} UNION {?auteur a foaf:Person} {?auteur dbo:abstract ?abstract}. FILTER ( LANG(?abstract) = "fr" ) }
UPDATE 22/01/13 : Après un mail à dbpedia fr, Julien Cojan m’a répondu qu’il avait déjà corrigé ce problème. Il m’invite aussi dans des cas similaires à interroger d’autres chapitres de dbpedia. C’est vraiment très bien dbpedia !