#!/usr/bin/perl <<DOC; Axel COURT & Marjorie SEIZOU AVRIL 2010 usage : perl posCordial.pl fichier-taggé-par-Cordial Ce programme permet de générer sans effort la liste complète des patrons précis possibles pour un fichier étiqueté par Cordial, sur la base des patrons minimaux ADJ NOM, NOM ADJ, NOM PREP NOM Cordial utilise en effet de nombreuses abréviations, puisque le programme indique le genre, le nombre et d'autres renseignements sur les mots qu'il tagge. La liste complète des patrons envisageant toutes les possibilités de combinaisons est utile pour lancer les procédures d'extraction via n-grams par exemple, où l'utilisation de regex pour envisager la multitude de POS est impossible, puisque chaque patron est stocké comme clé d'une table de hashage et doit donc être une suite unique. DOC #----------------------------------------------------------- # Test des paramètres if ($ARGV[0] eq "") { print "Usage : perl posCordial.pl fichier-taggé-par-Cordial \n" ; exit(-1); } #---------------------------------------------------------- # Ouverture des fichiers en lecture et écriture #---------------------------------------------------------- open (FICCORDIAL, $ARGV[0]) or die ("Impossible d'ouvrir le fichier Cordial : $!\n"); open (OUTPOS, ">posC.txt") or die ("Impossible d'ouvrir le fichier de sortie : $!\n"); my %adj; my %nom; my %posfinal; # Parcours du fichier étiqueté, et récupération de toutes les variantes possibles autour de ADJ et NC while ($ligne = <FICCORDIAL>) { if ($ligne =~ /^.+(NC[^\t]+)(\t.)*$/) { my $abrv = $1; chomp($abrv); $nom{$abrv}++; } elsif ($ligne =~ /^.+(ADJ[^\t]+)(\t.)*$/) { my $abrv = $1; chomp($abrv); $adj{$abrv}++; } } close(FICCORDIAL); # Combinaison des POS entre-elles pour former les patrons my @triadj = sort keys %adj; my @trinom = sort keys %nom; my @copienom = @trinom; while (my $nomcourant = shift(@trinom)) { foreach my $adjcourant (@triadj) { $posfinal{"$adjcourant $nomcourant"}++; $posfinal{"$nomcourant $adjcourant"}++; } foreach my $nom2 (@copienom) { $posfinal{"$nomcourant PREP $nom2"}++; } } # Ecriture du fichier pos.txt while ( ($key, $value) = each(%posfinal) ) { print OUTPOS $key; print OUTPOS "\n"; } close(OUTPOS); exit;