#!/usr/bin/perl
#--------------------------------------------------------------------
<<DOC;
NOM : SALMON Estelle
Usage du programme : 
Ce programme va extraire des patrons morphosyntaxiques à partir de l'étiquetage effectué par UDpipe (fichier udpipe, txt).
Ce programme va créer une liste des occurrences trouvées dans le fichier à partir du patron renseigné.

Pour lancer le programme : 
perl bao3_perl_UDconll.pl sortie_perl_bao2_UD_conll_3208.udpipe DET ADJ NOUN 

En entrée : un texte étiqueté et lemmatisé par UDpipe + une liste de POS décrivant le patron (ex: DET NC ADJ)
En sortie : la liste des occurrences du patron s'affiche dans le fichier de sortie
DOC
#--------------------------------------------------------------------
use utf8;
use strict;
binmode STDOUT,":utf8";
#--------------------------------------------------------------------
# le premier argument donné au programme est le fichier UDpipe à traiter
my $fichierUD_Atraiter=shift @ARGV;

# les éléments du patron sont les prochains arguments 
my @PATRON=@ARGV;

# ouverture du fichier à traiter
open my $input, "<:encoding(utf-8)",$fichierUD_Atraiter;

# création d'une liste pour contenir ce fichier
my @LISTE=<$input>;

# création du dico qui viendra contenir les termes
my %dicoPatron=();

# déclaration de la variable qui contiendra le nb de termes trouvés pour ce patron
my $nbTerme=0;

# fermeture du fichier à traiter
close($input);

# parcours de la liste (et donc du fichier) ligne par ligne 
while (my $ligne=shift @LISTE) {

	# déclaration des variables :une variable qui viendra contenir les termes correspondant au patron, une variable qui permettra de compter la longueur du patron et une variable pour gérer l'indice au niveau du patron
	my $terme="";
	my $longueur = 0;
	my $indice = 0;

	# si la ligne contenue dans $ligne correspond au premier élément du patron $PATRON[0]...
	if ($ligne=~/^[^\t]*\t([^\t]*)\t[^\t]*\t$PATRON[0]\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*$/) {

		# on concatène la valeur du premier groupe de capture (entre parenthèses) et la valeur de la variable terme / on construit la chaîne correspondant aux termes du patron, on commence par le premier terme
		
		$terme=$terme.$1;
		
		# le premier terme du patron a été reconnu, la valeur de la longueur du patron est à 1
		my $longueur=1;
		
		# l'indice est également à 1 
		my $indice=1;
		
		# alors il faut lire autant de ligne qu'il y a dans le patron et tester chaque terme du patron...
		while (($LISTE[$indice-1]=~/^[^\t]*\t([^\t]*)\t[^\t]*\t($PATRON[$indice])\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*\t[^\t]*$/) and ($indice <= $#PATRON)) {

			# on incrémente l'indice et on ajoute au terme un espace, ainsi que la string correspondant à l'élément du patron. On incrémente la longueur. 
			$indice++;
			$terme.=" ".$1;
			$longueur++;
		}
		
		# si la longueur est égale au nombre d'éléments du patron + 1...
		if ($longueur == $#PATRON + 1) {
		
			# on incrémente le dico des patrons avec le terme entier trouvé et on normalise en minuscules 
			$dicoPatron{lc($terme)}++;
			
			# on incrémente le nombre de termes
			$nbTerme++;
		}
	}	
}

# ouverture du fichier de résultats 
open my $fichierOutput,">:encoding(UTF-8)","patron_perl_UDconll_@PATRON.txt";

# on print le nombre de termes trouvés pour le patron
print $fichierOutput "$nbTerme éléments trouvés\n";

# pour chaque élément du patron, on trie 
foreach my $patron (sort {$dicoPatron{$b} <=> $dicoPatron{$a} } keys %dicoPatron) {
	print $fichierOutput "$dicoPatron{$patron}\t$patron\n";
}

# fermeture du fichier de résultats
close($fichierOutput);


