INaLCO - M2 Traductique 2013-2014
Projet commun aux cours
-
Langages de scripts/Perl (Océane Hồ Đình),
-
XML (Jean-François Perrot).
Propositions pour une réalisation
- Le cahier des charges
- Réalisation directe
- L'affichage de l'histogramme
- La transformation XSLT enrichissant le corpus global
- Le script Perl
- Modularité des grammaires
- Exprimer la dépendance ?
- Construire une grammaire à partir de plusieurs composants
- Construction avec redéfinition
- Le prix à payer...
-
Résultat : Les trois histogrammes obtenus
-
-
est réalisé en tranformant une page Web
visu.html
qui provient d'une version
ancienne du logiciel XML/SWF Charts.
Son fonctionnement suppose la présence dans le même répertoire d'un
sous-répertoire charts
à télécharger sur le site en
question.
Il suffit de remplacer, dans le texte HTML de cette page, la marque SRCXML
par le chemin vers le fichier XML de l'histogramme, produit par le
script Perl.
On convient que ce dernier sera logé dans le répertoire charts
,
pour ne pas encombrer l'espace de travail.
Si la page affichant l'histogramme s'appelle maPage.html
, le fichier
XML sera charts/maPage.histo.xml
Ainsi Histo1.html
,
Histo2.html
,
Histo3.html
.
-
est écrite de manière à traiter également les différents corpus du
projet.
Or, les différents corpus n'utilisent pas tous le même jeu d'attributs
pour la balise <text>
.
Comme la règle du jeu est de reproduire l'intégralité du fichier XML,
on a utilisé une règle assurant la reproduction de tous les attributs :
<xsl:template match = "@*">
<xsl:copy-of select="." />
</xsl:template>
Voyez enrichir.xsl
.
-
est écrit conformément à la pratique du cours, sans définir de
fonctions.
On y a ajouté une évaluation grossière du temps de calcul.
En voici deux versions,
- l'une strictement conforme au cahier des charges, avec
trois grammaires RNG complètes et indépendantes (voir ci-après):
scriptSimpl.pl
;
- l'autre exploitant une conception modulaire des trois
grammaires, qui met en évidence leurs correspondances ;
malheureusement avec de telles grammaires la commande xmllint
--relaxng
oppose un refus (du moins, sa version disponible sous MacOS) ;
il faut donc recourir au logiciel Jing
au lieu de xmllint
,
et s'écarter un peu du cahier des charges...
Voyez scriptMod.pl
.
-
-
Voici nos trois grammaires, valables pour les trois corpus du projet, relatives
- aux fichiers individuels du corpus visé :
gramInd
(.rnc
,
.rng
)
- au fichier-corpus global avec ses deux parties
"informelle"
et "individuelle" :
gramGlob
(.rnc
, .rng
)
- au fichier-corpus global enrichi :
gramRich
(.rnc
,
.rng
).
Elles ne sont évidemment pas indépendantes.
- La deuxième reproduit intégralement l'en-tête TEI et la
balise
<text>
de la première,
- et la troisième est identique à la deuxième sauf l'ajout
d'un fils
<nbMots>
à la balise <s>
.
Cette dépendance se fait clairement sentir lorsqu'on met au point ce
système de grammaires commun aux trois corpus du projet !
À chaque modification des règles spécifiant <text>
,
dans gramInd
, il faut la répercuter dans les deux
autres...
D'autre part, une grammaire est un texte qui doit être à la fois
exécutable par la machine (pour contrôler la validité d'un document
XML)
et compréhensible par un ingénieur chargé de la maintenance du système
(par exemple).
De ce dernier point de vue, les relations de dépendance peuvent être
manifestées par des commentaires, mais ces derniers ne sont pas
normalisés, et leur interprétation peut dépendre d'innombrables
facteurs culturels.
Il est donc préférable, dans la mesure du possible, de manifester les
relations de dépendance dans le code de la grammaire.
Pour ce faire, la technique RelaxNG offre toute une panoplie, dont une
des pièces fait parfaitement notre affaire.
-
L'idée est qu'une grammaire a nécessairement un point d'entrée
start
,
mais que les définitions des différents termes qui la composent peuvent
parfaitement être prises dans d'autres fichiers,
grâce à une primitive include
.
Par exemple, notre grammaire des fichiers individuels peut s'écrire gramInd.rnc
:
default namespace = "http://www.tei-c.org/ns/1.0"
include "gramHeader.rnc" # pour "entête"
include "gramText.rnc" # pour "texte"
start = racineTEI
racineTEI = element TEI {entête, texte}
sachant que les deux fichiers gramHeader.rnc
et gramText.rnc
ne sont pas des grammaires, car ils n'ont pas de point d'entrée,
mais qu'ils contiennent les définitions des termes entête
et texte
respectivement.
La répartition en deux fichiers au lieu d'un seul n'est pas
indispensable, elle veut signifier qu'il n'y a point de lien organique
entre les deux termes.
De la même manière, à partir des même fichiers, on écrit la grammaire
du fichier global gramGlob.rnc
:
default namespace = "http://www.tei-c.org/ns/1.0"
include "gramHeader.rnc"
include "gramText.rnc"
start = racineTEI
racineTEI = element TEI {entête, sousCorpus}
sousCorpus = element lesSousCorpus { inform, instit }
inform = element Informel { texte+ }
instit = element Institutionnel { texte+ }
La relation structurelle entre les deux grammaires gramInd
et gramGlob
est ainsi clairement manifestée.
Voici les formes XML de nos deux composants gramHeader.rng
et gramText.rng
,
et celles de nos deux grammaires gramInd.rng
et gramGlob.rng
.
-
Quant à
gramRich
, elle est censée exprimer que le corpus enrichi est identique au corpus global,
à ceci près que les balises <s>
ont un fils supplémentaire <nbMots>
contenant un nombre entier.
Pour cela, la primitive include
peut être agrémentée d'une clause indiquant que certaines définitions figurant dans le fichier inclus
sont modifiées.
Dans notre cas, la grammaire s'écrit gramRich.rnc
:
default namespace = "http://www.tei-c.org/ns/1.0"
include "gramGlob.rnc" {
phrase = element s { attribute n { xsd:int }, nbm, (mot|sdl)+ }
}
nbm = element nbMots { xsd:int }
Noter que l'inclusion importe le point d'entrée start
, et que la définition de nbm
est le seul "contenu propre" du fichier gramRich.rnc
.
La clause de modification, entre accolades, est une redéfinition du terme phrase
:
phrase = element s { attribute n { xsd:int }, nbm, (mot|sdl)+ }
qui met en jeu aussi bien des termes importés de gramGlob
(phrase
, mot
et sdl
) que le terme nbm
défini localement.
Il paraît difficile de trouver une formulation plus exacte ! Dommage que xmllint
y trouve à redire...
Voici sa forme XML : gramRich.rng
.
-
Hélas, cette conception perfectionnée a un coût en temps de calcul.
Grosso modo, scriptMod
prend en plus un tiers du temps de scriptSimpl
, ce n'est pas négligeable.
D'ailleurs, même avec de "petits" corpus, les temps de calcul sont substantiels :
pour les trois corpus du projet, il faut sur ma machine environ 24, 60 et 210 secondes avec scriptSimpl
, et 30, 85 et 280 s. avec scriptMod
.
Il est temps de se poser des questions sur l'efficacité de notre méthode... mais ceci est une autre affaire !