Utilisation de plusieurs documents XML


Exemple : sortie XML d'un étiqueteur :
<?xml version="1.0" encoding="iso-8859-1"?>
<doc>
    <taggersent>
        <taggertoken wordform="Romane" lemma="roman" pos="ADJ:femi:sg"/>
        <taggertoken wordform="se" lemma="se" pos="PRO"/>
        <taggertoken wordform="réveilla" lemma="réveiller" pos="VER:sg"/>
        <taggertoken wordform="par" lemma="par" pos="PRP"/>
        <taggertoken wordform="un" lemma="un" pos="DET:masc:sg"/>
        <taggertoken wordform="matin" lemma="matin" pos="NOM:masc:sg"/>
        <taggertoken wordform="clair" lemma="clair" pos="ADJ:masc:sg"/>
        <taggertoken wordform="." lemma="." pos="PUN"/>
    </taggersent>
    <taggersent>
        <taggertoken wordform="Un" lemma="un" pos="DET:masc:sg"/>
        <taggertoken wordform="boa" lemma="boa" pos="NOM:masc:sg"/>
        <taggertoken wordform="," lemma="," pos="PUN"/>
        <taggertoken wordform="rampant" lemma="ramper" pos="VER:ppre"/>
        <taggertoken wordform="sur" lemma="sur" pos="PRP"/>
        <taggertoken wordform="le" lemma="le" pos="DET:masc:sg"/>
        <taggertoken wordform="sol" lemma="sol" pos="NOM:masc:sg"/>
        <taggertoken wordform="," lemma="," pos="PUN"/>
        <taggertoken wordform="la" lemma="la" pos="PRO"/>
        <taggertoken wordform="scrutait" lemma="scruter" pos="VER:sg"/>
        <taggertoken wordform="placidement" lemma="placidement" pos="ADV"/>
        <taggertoken wordform="." lemma="." pos="PUN"/>
    </taggersent>
    <taggersent>
        <taggertoken wordform="Elle" lemma="elle" pos="PRO"/>
        <taggertoken wordform="lui" lemma="lui" pos="PRO"/>
        <taggertoken wordform="lut" lemma="lire" pos="VER:sg"/>
        <taggertoken wordform="un" lemma="un" pos="DET:masc:sg"/>
        <taggertoken wordform="passage" lemma="passage" pos="NOM:masc:sg"/>
        <taggertoken wordform="du" lemma="du" pos="PRP:DET:masc:sg"/>
        <taggertoken wordform="Tao" lemma="tao" pos="NOM:masc:sg"/>
        <taggertoken wordform="," lemma="," pos="PUN"/>
        <taggertoken wordform="puis" lemma="puis" pos="ADV"/>
        <taggertoken wordform="lui" lemma="lui" pos="PRO"/>
        <taggertoken wordform="raconta" lemma="raconter" pos="VER:sg"/>
        <taggertoken wordform="l'" lemma="le" pos="DET:masc:sg"/>
        <taggertoken wordform="histoire" lemma="histoire" pos="NOM:femi:sg"/>
        <taggertoken wordform="d'" lemma="de" pos="PRP"/>
        <taggertoken wordform="Esteban" lemma="unknown" pos="NOM:masc:sg"/>
        <taggertoken wordform="," lemma="," pos="PUN"/>
        <taggertoken wordform="Zia" lemma="unknown" pos="NOM:masc:sg"/>
        <taggertoken wordform="," lemma="," pos="PUN"/>
        <taggertoken wordform="Tao" lemma="tao" pos="NOM:masc:sg"/>
        <taggertoken wordform="et" lemma="et" pos="CON"/>
        <taggertoken wordform="des" lemma="du" pos="PRP:DET:femi:pl"/>
        <taggertoken wordform="merveilleuses" lemma="merveilleux" pos="ADJ:femi:pl"/>
        <taggertoken wordform="cités" lemma="cité" pos="NOM:femi:pl"/>
        <taggertoken wordform="d'" lemma="de" pos="PRP"/>
        <taggertoken wordform="or" lemma="or" pos="NOM:masc:sg"/>
        <taggertoken wordform="." lemma="." pos="PUN"/>
    </taggersent>
