Etape N°4
Exercice 1
Sur le corpus étiqueté p96.tag
Vous choisirez cinq formes graphiques différentes. Vous construirez ensuite un programme perl qui prend en entrée le fichier catégorisé et un nombre donné. Ce nombre définira la longueur de la fenêtre de mots que vous souhaitez extraire autour de la forme pôle.
Résultat 1
#!usr/bin/perl/
open (FILE, "p96.tag") or die "Non non non !";
open (FILEOUT, ">exo4sortie.html");
#l'utilisateur précise combien il veut de mots avant la forme pôle
print "Combien voulez-vous de mot(s) avant ?";
my $nombre_avant = <STDIN>;
chomp $nombre_avant;
#l'utilisateur précise combien il veut de mots après la forme pôle
print "Combien voulez-vous de mot(s) après ?";
my $nombre_apres = <STDIN>;
chomp $nombre_apres;
#début du document html
print FILEOUT "<html>\n";
print FILEOUT "<HEAD><TITLE>Concordancier</TITLE></HEAD>\n";
print FILEOUT "<BODY>\n";
#début du tableau
print FILEOUT "<TABLE border=2>\n";
#on précise la liste des mots que l'on veut extraire du corpus
@listemot = ("bébé","yeux","beaucoup","calme","dort"); #les guillemets ne sont pas nécéssaire mais c'est mieux !!! sinon bébé n'est pas trouvé !
#création de la première ligne du tableau contenant les titres sur trois cellules
print FILEOUT "<TR><TD><font size=5><center>Avant la forme pôle</center></font></TD><TD><font size=5><center>Forme pôle</center></font></TD><TD><font size=5><center>Après la forme pôle</center></font></TD></font></TR>";
#parcours du fichier
while ($ligne = <FILE>){
chomp($ligne);
for ($i=0;$i<=4;++$i){
#on vérifie si la ligne courante contient une des formes pôles
if ($ligne =~ /$listemot[$i]\/[A-Z]+/g){
print FILEOUT "<TR>";
print FILEOUT "<TD>";
my $avant=$`; #$` récupère ce qu'il y a avant la forme pôle
my $apres=$'; #$' récupère ce qu'il y a après la forme pôle
#comptage des mots avant la forme pôle
@tabavant = split(/ /, $avant);
$numelement_avant=$#tabavant-$nombre_avant+1;
if ($numelement_avant>=0) {
$u=$numelement_avant;
while ($u<$#tabavant+1){
print FILEOUT "$tabavant[$u] ";
$u=$u+1;
}
}
else {
print FILEOUT "$`";
}
print FILEOUT "</TD>";
#récupération de la forme pôle
print FILEOUT "<TD>";
print FILEOUT "<font color=blue><b>$&</b></font>"; #$& permet de récupérer la forme pôle
print FILEOUT "</TD>";
#comptage des mots après la forme pôle
@tabapres = split(/ /, $apres);
print FILEOUT "<TD>";
if ($nombre_apres>=0) {
$y=0;
while ($y<=$nombre_apres){
print FILEOUT "$tabapres[$y] ";
$y=$y+1;
}
}
else {
print FILEOUT "$'";
}
print FILEOUT "</TD>";
print FILEOUT "</TR>\n";
}
}
}
print FILEOUT "</TABLE>\n";
print FILEOUT "</BODY>\n";
print FILEOUT "</html>";
close FILEOUT;
close FILE;
Le fichier exo4sortie.html
Autre solution
#!/usr/local/bin/perl
#on définit le nombre de mots que l'on veut avant et après
print "Combien de mots voulez-vous observer avant?";
$nbavant=<STDIN>;
print "Combien de mots voulez-vous observer après?";
$nbapres=<STDIN>;
#on ouvre le fichier de sortie
open (FILEOUT, ">ex1.html");
#on y inscrit la structure html
print FILEOUT "<HTML>\n";
print FILEOUT "<HEAD><TITLE>Concordancier</TITLE></HEAD\n";
print FILEOUT "<BODY>";
@listedemots = ("bébé","bien","ouvre","contact","tonique");
#choix de la présentation par l'utilisateur
print "Autour des formes pôles, voulez-vous ne voir apparaître que les formes graphiques ? que les structures syntaxiques ? ou les deux ?" ;
print "Pour le premier cas, tapez 1, pour le deuxième, 2 et 3 pour le troisième \n";
$choix = <STDIN>;
foreach $mots (@listedemots)
{
#début du tableau html
print FILEOUT "<p><p><TABLE border =1 width=60% align=center><TR><TD align=center bgcolor=\"#0000FF\" width=43%> CONTEXTE GAUCHE </TD><TD align=center bgcolor=\"#0000FF\" width=13%> FORME POLE </TD><TD align=center bgcolor=\"#0000FF\" width=44%> CONTEXTE DROIT </TD></TR>" ;
#on ouvre le fichier d'entrée.
open (FILEIN, "p96.tag") or die "impossible";
while (my $ligne =<FILEIN> ) #pour chaque ligne
{
if ($ligne =~ /( |^)$mots(s|nt)?\/[(A-Z|0-9)]+ /)
{
@motsavant= split(/ /, $`); #on crée une liste contenant les mots situés avant le motif
my $numder = $#motsavant;
my $numvoulu = $numder - $nbavant+1; # on calcule le rang du premier mot de la liste à regarder = nb de mots de la liste (dernier+1) - nb souhaité par l'util.
print FILEOUT "<TR><TD align=center width=43%>"; # on commence la ligne du tableau
if ($numvoulu >= 0) # si ce rang est sup ou égal à 0,
{
for ($o=$numvoulu;$o<=$numder;++$o) # boucle qui commence à ce rang et finit au dernier mot de la liste
{
## on traite ces "mots" de la liste suivant les choix de l'utilisateur
if ($choix =~ /1/) ## l'utilisateur ne veut que les formes graphiques
{$motsavant[$o] =~ s/\/[(A-Z|0-9]*$//g;} ## on supprime les cat
elsif ($choix =~ /2/) ## l'utilisateur ne veut que les catégories
{$motsavant[$o] =~ s/^[^\/]*\///g;} ## on supprime les formes graphiques
else {$motsavant[$o] =~ s/^/<b>/g;## on met en gras la forme graphique pour plus de lisibilité
$motsavant[$o] =~ s/\//<\/b>\//g;};
print FILEOUT "$motsavant[$o] " ;}
}
else ## il y a moins de mots dans la liste que le nombre souhaité par l'utilisateur
{
for ($o=0;$o<=$numder;++$o) ## boucle qui va du premier mot de la liste au dernier
{
if ($choix =~ /1/)
{$motsavant[$o] =~ s/\/[(A-Z|0-9]*$//g;}
elsif ($choix =~ /2/)
{$motsavant[$o] =~ s/^[^\/]*\///g;}
else {$motsavant[$o] =~ s/^/<b>/g;
$motsavant[$o] =~ s/\//<\/b>\//g;};
print FILEOUT "$motsavant[$o] " ;}
}
print FILEOUT "</TD>"; ## on ferme la première cellule
print FILEOUT " <TD align=center><b><font color=\"blue\"> $& </font></b></TD>"; # on inscrit la forme pôle dans la 2ème cellule
@motsapres= split(/ /,$'); #on crée une liste contenant les mots situés après le motif
$nbvoulu = $nbapres -1;
print FILEOUT "<TD align=center>";
for ($o=0;$o<=$nbvoulu;++$o)
{
if ($choix =~ /1/)
{$motsapres[$o] =~ s/\/[(A-Z|0-9]*$//g;}
elsif ($choix =~ /2/)
{$motsapres[$o] =~ s/^[^\/]*\///g;}
else {$motsapres[$o] =~ s/^/<b>/g;
$motsapres[$o] =~ s/\//<\/b>\//g;};
print FILEOUT "$motsapres[$o] " ;
}
print FILEOUT "</TD></TR>";
}
}
close FILEIN;
}
close FILEOUT;
Fichiers de sorties possibles: ex4.1voc.html
Haut de page