#/usr/bin/perl
<<DOC; 
Nom : Santiago HY
Usage exemple : perl BaO3-UDdep.pl fichier-udpipe.xml ex-3208-subj.txt "subj"
Le programme prend en entrée le fichier étiqueté par UDpipe dans sa forme xml, 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[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 $relation = $ARGV[2];

# Hash pour compter les répétitions des patterns
my %dico_extractions=();

# On définit la variable où s'arrêtera la lecture. On lit ligne par ligne jusqu'á rencontrer la balise que délimite les phrases. L'unité de la phrase est essentiel pour respecter la portée des relations syntaxiques.
$/="</p>";

# On parcourt chaque phrase
while (my $phrase=<$input>){
	# Création d'une liste avec chaque ligne
	my @lignes = split(/\n/, $phrase);
	# On parcourt la liste de lignes jusqu'a la fin
	for (my $i=0; $i<=$#lignes; $i++) {
		# Si on trouve dans la ligne du dépendant la relation qu'on cherche, on récupère la position du dépendant et de la tête, du lemme du dépendant et aussi, le nom complet de la relation.
		if ($lignes[$i]=~/<item><a>([^<]+)<\/a><a>[^<]+<\/a><a>([^<]+)<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>([^<]+)<\/a><a>([^<]*$relation[^<]*)<\/a><a>[^<]+<\/a><a>[^<]+<\/a><\/item>/i) {
			my $position_dep = $1;
			my $lemme_dep = $2;
			my $position_tete = $3;
			my $relation= $4;
			# Quand la tête se trouve après le dépendant, on parcourt les lignes suivantes pour trouver le lemme de la tête syntaxique
			if ($position_dep > $position_tete) {
				for (my $k=0; $k<$i; $k++) {
					if ($lignes[$k]=~/<item><a>$position_tete<\/a><a>[^<]+<\/a><a>([^<]+)<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><\/item>/) {
						my $lemme_tete = $1;
						# On ajoute les résultats au dictionnaire, en calculant les fois que nous les avons trouvés.
						$dico_extractions{"$lemme_tete -[$relation]-> $lemme_dep"}++;
					}
				}
			}
			else {
				# Quand la tête se trouve avant le dépendant, on parcourt les lignes d'avant pour trouver le lemme de la tête syntaxique
				for (my $k=$i+1; $k<=$#lignes; $k++) {
					if ($lignes[$k]=~/<item><a>$position_tete<\/a><a>[^<]+<\/a><a>([^<]+)<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><\/item>/) {
						my $lemme_tete = $1;
						$dico_extractions{"$lemme_tete -[$relation]-> $lemme_dep"}++;
					}
				}
			}
		}
	}
}
close $input;

# 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";
}