</doc>
Le tagger pouvant avoir du mal à étiqueter les noms propres, on peut effectuer un traitement sur la sortie (pour les besoins de l'exemple... dans la réalité, un pré-traitement serait plus opportun) en s'aidant de lexiques. On peut imaginer posséder un lexique de prénoms courants pour remplacer le lemme et la fonction de tokens dont le forme est présente dans ce lexique. Or certains prénoms sont également des mots du dictionnaire (noms communs, adjectifs, ...) Il est alors nécessaire de ne remplacer que les tokens dont les formes se trouvent dans le lexique des prénoms et ne se trouvent pas dans le lexique général.
extrait "prenoms.xml" extrait "lexique.xml"
<liste-prenoms>
    <prenom type="masc">Aimable</prenom>
    <prenom type="fem">Aline</prenom>
    <prenom type="masc">Bob</prenom>
    <prenom type="mixte">Candide</prenom>
    <prenom type="fem">Claire</prenom>
    <prenom type="mixte">Claude</prenom>
    <prenom type="masc">Dimitri</prenom>
    <prenom type="masc">Esteban</prenom>
    <prenom type="masc">Placide</prenom>
    <prenom type="fem">Romane</prenom>
    <prenom type="fem">Rose</prenom>
    <prenom type="masc">Raphael</prenom>
    <prenom type="fem">Sol</prenom>
    <prenom type="masc">Tao</prenom>
    <prenom type="fem">Victoire</prenom>
    <prenom type="fem">Zia</prenom>
</liste-prenoms>
  
<lexique>
    <token form="aima"/>
    <token form="aimable"/>
    <token form="aimablement"/>
    <token form="boa"/>
    <token form="bob"/>
    <token form="bobard"/>
    <token form="candidatures"/>
    <token form="candide"/>
    <token form="candidement"/>
    <token form="clair"/>
    <token form="claires"/>
    <token form="clairement"/>
    <token form="classons"/>
    <token form="claude"/>
    <token form="claudicant"/>
    <token form="placez"/>
    <token form="placide"/>
    <token form="placidement"/>
    <token form="romands"/>
    <token form="romane"/>
    <token form="romanes"/>
    <token form="rosbifs"/>
    <token form="rose"/>
    <token form="roseau"/>
    <token form="sojas"/>
    <token form="sol"/>
    <token form="solacia"/>
    <token form="tantristes"/>
    <token form="tao"/>
    <token form="taoisme"/>
    <token form="victimologies"/>
    <token form="victoire"/>
    <token form="victoires"/>
</lexique>

Jusqu'à maintenant, nous utilisions un seul document XML en entrée. Pour réaliser la transformation souhaitée, il est nécessaire d'accéder à la sortie du tagger et aux documents prenoms et lexique.
Le processeur XSLT n'opère toujours la transformation que d'un seul document (la sortie du tagger) mais XPath permet d'accéder à des éléments situés dans d'autres documents selon la syntaxe suivante :
document('cheminDocument.xml')/expression XPath 

Feuille XSL :
  1. <xsl:variable name="maj" select="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
  2. <xsl:variable name="min" select="abcdefghijklmnopqrstuvwxyz"/>

  3. <xsl:template match="taggertoken">
  4.     <xsl:choose>
  5.         <xsl:when test="
                (count(document('listeprenoms.xml')//prenom[translate(text(), $maj, $min)
                = translate(current()/@wordform, $maj, $min)]) &gt; 0)
                and (count(document('lexique.xml')//token[translate(@form, $maj, $min)
                = translate(current()/@wordform, $maj, $min)]) = 0)">
  6.             <xsl:element name="taggertoken">
  7.                 <xsl:attribute name="wordform"><xsl:value-of select="@wordform"/></xsl:attribute>
  8.                  <xsl:attribute name="lemma"><xsl:value-of select="@wordform"/></xsl:attribute>
  9.                  <xsl:attribute name="pos">NOM:PROPRE</xsl:attribute>
  10.              </xsl:element>
  11.          </xsl:when>
  12.         <xsl:otherwise><xsl:copy-of select="."/></xsl:otherwise>
  13.     </xsl:choose>
  14. </xsl:template>

  15. <xsl:template match="*">
  16.     <xsl:copy>
  17.         <xsl:apply-templates/>
  18.     </xsl:copy>
  19. </xsl:template>
Commentaires :
  • l'utilisation des variables min, maj et de la fonction translate pour obtenir les chaînes de caractères en minuscule résulte du fait qu'XPath ne fournit pas, dans sa recommandation, de fonction pour comparer les chaînes qui ne soit pas sensible à la casse (c'est prévu dans la version 2.0, actuellement à l'état de draft) ;
  • nous recopions en sortie tous les éléments XML qui ne sont pas des taggertoken (lignes 15 à 19) en spécifiant au processeur de continuer la transformation pour leurs enfants (ligne 17) ;
  • concernant les éléments taggertoken :

    • pour les éléments dont l'attribut wordform a une valeur textuelle comparable à la valeur textuelle d'un élément prenom du document prenoms.xml (ligne 5, première clause de la conjonction) ET dont l'attribut wordform n'est comparable à l'attribut form d'aucun élément token du document lexique.xml (ligne 5, deuxième clause de la conjonction), on construit un élément XML taggertoken en sortie dont on spécifie la valeur des attributs (lignes 6 à 10) ;
    • pour les autres, on les recopie sans changement (ligne 12).


