Outils pour utilisateurs

Outils du site


td_histoire_numerique:exercice_5

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
Prochaine révision Les deux révisions suivantes
td_histoire_numerique:exercice_5 [2016/01/05 22:15]
Francesco Beretta [Transformation d'unités de connaissance en données]
td_histoire_numerique:exercice_5 [2016/01/05 23:12]
Francesco Beretta [Extraction des naissances]
Ligne 13: Ligne 13:
 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 [[td_histoire_numerique:​premier_exercice|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 [[http://​symogih.org|symogih.org]]. On trouvera sur le [[http://​symogih.org|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 [[https://​groupes.renater.fr/​wiki/​symogih/​symogih_manuel/​edition_de_textes_en_xml-tei|manuel des utilisateurs]]. 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 [[td_histoire_numerique:​premier_exercice|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 [[http://​symogih.org|symogih.org]]. On trouvera sur le [[http://​symogih.org|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 [[https://​groupes.renater.fr/​wiki/​symogih/​symogih_manuel/​edition_de_textes_en_xml-tei|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 ​des 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 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//​.
  
  
 ===== Encodage des unités de connaissance dans les textes ===== ===== Encodage des unités de connaissance dans les textes =====
  
-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é ​de connaissance en créant les objets respectifs: Naissance (objet 11) et Enseignement (objet 1621). Les objets participent aux unités de connaissance en ayant un rôle spécifique. Pour la naissance, on aura la personne qui naît (définier ​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 est de l'enseignementil 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). ​+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 Enseignementelle 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:
 +<​code>​
 +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}
 +</​code>​
  
 +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
 +<code html>​SELECT vues.transformation_xml(3)</​code>​
 +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:
 +<code sql>
 +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
 +</​code>​
 +
 +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|
 +
 +
 +==== Extraction des naissances ====
 +
 +La requête peut évidemment être adaptée au questionnement du chercheur. On peut ainsi, par exemple, sélectionner uniquement les enseignements:​
 +<code sql>
 +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
 +</​code>​
 +
 +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| |
 + 
td_histoire_numerique/exercice_5.txt · Dernière modification: 2016/03/03 10:26 par Francesco Beretta