#/usr/bin/perl
<<DOC; 
Nom : Santiago HY
Usage exemple : perl BaO3-UDdep.pl fichier-TT.xml ex-3208_nom-adj.txt "NOM ADJ"
Le programme prend en entrée le fichier étiqueté par TreeTagger dans sa forme xml, le nom du fichier de sortie et le patron morpho-syntaxique à chercher.
DOC
#-----------------------------------------------------------
#$ARGV[0] = fichier d'entrée
#$ARGV[1] = fichier de sortie
#$ARGV[2] = relation 
#-----------------------------------------------------------
use utf8;
#use warnings;
use strict;
binmode(STDOUT,":utf8");

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

my @pattern = split(/[_\W]+/, $ARGV[2]);

# Hash pour compter les répétitions des patterns
my %dico_extractions=();
# Création de deux liste que servirent pour parcourir et recuperer les POS et les tokens. 
my @pos=();
my @tokens=();

# On parcourt chaque phrase
while (my $phrase=<$input>){
	# Pour chaque ligne qui contient de contenu textuel étiqueté
	while (my $ligne=<$input>){
		if ($ligne =~ m/<element><data type=\"type\">(.+?)<\/data><data type=\"lemma\">(.+?)<\/data><data type=\"string\">(.+?)<\/data><\/element>/) {
		# Récupération des tokens et des POS de chaque ligne.
		push @pos, $1;
		push @tokens, $3;
		}
	}
}

close $input;

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

# On va parcourir tous les index de la list POS a partir de sa longuer.
foreach my $i (0..$len_pos){
	# Si l'on trouve le premier élement du pattern dans la liste de POS...
	# index() renvoie -1 si le deuxième élément ne se trouve pas dans le premier.
	if (index($pos[$i], $pattern[0]) != -1) {
		my $test = 0;
		# On vérifie si dans les étiquettes POS suivantes (longuer du pattern) on trouve les autres éléments du pattern. Si c'est faux, on ajoute une valuer à la variable de test.
		# On utilise cette méthode pour pouvoir récuperer aussi des étiquettes composée (VER:inf, PRP:det, etc.) à partir d'un pattern simple (ex. VER).
		for (my $j=0; $j<=$#pattern; $j++) {
			if (index($pos[$i+$j],$pattern[$j]) != 0) {
				$test++;
			}
		}
		# Si les séquences de POS et du pattern sont finalement équivalentes, on extrait les POS pour les stocker (en minuscule) dans une dictionnaire et pour compter ses occurrences
		if ($test == 0) {
			my $extraction = join(" ", @tokens[$i..$i+$len_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";
}