Revenir à la [[:td_histoire_numerique:accueil|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. |
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:
* {en1620_23} enveloppe l'objet 1620 de la base de données, "Grienberger, Christoph", dont le rôle est l'objet 23: "naître".
* {en0li_22} enveloppe un objet qui n'a pas encore été créé dans la base de données (d'où l'identifiant "0") mais dont le rôle est défini par l'objet 22: "localiser".
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).
===== Extraction de donnée structurées =====
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 {{:td_histoire_numerique:notices_wikipedia_annote.odt|exemple de document encodé}}. Selon la méthode décrite dans le [[td_histoire_numerique:exercice_3#transformation_des_textes_encodes_en_xml|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.
==== Extraction de toutes les unités de connaissance ====
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é^
|
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^
|