#/usr/bin/perl
<<DOC;
Nom : Olga Semenova
JANVIER 2005
Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter, intègre le traitement par
le programme Tree-tagger et construit en sortie un fichier structuré contenant sur chaque ligne le nom du fichier et
le résultat d'étiquetage :
<file><name>du fichier</name><element><data type="type">""</data><data type="lemma">""</data>
<data type="string">""</data></element></file>
DOC
#-----------------------------------------------------------
#le nom du répertoire passe en argument au programme
my $rep="$ARGV[0]";
#on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
#on initialise une variable contenant le flux de sortie
my $DUMPFULL1="";
#----------------------------------------
# on ouvre le fichier de sortie
my $output1="RESULTAT-TreeTagger.xml";
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
#----------------------------------------
#on lance le parcours récursif de l’arbre des fils
&parcoursarborescencefichiers($rep); #recurse!
#----------------------------------------
# on formate la sortie : fichier XML avec entete
# on intègre le contenu de la variable contenant le filtrage
print FILEOUT "<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Votre nom</NOM>\n";
print FILEOUT "<ETIQUETAGE>\n";
print FILEOUT "$DUMPFULL1\n";
print FILEOUT "</ETIQUETAGE>\n";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
exit;
#----------------------------------------------
##Procedure de parcours
sub parcoursarborescencefichiers {
my $path = shift(@_);
#On ouvre le répertoire
opendir(DIR, $path) or die "can't open $path: $!\n";
#On « récupère » le contenu du répertoire
my @files = readdir(DIR);
closedir(DIR);
#Pour chacun des « éléments » contenu dans le répertoire,
#on va vérifier son statut (répertoire -d ou fichier -f)
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
#On commence par écrire le chemin complet de l’ « élément »
$file = $path."/".$file;
#Si l’ « élément » est un répertoire (-d = directory) : on relance le parcours
if (-d $file) {
&parcoursarborescencefichiers($file); #recurse!
}
#Si l’ « élément » est un fichier (-f = file) : on lance le traitement de filtrage
#dont le résultat est attribué à la variable $DUMPFULL1;
#on verifie si "élément" est un fichier
if (-f $file) {
#si oui, on l'ouvre
#et on l'associe à un pointeur FIC et à une variable $file;
open(FIC, $file);
#on commence à formater la sortie XML:
#pour que la variable $DUMPFULL1 imprime chaque fois le résultat du traitement,
on ajoute ".", l'opérateur de concaténation;
$DUMPFULL1 .= "<file>\n<name>$file</name>\n";
#Parcours du fichier associé au pointeur FIC;
#Chaque ligne est stockée dans la variable $ligne;
while ($ligne=<FIC>)
{ #On vérifie si la ligne contient le motif ci-dessous;
#l'opérateur conditionnel =~ signifie "ressemble à";
#g = general, c'est à dire on cherche tout le texte;
#.* = on cherche n'importe quel caractère qui apparait
if ($ligne=~/<description>(.*)<\/description>/g) {
#vu que $1 est une variable par défaut (elle désigne le contenu entre
parenthèses)
#on préfère la remplacer par une variable locale;
my $var=$1;
#si la ligne contient le motif indiquée ci-dessus, on procède au
remplacement des caractères "mal affichés";
$var=~ s/&#39;/'/g;
$var=~ s/&#34;/"/g;
$var=~ s/ê/ê/g;
$var=~ s/é/é/g;
$var=~ s/ç/ç/g;
$var=~ s/è/è/g;
$var=~ s/Ã/à/g;
$var=~ s/à´/ô/g;
$var=~ s/é/é/g;
if (!open (FILEOUTTEMP,">temp.txt")) { die "Pb a l'ouverture du fichier temp.txt"};
#on formate le texte mot par ligne
$var=~ s/([^A-Za-zéèàëêâùïçôîÉÈÀÊÔÂÎÏËÙÇ'])/\n$1\n/g;
$var=~ s/\'/\'\n/g;
print FILEOUTTEMP $var;
close(FILEOUTTEMP);
#-----------------------------------------------------------
##Traitement par Tree-tagger:
#fichier d'entree ($input2): le fichier contenant le résultat des remplacements éffectués ci-dessus;
#fichier de sortie ($output2): le fichier contenant le résultat
du traitement par Tree-tagger;
$input2 = "temp.txt";
$output2 = "sortie_tt.txt";
#on lance le Tree-tagger en indiquant les options, fichier paramètre, fichier d'entrée et
fichier de sortie
system("tree-tagger.exe -token -lemma -no-unknown french.par $input2 $output2");
#-----------------------------------------------------------
##Formatage de sortie XML
#on ouvre le fichier temporaire étiqueté et lemmatisé par Tree tagger
open (FILEINTEMP, $output2);
while ($ligne1= <FILEINTEMP>)
{
#l'opérateur !~ (ne ressemble pas à)
if ($ligne1!~/\ô\¯\:\.\ô\¯\:\.\./) {
# Remplacement des guillemets par <![CDATA["]]> (évite erreur d'interprétation XML)
$ligne1=~s/\"/<![CDATA[\"]]>/g;
# . = un caractère quelconque sauf fin de ligne;
#\t = tabulation
#[^\t] = tout sauf tabulation
# * = 0 ou n fois
$ligne1=~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>/;
$DUMPFULL1 .= $ligne1;
}
}
}
}
#on ferme la balise <file> qui boucle le traitement de chaque fichier;
$DUMPFULL1 .= "</file>\n";
close(FILEINTEMP, $output2);
print $i++,"\n";
}
}
}
#----------------------------------------------