#!/usr/bin/perl

<<DOC; 
 FEVRIER 2006
 usage : perl patron2graphml.pl liste-de-token.txt
 Le programme prend en entrée le nom du fichier contenant les patrons
 à traiter (des blancs entre les termes du patron)
 Le programme construit en sortie un fichier au format graphml

DOC

#-------------------------
# definitions de variables
#-------------------------
my $file="$ARGV[0]"; #le nom du fichier de patron qu'on veut traiter
my %listeMot={};	#premier dictionnaire : 
my %listePatron={};	#compter les occurences de patrons

#-------------------------
# Partie 1
# A. ouverture du fichier des patrons : ce fichier contient sur chaque ligne une sequence : mot1 mot2
# B. dans la boucle while qui suit on va reperer pour chaque mot (a gauche du patron) 
# l'ensemble des mots associés (a droite du precedent)
# on cree ensuite un tableau indexe qui associe au mot de gauche la liste des mots associes
# motgauche -> (motdroite-1,motdroite-2,...)
# on n'ajoute qu'une seule occurrence des mots presents a droite mais on compte 
# la frequence d'un patron donne dans un tableau de patron 
#-------------------------

open(F,$file);
while (my $ligne=<F>) {
    $ligne=~/([\wÆÁÂÀÅÃÄÇÇÇÐÉÊÈËÍÎÌÌÏÑÓÔÒØÕÖÞÚÛÙÜÝáâæàåãäçéêèðëíîìïñóôòøõößþúûùüýÿ]+)[^\wÆÁÂÀÅÃÄÇÇÇÐÉÊÈËÍÎÌÌÏÑÓÔÒØÕÖÞÚÛÙÜÝáâæàåãäçéêèðëíîìïñóôòøõößþúûùüýÿ]+([\wÆÁÂÀÅÃÄÇÇÇÐÉÊÈËÍÎÌÌÏÑÓÔÒØÕÖÞÚÛÙÜÝáâæàåãäçéêèðëíîìïñóôòøõößþúûùüýÿ]+)/;  ##isoler le nom de l'adjectif
    my $mot1=$1;
    my $mot2=$2;
    print "M1 : $mot1\n";	##on reconstruit artificiellement le patron pour les compter
    print "M2 : $mot2\n";
    my $patron="$mot1\t$mot2";		##inscription dans le tableau
    if (!(exists($listeMot{$mot1}))) {		##verification que cette ligne n'existe déja
	my @tmp=();
	push(@tmp,$mot2);
	$listeMot{$mot1}=\@tmp;	#principale difficulté de ce script : construction d'un référence vers un tableau 
	print "FM : $listeMot{$mot1}\n";
	$listePatron{$patron}++;
    }
    else {
	my $tmp=$listeMot{$mot1};
	my @tmp2=@$tmp;
	if (!(grep(/$mot2/, @tmp2))) { #verifier si l'element n'est pas present deja dans le tableau, une expression reguliere, on recherche une chaine de caractères dedans
	    push(@tmp2,$mot2);
	}
	$listeMot{$mot1}=\@tmp2;		#principale difficulté de ce script : construction d'un référence vers un tableau 
	print "NM : $listeMot{$mot1}\n";
	$listePatron{$patron}++;
    }
}
close(F);
#print %listeMot,"\n";

#-------------------------
# Partie 2
# A. Creation du fichier de sortie et squelette minimal
# B. parcours du tableau des associations motgauche -> (motdroite-1,motdroite-2,...)
# pour chaque motgauche on cree un noeud du graphe idem pour chaque mot de la liste associee
# afin de ne pas creer de doublon on utilise un tableau contenant pour chaque mot son indice
# on verifie dans ce tableau la presence ou non du mot a associer a un noeud
#-------------------------------------------

open (F,">graphml_$ARGV[0].xml");
print F "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
print F "<graphml>\n";
print F " <key id=\"d0\" for=\"node\" attr.name=\"forme\" attr.type=\"string\"/>\n";
print F " <key id=\"d1\" for=\"edge\" attr.name=\"frequence\" attr.type=\"double\"/>\n";
print F "  <graph edgedefault=\"undirected\">\n";

my $id=1;
my $listeId={};

while (($mot, $liste) = each(%listeMot)) {  ##each fonction qui permet de parcourir un tableau indexé, son rôle c'est récupérer une cle : une valeur
    my @tmp=@$liste;
    print "$mot\t@tmp\n";
    if ($mot !~/HASH/) {			##ceci est du dibouilli
	my $tmpID;
	if (!(exists($listeId{$mot}))) {
	    print F "  <node id=\"$id\"><data key=\"d0\">$mot</data></node>\n";		##ceci est la syntaxe GRAPHml
	    $listeId{$mot}=$id;
	    $tmpID=$id;
	    $id++;
	}
	else {
	    $tmpID=$listeId{$mot};
	}
	foreach my $cible (@tmp) {			##boucle classique de scanneur en PERL foreach        ON BOUCLE POUR TOUS LES ADJECTIFS
	    my $nbpatron=0;
	    $patron="$mot\t$cible";
	    $nbpatron=$listePatron{$patron};
	    if (!(exists($listeId{$cible}))) {
		print F "  <node id=\"$id\"><data key=\"d0\">$cible</data></node>\n";
		$listeId{$cible}=$id;
		print F "  <edge source=\"$tmpID\" target=\"$id\"><data key=\"d1\">$nbpatron</data></edge>\n";
		$id++;
	    }
	    else {
		print F "  <edge source=\"$tmpID\" target=\"$listeId{$cible}\"><data key=\"d1\">$nbpatron</data></edge>\n";  ##fermer le fichier xml 
	    }
	}
    }
    
} 


print F " </graph>\n";
print F "</graphml>\n";


close(F);

