|
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 : |
- <xsl:variable name="maj"
select="ABCDEFGHIJKLMNOPQRSTUVWXYZ"/>
- <xsl:variable name="min"
select="abcdefghijklmnopqrstuvwxyz"/>
- <xsl:template match="taggertoken">
- <xsl:choose>
- <xsl:when test="
(count(document('listeprenoms.xml')//prenom[translate(text(), $maj, $min)
=
translate(current()/@wordform, $maj, $min)]) > 0)
and
(count(document('lexique.xml')//token[translate(@form, $maj,
$min)
=
translate(current()/@wordform, $maj, $min)]) = 0)">
- <xsl:element
name="taggertoken">
- <xsl:attribute name="wordform"><xsl:value-of select="@wordform"/></xsl:attribute>
-
<xsl:attribute name="lemma"><xsl:value-of select="@wordform"/></xsl:attribute>
-
<xsl:attribute name="pos">NOM:PROPRE</xsl:attribute>
-
</xsl:element>
- </xsl:when>
- <xsl:otherwise><xsl:copy-of
select="."/></xsl:otherwise>
- </xsl:choose>
- </xsl:template>
- <xsl:template match="*">
- <xsl:copy>
- <xsl:apply-templates/>
- </xsl:copy>
- </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. |
|
|