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)
}