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)