INDEX

Programmes

Parcours arborescence fichier
Traitement avec TreeTagger
Traitement avec Cordial (1ere partie)
(2ere partie)

Etapes 1, 2, 3 et 4 intégrées par modules (archive zip)

Fichiers XML de résultat

Parcours
Traitement avec TreeTagger
Traitement avec Cordial

Feuilles XSL

Feuille de style TT
Feuille de style Cordial

Claire Guiraud

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
#-----------------------------------------------------------
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;
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
                    $desc=~ s/&#38;#39;/'/g;
On remplace certains caractères et entités 'incorrects' par le caractère correct
                    $desc=~ s/&#38;#34;/"/g;
                    $desc=~ s/&#234;/ê/g;
                    $desc=~ s/é/é/g;
                    $desc=~ s/ç/ç/g;
                    $desc=~ s/Ú/è/g;
                    $desc=~ s/Ã/à/g;
                    $desc=~ s/àŽ/ô/g;
                    $desc=~ s/&#233;/é/g;
On met un mot par ligne
                    $desc=~ s/([^A-Za-zéèàëêâùïçôîÉÈÀÊÔÂÎÏËÙÇ'])/\n$1\n/g;
                    $desc=~ s/\'/\'\n/g;
On crée la variable 'output2' qui contient le nom du fichier de sortie temporaire.
                    my $output2="temp.txt";
                    if (!open (FILEOUT2,">>$output2")) { die "Pb a l'ouverture du fichier $output1"};
On imprime le contenu (modifié) de la variable 'desc' dans le fichier temporaire
                    print FILEOUT2 "<article>"."\n".$desc."\n"."</article>";
                    close (FILEOUT2);
                }
            }
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'.
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);
             }



            # 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;
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é.
                         $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>/;
                          
                         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";
On supprime le fichier 'temp.txt' pour 'nettoyer' le répertoire de travail                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-) .


INDEX