Solution1
#!/usr/bin/perl
#-------------------------------------------------
# PROGRAMME PRINCIPAL
#-------------------------------------------------
my @LISTETOKEN=();
my @LISTELEMME=();
my @LISTEETIQUETTE=();
#--------------------------------------------------
# lecture du fichier PATRON
open(PATRON,"$ARGV[1]");
my @LISTEPATRON=; # lecture globale du fichier dans une liste
close(PATRON);
#--------------------------------------------------
# le fichier cordial est le premier argument du programme
open(CORDIAL,"$ARGV[0]"); # visiblement pas de pb d'encodage...
while (my $ligne=) {
$ligne=~s/\r//;
chomp($ligne);
if ($ligne=~/^([^\t]+)\t([^\t]+)\t([^\t]+)$/) {
my ($token,$lemme,$etiquette)=($1,$2,$3);
if ($etiquette!~/PCTF/) {
push(@LISTETOKEN,$token);
push(@LISTELEMME,$lemme);
push(@LISTEETIQUETTE,$etiquette);
}
else {
&compare(\@LISTETOKEN,\@LISTEETIQUETTE);
# creation d'un reference vers une liste
@LISTETOKEN=();
@LISTEETIQUETTE=();
@LISTELEMME=();
}
}
}
# -----------------------------------------------------
# SOUS - PROGRAMMES
#------------------------------------------------------
sub compare {
# TRAITEMENT...
my ($first,$second)=@_;
my @LISTETOKEN=@$first;
my @LISTEETIQUETTE=@$second;
foreach my $patron (@LISTEPATRON) {
$patron=~s/\r//;
chomp $patron;
#print "$patron\n";
my $texte_des_pos=join(" ",@LISTEETIQUETTE);
while ($texte_des_pos=~/$patron/g) {
my $contextebefore=$`;
my $compteurblanc=0;
while ($contextebefore=~/ /g) {
$compteurblanc++;
}
my @MONPATRONENCOURS=split(/ /, $patron);
my $longueurpatron=$#MONPATRONENCOURS;
my $bornesup = $compteurblanc + $longueurpatron;
print "@LISTETOKEN[$compteurblanc..$bornesup] \n";
}
}
}
Solution2
open(FILE,"$ARGV[0]");
#--------------------------------------------
# le patron cherché ici est du type NOM ADJ";
# le modifier pour extraire NOM PREP NOM
#--------------------------------------------
my @lignes=;
close(FILE);
my %dicopatron=();
while (my $ligne=shift(@lignes)) {
chomp $ligne;
my $sequence="";
my $longueur=0;
if ( $ligne =~ /^([^\t]+)\t[^\t]+\tNC.*/) {
my $forme=$1;
$sequence.=$forme;
$longueur=1;
my $nextligne=$lignes[0];
if ( $nextligne =~ /^([^\t]+)\t[^\t]+\tADJ.*/) {
my $forme=$1;
$sequence.=" ".$forme;
$longueur=2;
}
}
if ($longueur == 2) {
# print $sequence;
$dicopatron{$sequence}++; # ou $dicopatron{$sequence}=$dicopatron{$sequence}+1;
}
}
foreach my $patron (sort {$dicopatron{$b} <=> $dicopatron{$a}} (keys %dicopatron)) {
print "$patron : $dicopatron{$patron}\n";
}