#!/usr/bin/perl
<<DOC; 
Nom -- Elise LINCKER
Date -- AVRIL 2021

Traitement -- extraction de dépendances syntaxiques

Utilisation du programme -- perl bao3_extract_dep_1relation_udpipexml.pl FICHIER_A_TRAITER "RELATION_DE_DEPENDANCE_A_EXTRAIRE"
Exemple d'utilisation -- perl bao3_extract_dep_1relation_udpipexml.pl BAO2_sortieUDpipe_3244.txt.xml "nsubj" > BAO3_sortie_Perl_NSUBJ_3244.txt
Entrée -- le nom de la sortie UDPipe reformatée en XML
          et le nom de la relation syntaxique de dépendance à extraire
Sortie -- la liste triée des couples Gouv Dep de la relation

Remarque -- selon la relation à extraire, on voudra modifier l'ordre d'affichage des résultats (Dep Gouv ou Gouv Dep) lignes 58 et 67
DOC

use strict;
use utf8;
binmode STDOUT, ':utf8';

#---------------------------------------------------------------------------------
my $fichier="$ARGV[0]";
my $relation="$ARGV[1]";
my %dicoRelation=();

#---------------------------------------------------------------------------------
#on découpe le texte par phrase (1 phrase par balise <p>)
$/="</p>";
open my $IN ,"<:encoding(utf8)","$fichier";
while (my $phrase=<$IN>) {

	#-----------------------------------------------------------------------------
	# on transforme la phrase récupérée en une liste d'items : 1 ligne = 1 balise <item>
	#il suffit de segmenter les phrases avec le caractère de retour à la ligne car on a déjà 1 item par ligne dans le fichier
	my @LIGNES=split(/\n/,$phrase);

	#pour chaque ligne = item :
	for (my $i=0;$i<=$#LIGNES;$i++) {

		#si la ligne lue contient la relation :
		#on utilise les expressions régulières pour récupérer :
		#	la forme du dépendant dans la variable $formeDep
		#	la position du dépendant dans la variable $positionDep
		#	la position du gouverneur dans la variable $positionGouv
		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 $formeDep=$2;
			my $positionDep=$1;
			my $positionGouv=$3;

			#on récupère la forme du gouverneur dans la variable $formeGouv
			#en fonction de la position du gouverneur par rapport au dépendant (avant ou après)
			#et on ajouter à $dicoRelation la concaténation forme du gouverneur + espace + forme du dépendant
			if ($positionDep > $positionGouv) {
				#si le gouverneur est avant le dépendant : on cherche le gouverneur parmi les lignes d'indice entre 0 et i
				for (my $k=0; $k<$i; $k++) {
					if ($LIGNES[$k]=~/<item><a>$positionGouv<\/a><a>([^<]+)<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><\/item>/) {
						my $formeGouv=$1;
						$dicoRelation{"$formeGouv $formeDep"}++;
					}
				}
			}
			else {
				#si le gouverneur est après le dépendant : on cherche le gouverneur parmi la ligne d'indice i+1 et la fin de la liste
				for (my $k=$i+1; $k<=$#LIGNES; $k++) {
					if ($LIGNES[$k]=~/<item><a>$positionGouv<\/a><a>([^<]+)<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><a>[^<]+<\/a><\/item>/) {
						my $formeGouv=$1;
						$dicoRelation{"$formeGouv $formeDep"}++;
					}
				}
			}
		}
	}
}
close ($IN);

#on affiche la liste des couples Gouv,Dep et leur nombre d'occurrences
foreach my $relation (sort {$dicoRelation{$b}<=>$dicoRelation{$a}} (keys %dicoRelation)) {
	print "$relation\t$dicoRelation{$relation}\n";
}