Revenir à la page d'accueil.
Le cours "Outils numériques pour les historiens" de Francesco Beretta, avec tous les documents, fichiers et scripts associés, est mis à disposition selon les termes de la licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 4.0 International. |
Dans ce dernier exercice, il s'agira de transformer en données structurées les unités de connaissance concernant les naissances et les enseignements de quelques savants. Ces connaissances atomisées se trouvent dans les textes issus de notices biographiques de Wikipedia que nous avons déjà analysés dans le premier exercice. Il s'agit ici de répondre à la question: comment transformer en données structurées les connaissances extraites par les chercheurs de textes? La méthode présentée ici s'inspire de celle dévéloppée dans le projet symogih.org. On trouvera sur le site du projet de plus amples explications à ce sujet et, plus particulièrement au sujet d'encodage de textes en lien avec l'ontologie du projet, dans le manuel des utilisateurs.
Une unité de connaissance peut être conçue en tant qu'affirmation qui met en relation des objets, tout en indiquant quelle est la nature de cette relation. L'unité de connaissance, qui situe la relation entre objets dans l'espace et dans le temps, est donc équivalente à la notion de perdurant dans l'ontologie DOLCE, alors que les objets eux-mêmes (acteurs, lieux, concepts, etc.) correspondent à la notion de endurant.
Une première démarche consiste à produire des données structurées en les encodant dans les textes eux-mêmes. Pour ce faire, il faut d'abord définir dans la base de données les types d'unités de connaissance qu'on souhaite encoder en créant les objets respectifs: Naissance (objet 11) et Enseignement (objet 1621). Les objets/endurants participent aux unités de connaissance/perdurants en ayant un rôle spécifique. Pour la naissance, on aura la personne qui naît (définie par le type de rôle 'naître', correspondant à l'objet 23 de la base de données, alors que le lieu de naissance est associé par le type de rôle 'localiser', correspondant à l'objet 22). Pour ce qui concerne l'unité de connaissance de type Enseignement, elle est associé aux rôles qui définissent respectivement la personne qui enseigne (objet 1624), la matière enseignée (objet 1622), l'institution d'enseignement (objet 10) et la qualificaiton de l'enseignant (objet 1623).
A partir de la définition de ces objets, munis de leurs identifiants respectifs, on peut coder ainsi une naissance:
1 {ud0} 2 {eud}Christopher Grienberger{/eud} 3 {ud0_9}{in0_11}{en1620_23}Christopher Grienberger{/en} (aussi écrit Christopher Gruemberger, ou encore Grinberg, Bamberger, ou Gamberger, voire Panberger), né le {dat15510702_du}2 juillet 1551{/dat} à {en0li_22}Hall dans le Tyrol{/en}{/in}, et mort le 11 mars 1636 à Rome, est prêtre jésuite autrichien, mathématicien et professeur au Collège romain. Un cratère lunaire est nommé en son honneur Gruemberger.{/ud} 4 ... 5 {/ud}
A la ligne 1, une balise de type “unité documentaire” ouvre la portion de texte correspondante à la notice biographique, qui termine à la ligne 5. A la ligne 2, l'entête de l'unité documentaire à la fonction de titre de la portion de texte qui suit.
A la ligne 3, une nouvelle balise “unité documentaire” est ouverte. Elle est identifiée par l'objet 9 de la base de donnée, un objet abstrait intitulé “Résumé de la notice” qui indique le contenu du segment. Il est ainsi possible de créer un typologie des unités documentaires. A cette même ligne comment l'unité de connaissance de type Naissance (objet 11), introduite par la balise {in0_11} dont le premier chiffre “0” indique qu'il n'y a pas d'objet correspondant précis à cette information dans la base de donnée et le deuxième, “11” que cette unité de connaissance est de type “Naissance”. Quant aux rôles, ils sont encodés dans les balises qui enveloppent les entités nommées:
De plus a été encodée la date: {dat15510702_du} exprimée au format de la norme ISO et dont le type est “date unique” (du).
Grâce à cette méthode il est possible d'encoder dans le texte tout type d'unité de connaissance, tout en définissant préalablement les types dans la base de donnée afin de disposer des identifiants à utiliser pour le codage. Voici un exemple de document encodé. Selon la méthode décrite dans le troisième exercice, le texte encodé doit être copié dans la base de données (dans ce cas il s'agit de l'objet 3) et transformé avec la fonction appropriée
SELECT vues.transformation_xml(3)
qui produit le texte XML inséré dans le champs “texte_xml” du même objet. On peut ensuite extraire les données encodées grâce à une requête SQL/XPath appropriée. Nous illustrerons cette démarche à l'aide de deux exemples.
Voici la requête qui permet d'extraire toutes les unités de connaissance, de n'importe quel type:
WITH tw1 AS ( SELECT UNNEST(xpath ('//in',texte_xml)) texte_xml FROM objets.objet WHERE pk_objet = 3 ) SELECT tw1.texte_xml, (((xpath ('/in/@ana',tw1.texte_xml))[1])::text)::INTEGER cle_type_information, t1.nom type_information, ((xpath('/in/dat/@when',tw1.texte_xml))[1])::text DATE, ((xpath('/in/en/@ref',tw1.texte_xml))[1])::text acteur, t2.nom nom_acteur FROM tw1 JOIN vues.vm_objet_vue_de_base t1 ON t1.pk_objet = ( ( (xpath ('/in/@ana',tw1.texte_xml))[1])::text)::INTEGER LEFT JOIN vues.vm_objet_vue_de_base t2 ON t2.pk_objet = ( ((xpath('/in/en/@ref',tw1.texte_xml))[1])::text)::INTEGER
Et le résultat:
Unité de connaissance | Clé du type d'unité de connaissance | Type d'unité de connaissance | Date | Clé de l'acteur concerné | Nom de l'acteur concerné |
---|---|---|---|---|---|
<in ana=“11”><en ref=“1620” ana=“23”>Christopher Grienberger</en> (aussi écrit Christopher Gruemberger, ou encore Grinberg, Bamberger, ou Gamberger, voire Panberger), né le <dat when=“15510702” type=“du”>2 juillet 1551</dat> à <en type=“li” ana=“22”>Hall dans le Tyrol</en></in> | 11 | Naissance | 15510702 | 1620 | Grienberger, Christoph |
<in ana=“11”><en ref=“1619” ana=“23”>Michael Maestlin</en> (aussi appelé Mästlin, Möstlin, ou Moestlin), né le <dat when=“15500930” type=“du”>30 septembre 1550</dat> à <en type=“li” ana=“22”>Göppingen en Bade-Wurtemberg</en></in> | 11 | Naissance | 15500930 | 1619 | Maestlin, Michael |
<in ana=“1621”><dat when=“1580” type=“dd”>En 1580</dat>, <en ref=“1619” ana=“1624”>il</en> est devenu <en><en ref=“1625” ana=“1623”>professeur</en> de <en ref=“15” ana=“1622”>mathématiques</en></en> à l'<en ana=“10”>université de <en type=“li”>Heidelberg</en></en>[jusqu'en <dat when=“1583” type=“df”>1583</dat>]</in> | 1621 | Enseignement | 1580 | 1619 | Maestlin, Michael |
<in ana=“1621”><en ref=“1619” ana=“1624”>Il</en> a enseigné ensuite à l'<en ana=“10”>université de <en type=“li”>Tübingen</en></en> à partir de <dat when=“1583” type=“dd”>1583</dat>, à l'âge de 47 ans</in> | 1621 | Enseignement | 1583 | 1619 | Maestlin, Michael |
<in ana=“11”><en ref=“17” ana=“23”>Nicolas-Claude Fabri de Peiresc</en> (également orthographié de Peyresc), né le <dat when=“15801201” type=“du”>1er décembre 1580</dat> à <en type=“li” ana=“22”>Belgentier</en></in> | 11 | Naissance | 15801201 | 17 | Nicolas Claude Fabri de Peiresc |
La requête peut évidemment être adaptée au questionnement du chercheur. On peut ainsi, par exemple, sélectionner et mettre en forme uniquement les enseignements:
WITH tw1 AS ( SELECT UNNEST(xpath ('//in',texte_xml)) texte_xml FROM objets.objet WHERE pk_objet = 3 ) SELECT tw1.texte_xml, (((xpath ('/in[@ana=1621]/@ana',tw1.texte_xml))[1])::text)::INTEGER cle_type_information, t1.nom type_information, array_to_string(xpath('/in/dat/@when',tw1.texte_xml), '–') dates, array_to_string(xpath('/in/en[@ana=1624]/@ref',tw1.texte_xml), ',') acteur, t2.nom nom_acteur, regexp_replace(array_to_string(xpath('/in/en[@ana=10]/descendant-or-self::*/text()',tw1.texte_xml), ' '), '\s{1,}', ' ', 'g' ) institution, array_to_string(xpath('//en[@ana=1622]/descendant-or-self::*/text()',tw1.texte_xml), ',') matiere FROM tw1 JOIN vues.vm_objet_vue_de_base t1 ON t1.pk_objet = ( ( (xpath ('/in/@ana',tw1.texte_xml))[1])::text)::INTEGER LEFT JOIN vues.vm_objet_vue_de_base t2 ON t2.pk_objet = ( ( (xpath ('/in/en/@ref',tw1.texte_xml))[1])::text)::INTEGER WHERE (((xpath ('/in[@ana=1621]/@ana',tw1.texte_xml))[1])::text)::INTEGER = 1621
Et le résultat:
texte_xml | cle_type_information | type_information | dates | acteur | nom_acteur | institution | matière |
---|---|---|---|---|---|---|---|
<in ana=“1621”><dat when=“1580” type=“dd”>En 1580</dat>, <en ref=“1619” ana=“1624”>il</en> est devenu <en><en ref=“1625” ana=“1623”>professeur</en> de <en ref=“15” ana=“1622”>mathématiques</en></en> à l'<en ana=“10”>université de <en type=“li”>Heidelberg</en></en>[jusqu'en <dat when=“1583” type=“df”>1583</dat>]</in> | 1621 | Enseignement | 1580–1583 | 1619 | Maestlin, Michael | université de Heidelberg | mathématiques |
<in ana=“1621”><en ref=“1619” ana=“1624”>Il</en> a enseigné ensuite à l'<en ana=“10”>université de <en type=“li”>Tübingen</en></en> à partir de <dat when=“1583” type=“dd”>1583</dat>, à l'âge de 47 ans</in> | 1621 | Enseignement | 1583 | 1619 | Maestlin, Michael | université de Tübingen |
Si souhaité, et en fonction du type de questionnement et de sources, les données structurées peuvent être directement produites dans la base de données. Dans ce cas, on produira un objet de type Information ou Contenu, correspondant à une unité de connaissance. Les Informations reproduisent les connaissances produites par les chercheurs grâce à l'analyse critique d'une ou plusieurs sources; les Contenus reproduisent les connaissances telles qu'elles sont exprimées par une et une seule source. Il est donc indispensable d'indiquer la source de l'unité de connaissance.
A titre d'exemple, la base de données contient une Information de type Naissance (objet 13) dont la source est la notice tirée de Wikipedia. A cette connaissance sont associés deux rôles: l'acteur qui naît et le lieu qui localise la naissance.
Les données structurées ainsi produites peuvent être interrogées par des requêtes SQL appropriées.