Utilisation de plusieurs documents XML (suite)


Exemple : texte segmenté, avec pré-traitement pour étiqueter les signes de poncutation
<?xml version="1.0" encoding="iso-8859-1"?>
<doc>
    <taggersent>
        <taggertoken wordform="Casimir"/>
        <taggertoken wordform="et"/>
        <taggertoken wordform="les"/>
        <taggertoken wordform="voleurs"/>
        <taggertoken wordform="(" lemma="(" pos="PUN"/>
        <taggertoken wordform="c'"/>
        <taggertoken wordform="est"/>
        <taggertoken wordform="le"/>
        <taggertoken wordform="titre"/>
        <taggertoken wordform=")" lemma=")" pos="PUN"/>
    <taggersent>
    <taggersent>
        <taggertoken wordform="Casimir"/>
        <taggertoken wordform="avait"/>
        <taggertoken wordform="-"/>
        <taggertoken wordform="il"/>
        <taggertoken wordform="perdu"/>
        <taggertoken wordform="la"/>
        <taggertoken wordform="tête"/>
        <taggertoken wordform="?" lemma="?" pos="PUN"/>
    <taggersent>
    <taggersent>
        <taggertoken wordform="'" lemma="'" pos="PUN:CIT"/>
        <taggertoken wordform="Heureux"/>
        <taggertoken wordform="sont"/>
        <taggertoken wordform="les"/>
        <taggertoken wordform="fêlés"/>
        <taggertoken wordform="," lemma="," pos="PUN"/>
        <taggertoken wordform="car"/>
        <taggertoken wordform="ils"/>
        <taggertoken wordform="laisseront"/>
        <taggertoken wordform="passer"/>
        <taggertoken wordform="la"/>
        <taggertoken wordform="lumière"/>
        <taggertoken wordform="'" lemma="'" pos="PUN:CIT"/>
        <taggertoken wordform="déclara"/>
        <taggertoken wordform="-" lemma="-" pos="PUN"/>
        <taggertoken wordform="t" lemma="t" pos=""/>
        <taggertoken wordform="-il" lemma="il" pos="PRO"/>
        <taggertoken wordform="plus"/>
        <taggertoken wordform="tard"/>
        <taggertoken wordform="..." lemma="..." pos="PUN"/>
    <taggersent>
</doc>
Ressource : Morphalou (version 1.0), lexique morphologique développé par l'ATILF. La taille de ce document approche 80Mo. Nous reproduisons ici une entrée avec ses formes fléchies pour donner une idée de la structure du lexique :
<lexicalEntry lemma="heureux" grammaticalCategory="adjective">
    <inflectionGroup>
        <inflection orthography="heureux" grammaticalGender="masculine" grammaticalNumber="singular"/>
        <inflection orthography="heureux" grammaticalGender="masculine" grammaticalNumber="plural"/>
        <inflection orthography="heureuse" grammaticalGender="feminine" grammaticalNumber="singular"/>
        <inflection orthography="heureuses" grammaticalGender="feminine" grammaticalNumber="plural"/>
    </inflectionGroup>
</lexicalEntry>
Feuille XSL :
  1. <?xml version="1.0" encoding="iso-8859-1"?>
  2. <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  3.     <xsl:output encoding="iso-8859-1" indent="yes"/>
  4.     <xsl:variable name="maj" select="ABCDEFGHIJKLMNOPQRSTUVWXYZÀÉÈÊ"/>
  5.     <xsl:variable name="min" select="abcdefghijklmnopqrstuvwxyzàéèê"/>
  6.     <xsl:template match="*">
  7.          <xsl:copy>
  8.              <xsl:apply-templates/>
  9.         </xsl:copy>
  10.      </xsl:template>
  11.      <xsl:template match="taggertoken">
  12.         <xsl:element name="taggertoken">
  13.              <xsl:attribute name="wordform"><xsl:value-of select="@wordform"/></xsl:attribute>
  14.              <xsl:choose>
  15.                  <xsl:when test="count(document('morphalouSample.xml')//inflection[@orthography=translate(current()/@wordform, $maj, $min)]) &gt; 0">
  16.                      <xsl:attribute name="lemma">
  17.                          <xsl:for-each select="document('morphalouSample.xml')//inflection[translate(@orthography, $maj, $min)=translate(current()/@wordform, $maj, $min)]">
  18.                              <xsl:if test="position() &gt; 1">|</xsl:if>
  19.                                 <xsl:value-of select="../../@lemma"/>
  20.                              </xsl:for-each>
  21.                      </xsl:attribute>
  22.                      <xsl:attribute name="pos">
  23.                          <xsl:for-each select="document('morphalouSample.xml')//inflection[translate(@orthography, $maj, $min)=translate(current()/@wordform, $maj, $min)]">
  24.                              <xsl:if test="position() &gt; 1">|</xsl:if>
  25.                                  <xsl:value-of select="../../@grammaticalCategory"/>
  26.                                  <xsl:for-each select="attribute::*[name() != 'orthography']">
  27.                                       <xsl:text>:</xsl:text><xsl:value-of select="."/>
  28.                                  </xsl:for-each>
  29.                          </xsl:for-each>
  30.                       </xsl:attribute>
  31.                   </xsl:when>
  32.                   <xsl:otherwise>
  33.                       <xsl:attribute name="lemma"><xsl:value-of select="@wordform"/></xsl:attribute>
  34.                       <xsl:attribute name="pos">unknown</xsl:attribute>
  35.                   </xsl:otherwise>
  36.              </xsl:choose>
  37.          </xsl:element>
  38.      </xsl:template>
  39. </xsl:stylesheet>

