#===================================================================
#
Etiquetage avec Treetagger
#===================================================================
<<DOC;
MAAFA ZAHIR DESS IM INALCO
FEVRIER
2006
Usage:
perl <etiquette-avec-tree-tagger.pl>
<nom-du-fichier-xml>
Le programme
prend en entrée le nom du fichier xml contenant les textes à traiter
le
programme construit en sortie un fichier xml contenant le résultat de
l'étiquetage.
DOC
#=============== LE PROGRAMME
PRINCIPAL ==================
#!/usr/bin/perl
use warnings;
use
diagnostics;
use strict;
#==================== déclaration des
variables ====================
my $i=0;
my $ch; # contient le texte a étiqueter à chaque
iteration
my $nom; # nom du
fichier xml source du texte
my $ligne;
my $texte=$ARGV[0]; # le fichier xml en entrée
my %tag
=(
'NOM','N',
'PUN','Y',
'DET','D',
'ADJ','A',
'SEN','Y',
'VER','V',
'NAM','N',
'PRP','S',
'ADV','R',
'KON','C',
'NUM','M'
);
#====================================================================
open(Sortie,">Sortie-etiquetage.xml"); # le fichier en
sortie
entete(); # l'entête du
fichier xml résultat
$ENV{'PATH'} =
"./bin;";
system("set $ENV{'PATH'}");
open (FICH ,"<$texte");
# le fichier en
entrée
open(FS,"> tagger.txt");
open(OFILE,">fichfen.txt");
while ($ligne=<FICH>)
{
if (
$ligne=~/<NOM>([^<]*)<\/NOM><CONTENU>([^<]*)<\/CONTENU>/)
{
$nom=$1; # récupérer le nom du fichier
source
$ch=$2; # récupérer le contenu
# remplacer les caractéres spéciaux
while
($ch=~m/&#([0-9]+);/)
{$ch=~s/&#([0-9]+);/chr($1)/ge;}
$ch=~s/([^a-zA-Z0-9çàèéùîæêôÈÉÇÎâÂÙÛûúÚ])/\n$1\n/g; # un mot par
ligne
open
(FT,">".$i.".tmp.txt"); # mettre le
résultat dans un fichier temporaire
print FT
$ch;
close(FT);
# lancer
treetagger
system("./bin/tree-tagger.exe
-token -lemma -no-unknown ./lib/french.par $i.tmp.txt
$i.tagger.txt");
# le fichier résultat en
xml
system("./treetagger2xml_mod.pl
$i.tagger.txt");
# ajouter le résultat de
l'etiquetage au fichier xml final
recuperer();
traiter();
$i++;
}
}
fin(); # fin du fichier
xml
close(OFILE);
close(FICH);
close(Sortie);
close(FS);
# appel des programmes de la boite à outil
3
system("perl bo3/source/trouve_Treetagger.pl tagger.txt patron-2.txt
>liste_termes.txt");
# appel des
programmes de la boite à outils 4
system ("perl bo4/source/patron2graphml.pl
liste_termes.txt");
nettoyer();#
supprimer les fichiers temporaires
#=======================================================
# générer le
fichier texte étiqueté pour la BO3 et BO4
# et le
fichier des fenêtres pour la BO5
#=====================================================
sub
recuperer
{
my
@r;
open(FE,"<".$i.".tagger.txt");
while(<FE>){
print FS;
if (m/[" '<>]/) {
next;}
@r=split /\t/;
chop($r[2]);
$r[2]=~s/[\r\n]//;
$r[1]=substr($r[1],0,3);
$r[1]=~s/\s//g;
if
(exists($tag{$r[1]}))
{
print
OFILE
"$r[2]_$tag{$r[1]}\n";
}
else
{
print
OFILE
"$r[2]_$r[1]\n";
}
}
print
OFILE
"<FinFenetre/>\n";
close(FE);
}
#=====================================================================
#
ajouter le résultat de l'etiquetage au fichier xml final
#====================================================================
sub
traiter
{
my
$f="";
my
$lig;
open(FH,"<".$i.".tagger.txt.xml");
# lecture du fichier
xml temporaire
while
(defined($lig=<FH>))
{
$f=$f.$lig;
}
# ajouter le résultat au
fichier xml final en spécifiant le nom du fichier source
$f=~s/<file>/<file>\n<name>$nom<\/name>\n/;
$f=~s/<\/element>[^<]*<\/file>/<\/element>\n<\/file>/;
print Sortie $f;
close(FH);
}
#=======================================
# Entête du
fichier XML final
#=======================================
sub
entete
{
print Sortie "<?xml version=\"1.0\" encoding=\"iso-8859-1\"
standalone=\"no\"?>\n";
print Sortie
"<PARCOURS>\n";
print Sortie "<NOM>MAAFA
ZAHIR</NOM>\n";
print Sortie
"<ETIQUETAGE>\n";
}
#========================================
# fin du
fichier xml final
#=======================================
sub
fin {
print Sortie
"</ETIQUETAGE>\n";
print Sortie
"</PARCOURS>\n";
}
#===========================================
# supprimer
tous les fichiers temporaires
#===========================================
sub
nettoyer
{
system '/bin/rm.exe *.tmp.txt';
system
'/bin/rm.exe *.tagger.*';
}