Boite à Outils 3 : La Methode JMD
Pour lancer ce programme on a besoin d'un fichier texte contenant les patrons comme suit :
NC.. PREP NC..
NC.. ADJ..
ADJ.. NC..
Le code commenté
#!/usr/bin/perl
use utf8;
binmode STDOUT, "utf-8";
#programme d'extraction de patrons sur sortie cordial
# perl JMD_prgm.pl 3208_iso.cnr PATRONS.txt |sort |uniq -c | sort -r > grr.txt
open(FILE, "<:encoding(utf8)", $ARGV[0]); #on ouvre le fichier cordial
my $chaine="";
while (my $ligne =<FILE>) { #on le lit ligne à ligne
# on passe le fichier de vertical "mot lemme POS"
# à horizontal "POS_token POS_token POS_token"
#dans chaque ligne du fichier, on récupère ce qu'il y a entre les tabulations (=^I=\t)
#phrase par phrase
chomp $ligne;
if (($ligne=~/^([^\t]+)\t[^\t]+\t([^\t]+)$/) and ($ligne!~/PCTFORTE/)){
my $f=$1; #token/syntagme
my $c=$2; #POS
$f=~s/ /#/g; #vire les espaces à l'interieur des syntagmes
$chaine=$chaine.$c."_".$f." "; #produit la chaine horizontale
}
else {
#print $chaine; #affiche la phrase
#$continu=<STDIN>;
# EXTRACTION DE PATRONS
open(TERM, "<:encoding(utf8)", $ARGV[1]); # ouvre le fichier de patrons
while (my $terme=<TERM>){ #pour chaque Patron
chomp($terme); #on vire le retour à la ligne du patron
#on génère une expression régulière à partir de notre patron
#attention à ce que le programme utilise pas d'emblée la RegEx
$terme=~s/([^ ]+)/$1_[^ ]+/g;
while ($chaine=~/$terme/g){
# $& = resultat du match
# $` = contexte gauche
# $' = contexte droit
my $correspondance=$&;
$correspondance=~s/[A-Z]+_//g;
$correspondance=~s/#/ /g;
print $correspondance, "\n";
}
close(TERM)
}
$chaine=""; #nettoie la chaine qui stockait la phrase
}
}
close (FILE)