Série 3 : Patrons syntaxiques



Il s'agit ici d'ajouter au programme de la série 2 un programme d'extraction de patrons syntaxiques.

Cordial

On modifie le programme d'extraction de patrons syntaxiques.
Avec ce patron on obtient dans un fichier les suites de préposition suivi d'un nom commun.
Le contenu du programme (les modifications sont en vert) :

#!/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 exemple fournis :

perl trouve_terme.pl SORTIE-TREETAGGER.txt patrons-1.txt
perl trouve_terme.pl une-description-etiquetee-avec-treetagger.txt patrons-2.txt

et CA MARCHE !!!!!!!!!

DOC

#---------------------------------------------------
# debut du programme, ouverture en lecture du fichier passe en argument
#---------------------------------------------------
print "Bonjour !\n";
open(FIC, $ARGV[0]);

#---------------------------------------------------
# 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);
# On inverse lemme et patron car les colonnes d'un fichier Cordial ne sont pas le même ordre que celles d'un fichier TreeTagger
push(@token, $liste[$i++]." ");
push(@lemme, "$liste[$i++]" ." ");
push(@patron, "$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))) {
# On nettoie les catégories des caractères qui ne sont pas des majuscules ou un chiffre
$element_patron=~s/[^A-Z0-3]{3}/ /g;
# On adapte la recherche de ponctuation aux abréviations de Cordial
if ($element_patron !~ PCTFAIB && $element_patron !~ PCTFORTE) {

push(@sous_patron, $element_patron);

$j++;
next;
}

my @sous_token=@token[$k+1..$j-1];

# 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);
#=============================================
# procedure de recherche des patrons
#=============================================

sub cherche_patron {

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=$_;
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 FIC1 "@token[$k+$z+1..$k+$z+$nb]\n";
$z=0;
}
}
close(FIC)
}