﻿#L'option -w pour warning, il nous donne des infos plus clairs 
#!/usr/bin/perl -w

<<DOC; 
Francesca ERVAS, Ardas KHALSA, Thomas MORAINE
Mai 2012
Inspiré du script de M. Daube
Ce programme prend le fichier de sortie de Cordial, le parcourt et extrait les patrons morpho-syntaxiques.
Utilisation: perl extrait_terminologie.pl sorties_cordial.cnr.txt fichier_patrons.txt

DOC

# Declaration des listes, au depart il est vide.  On peut aussi ecrire my (@LISTEDETOKEN, @LISTEDEPOS);
my @LISTEDETOKEN=();
my @LISTEDEPOS=();

# On s'attend a avoir un argument lorsqu'on lance ce programme
# On récupère le texte etiqueté 
open(TEXT, $ARGV[0]);

# On parcourt le fichier ligne par ligne
while(my $ligne=<TEXT>){
	
	# La fin de ligne sur windows c'est \r et Cordial travaille sur Windows, donc on le remplace avec rien, sur toutes les lignes
	$ligne=~s/\r//g; 
	
	# On enleve les retours a la ligne, on peut ecrire aussi chomp $ligne;
	chomp($ligne);
	
	# On rassure que la ligne ressemble à ça: début de la ligne, chaîne, tabulation, cchaîne, tabulation, chaîne, fin de ligne
	# Dans les chaînes nous rencontrons les formes, les lemmes, et les parts-of-speech
	if($ligne=~/^[^\t]+\t[^\t]+\t[^\t]+$/)
	{
	
	# Ces variables change de ligne à ligne, on le met dans une liste
	# On découpe un fichier qui est structuré, on récupère avec une tabulation
	my ($token, $lemme, $pos) = split("\t", $ligne);

	# On verifie qu'on a bien extrait ce qu'on voulait
 	print "POS : <$pos> LEMME: <$lemme> FORME : <$token> \n";
	
	# push va ajouter les éléments de LIST à ARRAY
	push(@LISTEDETOKEN, $token);
	push(@LISTEDEPOS, $pos);
	}
}
close(TEXT);
foreach my $element(@LISTEDEPOS){
#--------------------------------------------	
	# Le resultat de la concatenation avec un , et blanc apres
	# print $element," ";
}
#-------------------------------------------
# On va chercher en ligne de commande le 2ème argument
open(TERM, $ARGV[1]);

# A partir de notre liste, on cree un scalaire, On doit transformer la liste qu'on parcourt en scalaire
# Join reunit une liste et un scalaire, le separateur est l'espace " "
my $suitedepos=join(" ", @LISTEDEPOS);

# On parcourt le fichier pour extraire les patrons qui nous interessent, la valeur de $term est la ligne courante
while (my $term=<TERM>){
	chomp($term);
	my $i=0;
	chomp(my $nompatron=$term);
	print "nom patron <$nompatron> \n";  
	$nompatron=~s/ /_/g;

	open(OUT, ">$nompatron.txt");
		
	# Chaque fois que dans ma liste de pos il y mon terme, dis-le-moi, g est un flag qui recupere toutes les occurrences
	# Sans g il va boucler sur la 1ere occurrence
		print "suitedepos est : <$suitedepos> fin \n\n\n\n\n\n\n\n\n\n";
		print " term : <$term> \n";
	
	while ($suitedepos=~/$term/g){
		# La variable par defaut pour recuperer ce qui vient avant
		my $avant=$`;
#		print "avant : <$avant> \n";
		my $nombredeblanc=0;
		while ($avant=~/ /g){
		$nombredeblanc++;
		}
		print "Nombre de blanc avec match: $nombredeblanc\n";
		$i++;
		my @listeelementpatron=split(/ /,$term);
#	print "listeelementpatron : <$listeelementpatron> \n";
		my $longueurpatron=$#listeelementpatron+1;
#	print "longueur patron <$longueurpatron> \n";

		for (my $k=0;$k<$longueurpatron;$k++) {
			print OUT "$LISTEDETOKEN[$nombredeblanc+$k] ";
#			print "$term : MATCH OK $i \n";
		}
		print OUT "\n";
	}
	close(OUT);	
	print "il y a $i occurences \n";
	
}

close(TERM);