Enrichir son catalogue avec dbPedia

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 :

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:&lt;http://fr.dbpedia.org/resource/Catégorie:&gt;;
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:&lt;http://fr.dbpedia.org/resource/Catégorie:&gt;;
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:&lt;http://dbpedia.org/resource/&gt;;
PREFIX dbo:&lt;http://dbpedia.org/ontology/&gt;;
PREFIX dcterms:&lt;http://purl.org/dc/terms/&gt;;
 
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 !

Partagez...
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Une réflexion au sujet de « Enrichir son catalogue avec dbPedia »

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *