BOITE A OUTILS 2 TREETAGGER
Ojectif :Opérer des traitements sur le contenu de certaines balises des fichiers xml contenus dans une arborescence de répertoires. Le résultat des traitements doit être reflété au moyen d'une structure xml (du type : parcours ->fichier -> article -> element -> data, où un élément 'article' encadre le contenu d'une balise 'description', un élément 'element' correspond à une forme dans le document d'origine et un élément 'data' contient une forme dont le type est défini par l'attribut 'type' de l'élément 'data').
Données de base :
En plus du programme vu dans la Boite à Outils numéro 1, un second programme nous a été fourni, qui permet de formatter le traitement effectué par le programme TreeTagger en XML.
Traitement : Il s'agit d'obtenir une analyse morpho-syntaxique de chaque 'article' au moyen du programme TreeTagger.
Structure du programme à écrire :Le programme doit :
- Prendre comme argument le nom du
répertoire à parcourir. -fourni-
- Parcourir le répertoire (en gardant trace du parcours) et
ouvrir chaque fichier contenu dans l'arborescence -fourni-
- Pour un fichier donné
- Extraire le contenu de chaque balise 'description' contenu dans un
fichier donné
- 'Nettoyer' le texte obtenu (entités html...)
- Ecrire chaque contenu dans un fichier, encadré de balises
'article' (pour séparer les contenus de chaque balise
trouvée) et formatté avec un mot par ligne
- Lancer le programme TreeTagger en lui donnant le nom du fichier
créé à l'étape
précédente et
le nom du fichier de résultat (donc
créé par TT)
- Ouvrir le fichier de sortie de TreeTagger
- Restructurer le contenu du fichier (format texte tabulé)
en une structure XML -fourni-
- Ajouter cette structure à un fichier XML, qui est
construit au fur et à mesure du parcours de l'arborescence.
- Il faut veiller à écrire, en début
et en fin de
programme, les lignes nécessaire à une bonne
structure du
fichier XML
Le programme :
#/usr/bin/perl -w
on met le contenu de la variable $1 (qui contient ce qui a été trouvé dans l'expression régulière) dans la variable $desc
#-----------------------------------------------------------
my $rep="$ARGV[0]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise la variable fichier pour pouvoir ecrire le contenu du premier repertoire au debut du sub
my $fichier=$path;
#----------------------------------------
my $output1="SORTIEetiquetageTT.xml";
if (!open (FILEOUT,">>$output1")) { die "Pb a l'ouverture du fichier $output1"};
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Claire Guiraud</NOM>\n";
print FILEOUT "<ETIQUETAGE>\n";
#----------------------------------------
&parcoursarborescencefichiers($rep); #recurse!
#----------------------------------------
print FILEOUT "</ETIQUETAGE>\n";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
system ("rm","treetag.txt");
exit;
sub parcoursarborescencefichiers {
my $path = shift(@_);
opendir(DIR, $path) or die "can't open $path: $!\n";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
$file = $path."/".$file;
if (-d $file) {
&parcoursarborescencefichiers($file); #recurse!
}
if (-f $file) {
if (!open
(FILEOUT,">>$output1")) { die "Pb a l'ouverture du fichier
$output1"};
print FILEOUT
"<fichier>"."\n"."<name>".$file."</name>"."\n";
open(FILEINPUT,"$file");
while ($ligne = <FILEINPUT>){
if
($ligne=~/<description>(.*)<\/description>/) {
my $desc=$1;
$desc=~ s/&#39;/'/g;
On remplace certains caractères et entités 'incorrects' par le caractère correct
$desc=~ s/&#34;/"/g;
On met un mot par ligne
$desc=~
s/ê/ê/g;
$desc=~
s/é/é/g;
$desc=~
s/ç/ç/g;
$desc=~
s/Ú/è/g;
$desc=~
s/Ã/à/g;
$desc=~
s/àŽ/ô/g;
$desc=~
s/é/é/g;
$desc=~
s/([^A-Za-zéèàëêâùïçôîÉÈÀÊÔÂÎÏËÙÇ'])/\n$1\n/g;
On crée la variable 'output2' qui contient le nom du fichier de sortie temporaire.
$desc=~ s/\'/\'\n/g;
On imprime le contenu (modifié) de la variable 'desc' dans le fichier temporaire
my
$output2="temp.txt";
if
(!open (FILEOUT2,">>$output2")) { die "Pb a l'ouverture du
fichier $output1"};
print FILEOUT2
"<article>"."\n".$desc."\n"."</article>";
On utilise la commande 'system' pour appeler le programme TreeTagger et lui passer tous les arguments nécessaire, dont le nom du fichier 'temp.txt'.
close (FILEOUT2);
}
}
L'utilisation de l'option '-sgml' permet de passer des balises à TT, et de les récupérer intactes dans le fichier de sortie. Cela nous permet de garder une trace de la structure de nos balises 'description'.
system
("./TT/bin/tree-tagger", "-token", "-lemma", "-no-unknown","-sgml",
"./TT/lib/french.par","temp.txt", "treetag.txt");
&ouvre;
&traitement;
&ferme;
############################################################
# Récupération des arguments et ouverture des tampons
sub ouvre {
$FichierEntree="treetag.txt";
open(Entree,$FichierEntree);
On insère chaque ligne entre deux balises 'element' et chaque élément de la ligne séparé par des tabulations entre deux balises 'data', avec un attribut différent pour chaque élément trouvé.
}
# Traitement
sub traitement {
if
(!open (FILEOUT,">>$output1")) { die "Pb a l'ouverture du fichier
$output1"};
while ($Ligne = <Entree>) {
if
($Ligne!~/\ô\¯\:\ \ô\¯\:\ \ /) {
# Remplacement des
guillemets par <![CDATA["]]>
#(évite erreur d'interprétation XML)
$Ligne=~s/\"/<![CDATA[\"]]>/g;
$Ligne=~s/([^\t]*)\t([^\t]*)\t(.*)/<element>\n <data
type=\"type\">$2<\/data>\n <data
type=\"lemma\">$3<\/data>\n <data
type=\"string\">$1<\/data>\n<\/element>/;
On supprime le fichier 'temp.txt' pour 'nettoyer' le répertoire de travail
print
FILEOUT "$Ligne";
}
}
}
# Fermeture des tampons
sub ferme {
close(Entree);
close(FILEINPUT);
}
print $i++,"\n";
if (!open (FILEOUT,">>$output1")) { die "Pb a
l'ouverture du fichier $output1"};
print FILEOUT "</fichier>"."\n";
system ("rm","temp.txt");
}
}
return();
}
#----------------------------------------------
Fichier obtenu : SORTIEetiquetageTT.xml (Attention gros fichier - voir un extrait -)
Note : Il a fallu porter une attention particulière à l'encodage des fichiers : les fichiers source sont encodés en iso-latin1 (d'après leur entête XML). Etant donné que notre programme modifie une partie du texte extrait avant de le passer à TreeTagger (remplacement des entités, etc), et qu'il écrit par ailleurs certaines lignes directement dans le fichier XML de résultat, il faut s'assurer que le programme est lui-même bien codé en iso-latin. Dans le cas contraire (pour un programme codé en unicode, par exemple), on observe que TreeTagger analyse mal certains charactères diacrytiques (le é, entre autres), et les sépare du mot dont il font partie. On obtient également un fichier 'mixte' en sortie, avec les charactères écrits directement par le programme (entête, charcatères de rempacement des entités) codés en unicode, et les caractères provenant directement de l'extraction des fichiers source codés en iso-latin.
AFFICHAGE DES RESULTATS
On peut utiliser un feuille XSL pour afficher les informations contenues dans les fichiers XML créés par les programmes.
Grâce à cette feuille de style XSL (adaptée dela feuille XSL qui nous a
été fournie), on peut générer cette page (Attention gros fichier -voir un extrait-) .