#!/usr/bin/perl
<<DOC;
prend en entree un fichier issu de treetagger (argument en position 0)
et un fichier de patrons morphosyntaxiques (argument en position 1);
le programme extrait des suites de tokens correspondant
aux patrons morpho-syntaxiques contenus dans le fichier de patrons;
exemples d utilisation avec les fichiers d exemples fournis :
perl trouve_terme.pl SORTIE-TREETAGGER.txt patrons-1.txt
perl trouve_terme.pl une-description-etiquetee-avec-treetagger.txt patrons-2.txt
DOC
#---------------------------------------------------
# debut du programme, ouverture en lecture du fichier passe en argument
#---------------------------------------------------
print "Bonjour\n";
open(FIC, $ARGV[0]);
# ouverture d un fichier de trace, destine a recevoir les
# informations de traitements
open(TRACE,">trace.txt");
#---------------------------------------------------
# debut du programme, choix du nom du fichier en sortie
#---------------------------------------------------
print "Choisis un nom de fichier pour contenir les termes extraits\n";
my $fic=<STDIN>;
#---------------------------------------------------
# initialisation des variables
#---------------------------------------------------
open(FIC1, ">$fic");
my $i=0;
my $j=0;
my $k=0;
my @token=();
#---------------------------------------------------
# lecture du fichier de sortie TREETAGGER
# creation de 3 tableaux contenant les mots, les lemmes et les categories
#---------------------------------------------------
while (<FIC>) {
my $ligne=$_;
my @liste=split(/\t/,$ligne);
print TRACE "Lecture dans sortie treetagger :", @liste,"\n";
push(@token, $liste[$i++]." ");
push(@patron, "$liste[$i++]" ." ");
push(@lemme, "$liste[$i++]" ." ");
$i=0;
}
close(FIC);
#---------------------------------------------------
# on cree une liste vide destinee a recevoir les patrons
# presents dans le fichier lu a l etape precedente
# cette liste sera initialisee apres chaque construction
# de patron
#---------------------------------------------------
@sous_patron=();
#---------------------------------------------------
# creation de la liste des patrons lus dans le fichier
# issu de treetagger
#---------------------------------------------------
while (defined($element_patron=shift(@patron))) {
if ($element_patron !~ PUN && $element_patron !~ SENT) {
push(@sous_patron, $element_patron);
print TRACE "SOUS-PATRON en construction : ",@sous_patron,"\n";
$j++;
next;
}
print TRACE "SOUS-PATRON construit : ",@sous_patron,"\n";
my @sous_token=@token[$k+1..$j-1];
print TRACE "SOUS-TOKEN construit : ",@sous_token,"\n";
# on va maintenant voir si le sous-patron construit est dans le
# liste des patrons cherches (dans le fichier des patrons scrutes)
&cherche_patron(@sous_patron);
@sous_patron=();
$k=$j;
$j++;
}
close (FIC1);
close(TRACE);
#=============================================
# procedure de recherche des patrons
#=============================================
sub cherche_patron {
print TRACE "RECHERCHE dans le fichier des patrons...\n";
my @liste=@_;
my $suite_de_patrons=join("",@liste);
$z=0;
$nb=0;
# ouverture du fichier des patrons cherches
open(FIC, "$ARGV[1]");
while(<FIC>) {
$ligne=$_;
print TRACE "PATRON LU : $ligne";
chomp $ligne;
$nb=0;
while ($ligne=~m/ /g) {$nb++};
$nb++;
while ($suite_de_patrons=~m/$ligne/g) {
my $avant=substr ($suite_de_patrons, 0, pos($suite_de_patrons)-length($ligne));
while ($avant=~m/ /g) {$z++};
print TRACE "PATRON OK : @token[$k+$z+1..$k+$z+$nb]\n";
print FIC1 "@token[$k+$z+1..$k+$z+$nb]\n";
$z=0;
}
}
close(FIC)
}