#!/usr/bin/perl
#--------------------------------------------------------------------
#pour lancer le script depuis le terminal: 
#perl programme.pl fichierTT patron
#exemple de patron: DET NC ADJ
#le fichierTT est un texte étiqueté et lemmatisé par treetagger 


#pour les patrons, voir le site
#--------------------------------------------------------------------

use utf8;
binmode STDOUT,":utf8";
#--------------------------------------------------------------------
#le nom de la rubrique à traiter est le premier argument; on l'enlève de la liste des arguments
my $fileatraiter=shift @ARGV;
#le patron correspond aux arguments restants
my @PATRON=@ARGV;


open my $input, "<:encoding(utf-8)",$fileatraiter;
#on lit l'ensemble du fichier et on ajoute le contenu dans une liste
my @LISTE=<$input>;
close($input);

#tant qu'on n'a pas fini de lire le texte, on récupère la ligne et on l'enlève de la liste (la liste sera vide quand on aura lu tout le texte)
while (my $ligne=shift @LISTE) {
	# si la ligne contenue dans $ligne correspond au premier du patron $PATRON[0]
	my $terme="";
	#on cherche le patron dans la ligne grâce à une expression régulière
	if ($ligne=~/<element><data type="type">$PATRON[0](:[^<]+?)?<\/data><data type="lemma">[^<]+?<\/data><data type="string">([^<]+?)<\/data><\/element>/) {
		#on récupère le premier groupe de capture (la forme)
		$terme=$terme.$2;
		#on crée une variable pour la longueur du patron
		my $longueur=1;
		#et l'indice du patron où on se trouve
		my $indice=1;
		# on lit autant de ligne qu'il y a d'élément dans le patron et on teste chaque patron
		while (($LISTE[$indice-1]=~/<element><data type="type">$PATRON[$indice](:[^<]+?)?<\/data><data type="lemma">[^<]+?<\/data><data type="string">([^<]+?)<\/data><\/element>/) and ($indice <= $#PATRON)) {
			#on incrémente l'indice et la longueur
			$indice++;
			#et on récupère la forme
			$terme.=" ".$2;
			$longueur++;
		}
		#si on a parcouru tout le patron
		if ($longueur == $#PATRON + 1) {
			#on ajoute le terme (donc le patron complet) dans un dictionnaire ; cela nous sert à compter les fréquences
			$dicoPatron{$terme}++;
			$nbTerme++;
		}
	}	
}
open my $fileResu,">:encoding(UTF-8)","NAMPREPNOM-3234.txt";
print $fileResu "$nbTerme éléments trouvés\n";
#on parcourt le dictionnaire contenant toutes les expressions trouvées avec le patron et on l'écrit dans le fichier de sortie
foreach my $patron (sort {$dicoPatron{$b} <=> $dicoPatron{$a} } keys %dicoPatron) {
	print $fileResu "$dicoPatron{$patron}\t$patron\n";
}
close($fileResu);