Commentaires :
  • les variables min et maj (lignes 5 et 6) et l'utilisation de la fonction XPath translate permettent de comparer les chaînes de caractères indépendamment de la casse (la liste des caractères accentués ne contient que les caractères nécessaires à l'exemple) ;
  • nous reproduisons à l'identique les éléments autres que taggertoken (lignes 8 à 12) ;
  • pour les éléments taggertoken, nous générons en sortie un élément de même nom et dont l'attribut wordform est inchangé (lignes 15 et 16) ;
  • génération des attributs lemma et pos : lignes 17 à 41
    S'il y a dans Morphalou des éléments inflection dont l'orthographe est identique à la forme du taggertoken (test à la ligne 18) :
    • on génère un attribut lemma composé des attributs lemmas des éléments lexicalEntry, ancêtres des éléments inflection sélectionnés, séparés éventuellement par le caractère | (lignes 19 à 24) ; 
    • on génère un attribut pos composé de l'attribut orthography des éléments lexicalEntry, ancêtres des éléments inflection sélectionnés (lignes 26 à 35) ;
    • à cet attribut, on ajoute, séparés par le caractère : les attributs des éléments inflection, sauf l'attribut orthography (lignes 31 à 33).

Résultat :
<doc>
    <taggersent>
        <taggertoken wordform="Casimir" lemma="Casimir" pos="unknown"/>
        <taggertoken wordform="et" lemma="et" pos="functionWord"/>
        <taggertoken wordform="les" lemma="le" pos="functionWord"/>
        <taggertoken wordform="voleurs" lemma="voleur" pos="commonNoun:plural"/>
        <taggertoken wordform="(" lemma="(" pos="unknown"/>
        <taggertoken wordform="c'" lemma="c'" pos="functionWord"/>
        <taggertoken wordform="est" lemma="être" pos="verb:indicative:singular:present:thirdPerson"/>
        <taggertoken wordform="le" lemma="le" pos="functionWord"/>
        <taggertoken wordform="titre" lemma="titre" pos="commonNoun:singular"/>
        <taggertoken wordform=")" lemma=")" pos="unknown"/>
    </taggersent>
    <taggersent>
        <taggertoken wordform="Casimir" lemma="Casimir" pos="unknown"/>
        <taggertoken wordform="avait" lemma="avoir" pos="verb:indicative:plural:imperfect:thirdPerson"/>
        <taggertoken wordform="-" lemma="-" pos="unknown"/>
        <taggertoken wordform="il" lemma="il" pos="functionWord"/>
        <taggertoken wordform="perdu" lemma="perdre" pos="verb:participle:masculine:singular:past"/>
        <taggertoken wordform="la" lemma="la|la|le" pos="commonNoun:singular|commonNoun:plural|functionWord"/>
        <taggertoken wordform="tête" lemma="tête" pos="commonNoun:singular"/>
        <taggertoken wordform="?" lemma="?" pos="unknown"/>
    </taggersent>
    <taggersent>
        <taggertoken wordform="'" lemma="'" pos="unknown"/>
        <taggertoken wordform="Heureux" lemma="Heureux" pos="unknown"/>
        <taggertoken wordform="sont" lemma="être" pos="verb:indicative:plural:present:thirdPerson"/>
        <taggertoken wordform="les" lemma="le" pos="functionWord"/>
        <taggertoken wordform="fêlés" lemma="fêler|fêlé" pos="verb:participle:masculine:plural:past|adjective:masculine:plural"/>
        <taggertoken wordform="," lemma="," pos="unknown"/>
        <taggertoken wordform="car" lemma="car|car" pos="commonNoun:singular|functionWord"/>
        <taggertoken wordform="ils" lemma="il" pos="functionWord"/>
        <taggertoken wordform="laisseront" lemma="laisser" pos="verb:indicative:plural:future:thirdPerson"/>
        <taggertoken wordform="passer" lemma="passer" pos="verb:infinitive"/>
        <taggertoken wordform="la" lemma="la|la|le" pos="commonNoun:singular|commonNoun:plural|functionWord"/>
        <taggertoken wordform="lumière" lemma="lumière" pos="commonNoun:singular"/>
        <taggertoken wordform="'" lemma="'" pos="unknown"/>
        <taggertoken wordform="déclara" lemma="déclara" pos="unknown"/>
        <taggertoken wordform="-" lemma="-" pos="unknown"/>
        <taggertoken wordform="t" lemma="t" pos="unknown"/>
        <taggertoken wordform="-il" lemma="-il" pos="unknown"/>
        <taggertoken wordform="plus" lemma="plaire|plaire|plus" pos="verb:indicative:singular:simplePast:firstPerson|verb:indicative:singular:simplePast:secondPerson|functionWord"/>
        <taggertoken wordform="tard" lemma="tard" pos="adverb"/>
        <taggertoken wordform="..." lemma="..." pos="unknown"/>
    </taggersent>
</doc>

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