Document XML résultat :
<doc>
    <taggersent>
        <taggertoken lemma="roman" pos="ADJ:femi:sg" wordform="Romane"/>
        <taggertoken lemma="se" pos="PRO" wordform="se"/>
        <taggertoken lemma="réveiller" pos="VER:sg" wordform="réveilla"/>
        <taggertoken lemma="par" pos="PRP" wordform="par"/>
        <taggertoken lemma="un" pos="DET:masc:sg" wordform="un"/>
        <taggertoken lemma="matin" pos="NOM:masc:sg" wordform="matin"/>
        <taggertoken lemma="clair" pos="ADJ:masc:sg" wordform="clair"/>
        <taggertoken lemma="." pos="PUN" wordform="."/>
    </taggersent>
    <taggersent>
        <taggertoken lemma="un" pos="DET:masc:sg" wordform="Un"/>
        <taggertoken lemma="boa" pos="NOM:masc:sg" wordform="boa"/>
        <taggertoken lemma="," pos="PUN" wordform=","/>
        <taggertoken lemma="ramper" pos="VER:ppre" wordform="rampant"/>
        <taggertoken lemma="sur" pos="PRP" wordform="sur"/>
        <taggertoken lemma="le" pos="DET:masc:sg" wordform="le"/>
        <taggertoken lemma="sol" pos="NOM:masc:sg" wordform="sol"/>
        <taggertoken lemma="," pos="PUN" wordform=","/>
        <taggertoken lemma="la" pos="PRO" wordform="la"/>
        <taggertoken lemma="scruter" pos="VER:sg" wordform="scrutait"/>
        <taggertoken lemma="placidement" pos="ADV" wordform="placidement"/>
        <taggertoken lemma="." pos="PUN" wordform="."/>
    </taggersent>
    <taggersent>
        <taggertoken lemma="elle" pos="PRO" wordform="Elle"/>
        <taggertoken lemma="lui" pos="PRO" wordform="lui"/>
        <taggertoken lemma="lire" pos="VER:sg" wordform="lut"/>
        <taggertoken lemma="un" pos="DET:masc:sg" wordform="un"/>
        <taggertoken lemma="passage" pos="NOM:masc:sg" wordform="passage"/>
        <taggertoken lemma="du" pos="PRP:DET:masc:sg" wordform="du"/>
        <taggertoken lemma="tao" pos="NOM:masc:sg" wordform="Tao"/>
        <taggertoken lemma="," pos="PUN" wordform=","/>
        <taggertoken lemma="puis" pos="ADV" wordform="puis"/>
        <taggertoken lemma="lui" pos="PRO" wordform="lui"/>
        <taggertoken lemma="raconter" pos="VER:sg" wordform="raconta"/>
        <taggertoken lemma="le" pos="DET:masc:sg" wordform="l'"/>
        <taggertoken lemma="histoire" pos="NOM:femi:sg" wordform="histoire"/>
        <taggertoken lemma="de" pos="PRP" wordform="d'"/>
        <taggertoken wordform="Esteban" lemma="Esteban" pos="NOM:PROPRE"/>
        <taggertoken lemma="," pos="PUN" wordform=","/>
        <taggertoken wordform="Zia" lemma="Zia" pos="NOM:PROPRE"/>
        <taggertoken lemma="," pos="PUN" wordform=","/>
        <taggertoken lemma="tao" pos="NOM:masc:sg" wordform="Tao"/>
        <taggertoken lemma="et" pos="CON" wordform="et"/>
        <taggertoken lemma="du" pos="PRP:DET:femi:pl" wordform="des"/>
        <taggertoken lemma="merveilleux" pos="ADJ:femi:pl" wordform="merveilleuses"/>
        <taggertoken lemma="cité" pos="NOM:femi:pl" wordform="cités"/>
        <taggertoken lemma="de" pos="PRP" wordform="d'"/>
        <taggertoken lemma="or" pos="NOM:masc:sg" wordform="or"/>
        <taggertoken lemma="." pos="PUN" wordform="."/>
    </taggersent>
</doc>
Certains prénoms (Romane, Tao) n'ont pas été corrigés car ils sont aussi présents dans le lexique, mais Esteban et Zia apparaîssent comme des noms propres.

Précédent... ] Sommaire... ] Suivant... ]