#/usr/bin/perl
<<DOC; 
Votre Nom : Santiago HY
Usage exemple : perl BaO3-UDpos.pl fichierconll.txt ex-3208-noun-adj.txt "NOUN ADJ"
Le programme prend en entrée le fichier étiqueté par UDpipe dans sa forme conll, le nom du fichier de sortie et la relation de dépendance.
DOC
#-----------------------------------------------------------
#$ARGV[0] = fichier d'entrée
#$ARGV[1] = fichier de sortie
#$ARGV[1] = pattern
#-----------------------------------------------------------
use utf8;
#use warnings;
use strict;
binmode(STDOUT,":utf8");

open my $input,"<:encoding(utf8)", "$ARGV[0]";
open my $output,">:encoding(utf8)", "$ARGV[1]";

# Regexp pour transformer le pattern donné par l'utilisateur dans une liste avec les POS
my @pattern = split(/[_\W]+/, $ARGV[2]);

# Création du dictionnaire pour après compter les ocurrences 
my %dico_extractions=();
# Création de deux liste que servirent pour parcourir et recuperer les POS et les tokens. 
my @pos=();
my @tokens=();

# Pour chaque ligne qui contient de contenu textuel étiqueté
while (my $ligne=<$input>){
	if ($ligne =~ m/^\d+\t/) {
		# Élimination de \n et \r
		$ligne =~ s/\r?\n//g;
		# Utilisation de la tabulation pour isoler dans une liste chaque élément de la ligne
		my @ligne = split(/\t/, $ligne);
		# Récupération des tokens et des POS de chaque ligne.
		push @tokens, $ligne[1];
		push @pos, $ligne[3];
	}
}

close $input;

# Dans deux variables, on stocke la longueur de la liste de POS et de la liste avec le pattern.
my $long_pat = scalar(@pattern);
my $long_pos = scalar(@pos);

# On va parcourir tous les index de la list POS a partir de sa longuer.
foreach my $i (0..$long_pos){
	# Si le POS est egale au premiere element du pattern
	if ($pos[$i] eq $pattern[0]){
		# Dans une variable temporelle (scalaire), on stocke la séquence de POS selon la longueur du pattern
		my $tmp_pos = join(" ", @pos[$i..$i+$long_pat-1]);
		my $tmp_pattern = join(" ", @pattern[0..$long_pat-1]);
		# Si les séquences de POS et du pattern sont égales, on extrait les POS pour les stocker (en minuscule) dans une dictionnaire et pour compter ses occurrences
		if ($tmp_pos eq $tmp_pattern) {
			my $extraction = join(" ", @tokens[$i..$i+$long_pat-1]);
			if (!(exists $dico_extractions{lc($extraction)})) {$dico_extractions{lc($extraction)} = 1 }
			else {$dico_extractions{lc($extraction)}++}
		}
	}
}

# On trie de façon descendant le contenu du dictionnaire.
foreach my $extraction (sort{$dico_extractions{$b} <=> $dico_extractions{$a}} keys %dico_extractions) {
	print $output "$dico_extractions{$extraction} $extraction\n";
}