J'avais évoqué le Web sémantique le mois dernier, je reviens un peu sur le sujet puisque je suis maintenant entré dans le monde merveilleux de HTML5.
Qu'est-ce que le Web sémantique ?
L'idée du Web sémantique, expliquée à un enfant de cinq ans
(bon, OK, peut-être douze), pourrait être exposée comme
ceci. Les ordinateurs ne sont pas très malins, ils ne savent pas
comprendre le français (ou l'anglais, ou le chinois…), et en
particulier, les moteurs de recherche ne comprennent rien du tout des
pages Web qu'ils indicent : ils ne voient qu'un tas de liens qui
pointent vers d'autres pages Web, séparées par du texte qui pourrait
aussi bien être en cunéiforme. Ça ne les empêche pas de donner de
bons résultats avec de la simple recherche dans du texte, mais parfois
on aimerait bien qu'ils comprissent ce qu'ils reçoivent : ça
permettrait de faire des recherches plus sophistiquées (par exemple :
trouve-moi une recette de cuisine de gâteau facile à préparer en moins
de 40′ — si on recherche les mots-clés les plus évidents, on peut
encore s'en sortir pour les
mots recette
, gâteau
, facile
, mais le moins de
40′
à peu de chances d'apparaître comme ça dans la page, et
inversement on peut tomber sur une page qui raconte j'ai réparé mon
ordinateur en moins de 40′, c'était vraiment facile de changer le
disque dur, la bidouille c'est du gâteau et je vais vous donner la
recette de comment je m'y suis pris
). D'où l'idée d'inventer un
langage permettant de communiquer des informations simples d'une
manière compréhensible par un moteur de recherche : non pas d'écrire
une page Web séparée dans un langage adressé aux ordinateurs, mais
d'annoter une page Web destinée aux humains pour permettre aux
ordinateurs de s'y retrouver un peu, et de savoir vaguement de quoi ça
parle.
Il n'est pas question de traduire tout le texte en langage machine,
ni que ça s'applique à des concepts subtils, mais uniquement de
faciliter la digestion d'informations factuelles simples qui
pourraient figurer dans une base de données. Par exemple, expliquer
que ceci est un blog, que le lien en haut à gauche est un permalien,
que l'avant-dernière entrée est la
critique d'un film (que les mots Habemus papam
sont le titre de
ce film, et Nanni Moretti
le nom du réalisateur, et que la
critique dans son ensemble pourrait se résumer par telle note). Un
commerçant en ligne pourrait indiquer qu'il s'agit d'un commerçant en
ligne, spécialisé dans tel type de choses, et s'il a des locaux dans
le monde physique, à quel endroit ils sont, quelles en sont les
horaires d'ouverture, etc. De cette manière, quelqu'un qui
chercherait sur Google Maps tel type de commerce pourrait voir ce
résultat apparaître.
C'est une bien jolie idée, il n'est pas sûr que ça puisse marcher. Par exemple parce que dès lors que les moteurs de recherche et les humains ne lisent pas exactement la même chose, quelqu'un peut avoir intérêt à chercher à tricher, à présenter une information dans le texte en français et une autre, contradictoire, dans le Web sémantique, parce que c'est la première qui l'engage et la seconde qui aide à le trouver, donc il pourrait afficher des prix faux pour ses articles. Ou quelque chose comme ça. D'un autre côté, il est déjà possible de faire à des fins douteuses des sites Web qui apparaissent différemment à Google et à un humain (mais si Google l'apprend ils vous punissent, et il y a des mécanismes pour signaler ce genre de tromperies). Il n'est pas non plus clair que ce soit si rentable (si quelqu'un est venu vous voir en cherchant le produit X et que vous ne l'avez pas, vous pouvez y gagner en vendant le produit Y à la place, mais vous pouvez aussi l'énerver beaucoup). Enfin, si les navigateurs évoluent eux aussi pour comprendre le Web sémantique et le présenter aux utilisateurs, ça permettra de démasquer ce genre de tromperie. Bref, pour l'instant, tout ceci est assez théorique — mais la question se pose en tout cas de savoir qui doit faire confiance à qui pour dire quoi sur quoi.
RDF(a), microformats et microdonnées
Il y a essentiellement trois mécanismes concurrents (c'est-à-dire, deux de trop) qui prétendent arriver à rendre réel le Web sémantique : le RDF(a), les microformats et les microdonnées.
RDF(a) et ses triplets
Le RDF
est le mécanisme le plus ancien, inventé
au W3C,
et le plus ambitieux ; il s'agit d'un cadre extrêmement général,
et RDFa
est le mécanisme permettant d'inclure du RDF dans
du HTML. Les « données » du monde RDF sont
des triplets de la forme (sujet, verbe, objet) :
le sujet est la chose sur laquelle on donne une
information, le verbe (ou prédicat) est la
propriété qu'on exprime, et l'objet est la valeur de cette
propriété. Le sujet et le verbe doivent recevoir des identifiants
uniques, qui sont
des URI :
ça peut surprendre pour le sujet, et encore plus pour le verbe, vu que
les URI sont a priori un mécanisme pour identifier
les ressources Web (ou d'autres ressources informatiques) et on veut
pouvoir parler de tout et de n'importe quoi, mais rien ne dit que
ces URI soient vraiment des ressources Web, ou soient
accessibles d'une manière quelconque (par exemple,
l'URI urn:isbn:978-3-499-22392-1
identifie un livre dont je parlais
récemment, et ce n'est pas en tapant cette URI dans
votre navigateur que ce livre va magiquement apparaître devant vous) ;
néanmoins, on aura souvent tendance à utiliser une page Web ou en tout
cas un document informatique accessible en HTTP comme une
sorte de faire-valoir pour une ressource quelconque (ce qui pose, au
demeurant, la question de savoir comment on peut parler de cette page
Web dans le langage RDF), et notamment même les verbes
ont des ressources de ce genre, par
exemple http://purl.org/dc/elements/1.1/title
« est » le verbe avoir pour titre dans le vocabulaire dit du
Dublin Core (cette URI conduit à une
redirection HTTP vers une autre adresse, mais le bon
identifiant est celui que j'ai écrit). Quant aux objets, ils peuvent
être identifiés par des URI, mais certains verbes
appellent une propriété qui est une simple chaîne de caractères. Pour
en savoir plus sur le modèle, une lecture pas trop mauvaise est
cette introduction
à RDF publiée par le W3C et qui explique
assez bien comment tout cela fonctionne.
Le format RDF spécifie un certain nombre de verbes de
base, qui correspondent à des relations assez abstraites ; il y a un
standard
adjacent, RDF-S,
qui en ajoute d'autres, et tout ceci est compliqué par un système de
typage, mais de façon générale, le format RDF reste
totalement général et abstrait, on pourrait dire qu'il s'agit
simplement d'une grammaire : toutes les notions un peu concrètes
relèvent d'autres standards, qu'on appelle des ontologies
ou de façon moins pédante des vocabulaires. Si on a un
document RDF et qu'on comprend le RDF mais
pas le vocabulaire utilisé, on est dans la situation de quelqu'un qui
comprendrait parfaitement la grammaire d'une langue mais n'en
comprendrait pas un seul mot (ou juste des choses aussi basiques
que être
et avoir
). Les outils pour traiter
le RDF, bien sûr, ne prétendent pas comprendre les
verbes : ils offrent juste un mécanisme général pour analyser les
données, et c'est ensuite au programme les utilisant de décider quels
verbes il veut gérer et comment.
En particulier, une des caractéristiques du RDF est d'être totalement décentralisé : n'importe qui peut ajouter de nouveaux verbes au langage, puisque n'importe quelle URI peut servir de Web, et n'importe qui peut publier des ontologies. Bien sûr, on n'a aucune chance d'être compris si on invente des verbes dans son coin, mais l'idée est que les mêmes données RDF peuvent préciser sur les mêmes objets des propriétés venant de plusieurs sources différentes, et éventuellement se recoupant : ce n'est pas grave, chaque lecteur des données gardera ce qu'il comprendra et jettera les verbes qui sont du chinois pour lui.
L'inconvénient de tant de généralité, bien sûr, c'est que
le RDF est compliqué à traiter. Ou du moins, ça dépend
de ce qu'on veut en faire : s'il s'agit juste d'extraire et de
chercher des ensembles de triplets, ce n'est pas très difficile, mais
si on ajoute la machinerie des types, des conteneurs et autres
collections
(rdf:Bag
, rdf:Seq
, rdf:Alt
, rdf:List
),
de la réification (les propriétés sur les propriétés), et qu'on veut
traiter tout ça de façon intelligente, ce n'est pas du tout
facile.
Les microformats
Les microformats sont l'extrême opposé du RDF : alors que RDF est un mécanisme extrêmement général et abstrait, une grammaire sans vocabulaire, les microformats ne distinguent pas du tout grammaire et vocabulaire, et ne cherchent pas du tout à faire général. Il s'agit simplement d'une façon d'utiliser le HTML tel qu'il existe déjà, quitte à procéder de manière peu élégante et certainement pas extensible, pour permettre d'y exprimer certaines données dans un cadre bien limité correspondant à des usages pratiques réels.
Le mécanisme de base est d'utiliser l'attribut class
du HTML : celui-ci sert à affecter les éléments à une ou
plusieurs « classes » dont le principal usage est dans le cadre
du CSS, parce que CSS permet d'appliquer des
règles de style (couleur, taille des caractères, largeur, etc.) selon
les classes auquel l'élément appartient. Par exemple, dans une page
des commentaires de ce blog, chaque commentaire est dans une
balise div
qui est affectée à la
classe comment-ruxor
ou bien comment
selon
qu'elle a été postée par moi ou par quelqu'un d'autre, et ensuite la
feuille de style CSS affecte la couleur du fond du cadre
différemment pour une classe ou l'autre. (Ceci n'a rien à voir avec
les microformats.)
Les microformats utilisent les classes pour un autre usage, en
décidant que certains noms seront magiques : par exemple, si une page
Web contient un élément affecté à la classe vcard
et que
celui-ci contient un autre élément de la classe fn
, alors
les microformats (et
spécifiquement, hCard)
commandent d'interpréter ça comme le nom d'une personne dont d'autres
propriétés peuvent être décrites dans l'élément de
classe vcard
. Pour d'autres types de données, les
microformats utilisent aussi l'attribut rel
sur les liens
(indiqués par les balises link
ou a
).
L'avantage, c'est que c'est très simple. L'inconvénient, c'est que ça ne permet d'exprimer que très peu de choses, et aussi (ce, conceptuellement, qui me dérange beaucoup plus) que si par hasard une page Web a utilisé par hasard des noms de classes qui sont définis par les microformats, elle aura peut-être, si j'ose dire, « un sens malgré elle ».
Les microdonnées
Les microdonnées
sont le dernier-né de la famille, et adoptent une position vaguement
intermédiaire entre la généralité du RDF et l'approche
pragmatique très limitée des microformats. Comme le RDFa
(et contrairement aux microformats qui réutilisent des attributs déjà
existants), les microdonnées étendent la syntaxe du HTML,
mais à la différence du RDFa (qui est plutôt lié au monde
défunt du XHTML2), les microdonnées ont l'oreille des
éditeurs du HTML5, et les attributs qu'elles
introduisent, itemid
, itemscope
, itemtype
, itemprop
et itemref
, font partie de la spécification officielle
(au moins dans
sa version WHATWG).
La principale différence avec RDF est surtout que le
modèle de données est plus simple et hiérarchique (les gens écrivent
que RDF a un modèle en graphe
alors que les
microdonnées ont un modèle en arbre
, mais je ne suis pas sûr
que ça ait vraiment un sens ni que ce soit vrai
puisque itemid
permet en principe d'identifier deux nœuds
quelconques).
Disons que les microdonnées s'inspirent des mécanismes des langages
orientés objets : un objet appartient à une classe (définie par une
ontologie, mais sans que le langage permette la réflexion
du RDF où les ontologies contiennent elles-mêmes des
propriétés RDF sur les verbes qu'elles définissent),
cette classe définit un certain nombre de propriétés, qui peuvent
elles-mêmes être des objets pour les microdonnées. Un objet se décrit
avec l'attribut itemscope
, son type
avec itemtype
, une propriété avec itemprop
,
la valeur de la propriété est indiquée par le contenu de l'élément (le
cible d'un lien a
ou link
s'il s'agit
d'une URL, la valeur contenue dans un time
s'il s'agit d'une date, l'attribut content
d'une
balise meta
, ou simplement le contenu texte d'un élément,
ou encore l'objet défini si l'élément porte
un itemscope
). Les choses sont par
exemple expliquées
ici par Mark Pilgrim (moins les éléments itemid
et itemref
, qui ont été ajoutés plus récemment, et pour
lesquels le mieux est de lire la spec).
Comme le RDF, les microdonnées ont besoin d'une ontologie (un vocabulaire) pour être utiles. Il y a un bout de vocabulaire défini dans la norme même du HTML5 (et qui reprend les concepts les plus populaires des microformats : hCard et hEvent), mais le gros morceau est surtout venu de Schema.org, un consortium réunissant Google, Microsoft (enfin, Bing) et Yahoo!, ce qui fait assurément du poids derrière. Ce qui est malheureux, c'est que les microformats permettent beaucoup moins facilement que le RDF de mélanger des vocabulaires, donc il est essentiellement impossible de publier les mêmes informations sous le format hCard-par-microdonnées et Schema.org.
La guéguerre entre tout ça
Les partisans de chacun de ces systèmes vont vous expliquer que le leur est le mieux (et les sceptiques du Web sémantique en général diront que de toute façon on devrait mettre nos bits ailleurs). Les partisans des microformats diront que c'est un truc qui marche maintenat. Les partisans du RDF diront que les microdonnées ne permettent pas d'exprimer tout ce que le RDF permet (et accessoirement que les microdonnées ont fait de l'entrisme dans le HTML5 alors que le RDFa en a été plus ou moins viré). Et les partisans des microdonnées diront que c'est plus simple, que c'est tout ce dont on a besoin, et que de toute façon puisque Google et compagnie misent là-dessus c'est ce qui marchera. Parmi les articles que j'ai trouvés, les plus convaincants et intéressants semblent être : cette comparaison générale (par un vague partisan du RDF, mais il reste assez neutre), cette explication (aussi par un vague partisan du RDF, dont le blog contient d'ailleurs plein d'autres articles intéressants sur le sujet) sur le problème lié à l'impossibilité de donner plusieurs types à un objet en microdonnées (et il me semble effectivement que c'est le problème le plus sérieux des microdonnées), et surtout cette longue explication par un des promoteurs du HTML5 qui répond assez en détail aux objections que les autres font aux microdonnées (et souligne donc les problèmes qu'il voit aux microformats et au RDFa ou au moins à la façon dont on parle de se servir du RDFa). Dans le genre humoristique, voir aussi cette réaction de quelqu'un qui aime le RDFa et qui n'apprécie pas du tout qu'on le pousse à faire des microdonnées.
Et moi dans l'histoire ?
J'ai un avis très faible sur la qualité relative des différents
mécanismes du Web sémantique. J'ai l'impression
qu'effectivement, RDF est sans doute mieux pensé, mais
peut-être trop difficile à mettre en œuvre. Les microformats me
gênent par leur mécanisme trop ad hoc et par l'absence de
mesures tendant à éviter un conflit de noms (ils auraient au moins pu
exiger la présence d'une classe nommée microformat-scope
sur le plus haut élément d'un microformat !). Les microdonnées
semblent un compromis raisonnable, même si le problème du typage
multiple (qui rend quasiment impossible l'utilisation simultanée de
plusieurs vocabulaires) me semble effectivement sérieux, et j'espère
qu'une solution sera trouvée.
Mais de toute façon mon but à moi, si je dois mettre des
informations sémantiques sur mes pages Web, est seulement
de faire joujou (bon, c'est vrai
que j'aimerais bien aider les moteurs de recherche à comprendre que
ceci est un blog et que ça n'a aucun sens d'indicer les pages
mensuelles comme des pages Web uniques, par contre indicer les entrées
séparément et utiliser les permaliens serait bien — mais j'ai peu
d'espoir de ce côté-là). J'ai donc saupoudré de microdonnées (dans le
vocabulaire Schema.org) la page tout
sur David Madore, on verra si ça a la moindre incidence sur quoi
que ce soit (j'en doute). Je remarque au moins en passant par
l'outil
de test de Google que (1) il comprend effectivement quelque chose,
mais que (2) il buggue quand même complètement dans l'interprétation
de l'attribut itemref
relativement à ce que dit le
standard HTML5 (je n'arrive pas du tout à comprendre ce
qu'il a fumé avec le itemref
, mais en tout cas c'est
n'importe quoi).