#!/usr/bin/perl <<DOC; Axel COURT & Marjorie SEIZOU AVRIL 2010 usage : perl perl comparaison.pl extractionTreeTagger extractionCordial Veiller à bien spécifier le fichier TreeTagger d'abord, et le fichier Cordial ensuite DOC # Test des paramètres if ($#ARGV != 1) { print "Syntaxe : perl comparaison.pl extractionTreeTagger extractionCordial\n" ; exit(-1); } #-------------------------------------------- # Ouverture des fichiers en lecture #-------------------------------------------- open (FICTREETAG, "<:encoding(iso-8859-1)", $ARGV[0]) or die ("Impossible d'ouvrir le fichier TreeTagger : $!\n"); open (FICCORDIAL, "<:encoding(iso-8859-1)", $ARGV[1]) or die ("Impossible d'ouvrir le fichier Cordial : $!\n"); open(OUT, ">:encoding(utf8)", "etiquetage_correct.txt") or die ("Impossible d'ouvrir le fichier de sortie : $!\n"); my $dumpgeneral = ""; &comparetreetaggercordial; print OUT $dumpgeneral; close(OUT); exit; # ------------------------ # Procédures # ------------------------ sub comparetreetaggercordial { my %contenutreetagger; my %contenucordial; my @fichiertreetag = (); my @fichiercordial = (); my %segmentscommuns; my $patroncourant = ""; while ($ligne = <FICTREETAG>) { # Lecture du fichier dans un tableau if ($ligne !~ /^\s*$/) { chomp($ligne); push(@fichiertreetag, $ligne); } } while ($ligne = <FICCORDIAL>) { # Lecture du fichier dans un tableau if ($ligne !~ /^\s*$/) { chomp($ligne); push(@fichiercordial, $ligne); } } close(FICTREETAG); close(FICCORDIAL); my $ligne = shift(@fichiertreetag); my $i = 0; my $j = $#fichiertreetag; while ($i <= $j) { # On initialise des listes de hash pour chaque patron dans le fichier TreeTagger si on tombe sur des "-----" indiquant une entête de patrons if ($ligne =~ /^-+$/) { $ligne = shift(@fichiertreetag); $patroncourant = $ligne; $patroncourant =~ s/PRP:det/PRP/g; if (not exists($contenutreetagger{$patroncourant})) { $contenutreetagger{$patroncourant} = (); } $ligne = shift(@fichiertreetag); $ligne = shift(@fichiertreetag); $i = $i+3; } # Sinon, c'est qu'on a des résultats d'extraction -> on garnit le tableau de hash correspondant avec else { push(@{$contenutreetagger{$patroncourant}},$ligne); $ligne = shift(@fichiertreetag); $i++; } } my $ligne = shift(@fichiercordial); my $i = 0; my $j = $#fichiercordial; my $patroncourant = ""; while ($i <= $j) { # On initialise des listes de hash pour chaque patron dans le fichier Cordial si on tombe sur des "-----" indiquant une entête de patrons if ($ligne =~ /^-+$/) { $ligne = shift(@fichiercordial); $patroncourant = $ligne; &formatecordial($patroncourant); if (not exists($contenucordial{$patroncourant})) { $contenucordial{$patroncourant} = (); } $ligne = shift(@fichiercordial); $ligne = shift(@fichiercordial); $i = $i+3; } # Sinon, c'est qu'on a des résultats d'extraction -> on garnit le tableau de hash correspondant avec else { push(@{$contenucordial{$patroncourant}},$ligne); $ligne = shift(@fichiercordial); $i++; } } while ( ($key, $value) = each(%contenutreetagger) ) { my $dump = ""; my @tabtemptree = @$value; my %tabtree = map { $_, 1 } @tabtemptree; my @tabtempcord = @{$contenucordial{$key}}; my %tabcord = map { $_, 1 } @tabtempcord; while ( ($cle, $valeur) = each(%tabtree) ) { if (exists $tabcord{$cle}) { $segmentscommuns{$cle}++; delete($tabtree{$cle}); delete($tabcord{$cle}); } } $dump .= "---------------------------------------------------------------------------------------------------------\n"; $dump .= "Patron étudié : $key\n"; $dumpgeneral .= $dump."---------------------------------------------------------------------------------------------------------\n"; $dump .= "##############################\nSegments communs\n##############################\n"; while ( ($cle, $valeur) = each(%segmentscommuns) ) { $dump .= "$cle\n"; $dumpgeneral .= "$cle\n"; delete $segmentscommuns{$cle}; } $dump .= "\n\n\n"; $dump .= "##############################\nTreeTagger\n##############################\n"; while ( ($cle, $valeur) = each(%tabtree) ) { $dump .= "$cle\n"; delete $tabtree{$cle}; } $dump .= "\n\n\n"; $dump .= "##############################\nCordial\n##############################\n"; while ( ($cle, $valeur) = each(%tabcord) ) { $dump .= "$cle\n"; delete $tabcord{$cle}; } $dumpgeneral .= "\n\n\n"; $key =~ s/ /_/g; open (SORTIE, ">:encoding(iso-8859-1)", "comparaison_$key.txt") or die ("Impossible de créer le fichier de sortie : $!\n"); print SORTIE $dump; close(SORTIE); } } sub formatecordial { $_[0] =~ s/NC\w+/NOM/g; $_[0] =~ s/ADJ\w+/ADJ/g; $_[0] =~ s/PREP/PRP/g; return $_[0]; }