Accueil | BàO 1 | BàO 2 | BàO 3 | BàO 4 | Conclusion

Après avoir réalisé l'extraction des balises titres et descriptions à l'aide des programmes de la Boîte à Outils 1 des rubriques choisies, nous enchaînons sur la Boîte à Outils 2. La deuxième boîte à outils permet d'étiqueter et de tokenizer les fils RSS.

Nous utiliserons donc deux méthodes: Treetagger et Talismane. Ce sont deux étiqueteurs syntaxiques: c'est à dire qu'ils vont coller une étiquette à chacun des mots/ponctuation. Par exemple, pour la phrase "La chaise est verte", ce pourrait donner ceci: LA DETERMINANT, CHAISE NOM, EST VERBE, VERTE ADJECTIF. Talismane produit en sortie un fichier texte avec 3 colonnes (forme, lemme, catégorie). Treetagger quand à lui,produit en sortie un fichier similaire, mais au format XML (grâce au script que nous avons introduit lors du traitement).

J'ai eu divers problèmes avec cette BàO: tout d'abord, j'ai vite réalisé que le programme mettait beaucoup trop de temps à tourner par rapport à ce que mes camarades disaient... Mais tout compte fait il s'agissait d'une erreur dans mon programme! En effet, la variable qui contenait les lignes à faire analyser par Talismane n'était pas réinitialisée à chaque tour de boucle, rendant donc l'éxecution du script de plus en plus longue.. (oups). Mais malheureusement cela n'a pas empêché mon programme de tourner au ralenti une fois ce problème résolu! J'ai ensuite eu un problème avec le tag de Tree-tagger: le programme fourni par nos professeurs (tree-tagger2xml) ajoutait des balises inutiles à mon fichier, et empêchait également les bonnes balises de se placer correctement! Il a fallu agir sur ce script pour régler ce petit problème. Ensuite, dernier problème rencontré: les titres/descriptions apparaissaient de nombreuses fois dans le fichier Talismane, alors qu'ils étaient censés apparaitre une fois seulement... J'ai réussi à localiser le problème après avoir observé les fichiers temporaires crées par le script pendant l'analyse par Talismane: un fichier texte contenant le contenu textuel (titre/description) avant analyse, et un fichier tal contenant l'analyse talismane sur ce même contenu textuel (fichiers tous deux ré-initialisés à chaque tour de boucle). Constatant qu'il n'y avait aucun problème de ce côté là, j'en ai conclu que le problème se situait au niveau de l'affichage dans le fichier final: j'ai donc opéré quelques tests pour trouver dans quelle boucle du programme il fallait mettre le print.

Voici donc le programme utilisé (que vous pouvez télécharger ici)

	                    
			#/usr/bin/perl
#-----------------------------------------------------------
<<DOC; 
 Février 2019
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter et le nom de la rubrique à traiter (via une suite de chiffres)
 Le programme construit en sortie 2 fichiers :
 - un fichier TXT
 - un fichier structuré en XML 
 Les 2 fichiers contiennent les zones textuelles extraites des fils RSS
DOC

#perl Load-BAO-tag.pl adresse_répertoire
#-----------------------------------------------------------
my $rep="$ARGV[0]";
my $rubrique="$ARGV[1]";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
my $i=0;
my %doublons;
open(OUT, ">:encoding(utf-8)", "sortie-$rubrique-regexp.txt");
open(OUTXML, ">:encoding(utf-8)", "sortie-$rubrique-regexp.xml");
print OUTXML "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print OUTXML "<racine>\n";
open (TALISMANE, ">:encoding(utf8)", "sortie-$rubrique-talismane.txt");

#----------------------------------------
&parcoursarborescencefichiers($rep);	#recurse!
close OUT;
print OUTXML "</racine>\n";
close OUTXML;
close TALISMANE;
exit;
#----------------------------------------------
sub parcoursarborescencefichiers {
    my $path = shift(@_);
    opendir(DIR, $path) or die "can't open $path: $!\n";
    my @files = readdir(DIR);
    closedir(DIR);
    foreach my $file (@files) {
		next if $file =~ /^\.\.?$/;
		$file = $path."/".$file;
		if (-d $file) {
		    print "on entre dans $file \n";
			&parcoursarborescencefichiers($file);	#recurse!
		}
		if (-f $file) {
		    if ($file=~/$rubrique.+\.xml$/) {			
				print $i++," : $file \n";
				open(FIC, "<:encoding(utf-8)", $file);
				my $tout_le_texte="";
				while (my $ligne = <FIC>) {
					chomp $ligne;
					$tout_le_texte = $tout_le_texte . $ligne . " ";
				}
				close FIC;
				$pourtalismane = "";
				while ($tout_le_texte =~ /<item>.*?<title>([^<]*)<\/title>.*?<description>([^<]*)<\/description>.*?<\/item>/g) {
					my $titre = $1;
					my $description = $2;
					my ($titrenettoye,$descriptionnettoye) = &nettoyage($titre,$description);
					if (exists $doublons{$titrenettoye}) {
						$doublons{$titrenettoye}++;
					}
					else {
						$doublons{$titrenettoye}=1;
						$pourtalismane = $pourtalismane . $titrenettoye . $descriptionnettoye;
						print OUT "$titrenettoye\n";
						print OUT "$descriptionnettoye\n";
						print OUTXML "<article>\n";
						my ($titreTT,$descriptionTT) = (&etiquetageTT($titrenettoye, $descriptionnettoye));
						print OUTXML "<titre>$titreTT</titre>\n";
						print OUTXML "<description>$descriptionTT</description>\n";
						print OUTXML "</article>\n";
					}
				}
				my $etiquetTa = &etiquetageTalismane($pourtalismane);
				print TALISMANE "$etiquetTa";
			}
		}
    }
}

sub nettoyage {

my $var = $_[0]; #my ($tit, $des) = @_;
my $var1 = $_[1];

$var = $var . "." ; # $var .= ".";
#$var1 = $var1 . ".";
$var1 =~ s/&#39;/'/g;
return $var, $var1;
}

sub etiquetageTT {

my $vartitre = $_[0];
my $vardesc = $_[1];
my $titretagge;
my $descriptiontagge;

open (TMP, ">:encoding(utf8)", "temp.txt");
print TMP $vartitre ;
close TMP;
system("perl5.28.0.exe tokenise-utf8.pl -f temp.txt | ./tree-tagger.exe -token -lemma -no-unknown french-utf8.par > temps_tag.txt");
system("perl5.28.0.exe treetagger2xml-utf8.pl temps_tag.txt utf8");
{
local $/=undef; #pour inhiber la lecture ligne à ligne
open(FIC1, "<:encoding(utf8)", "temps_tag.txt.xml");
$titretagge = <FIC1>; 
#on se débarrasse de l'entête xml
$titretagge =~s/<\?xml.+?>//;
close FIC1;
}

open (TMP, ">:encoding(utf8)", "temp.txt");
print TMP $vardesc ;
close TMP;
system("perl5.28.0.exe tokenise-utf8.pl -f temp.txt | ./tree-tagger.exe -token -lemma -no-unknown french-utf8.par > temps_tag.txt");
system("perl5.28.0.exe treetagger2xml-utf8.pl temps_tag.txt utf8");
{
local $/=undef; #pour inhiber la lecture ligne à ligne
open(FIC1, "<:encoding(utf8)", "temps_tag.txt.xml");
$descriptiontagge = <FIC1>; 
#on se débarrasse de l'entête xml
$descriptiontagge =~s/<\?xml.+?>//;
close FIC1;
}
return $titretagge, $descriptiontagge;

}

sub etiquetageTalismane {

my $var = shift @_;
open (TMP, ">:encoding(utf8)", "bao1_test.txt");
print TMP $var;
close TMP;
system("java -Xmx1G -Dconfig.file=./TALISMANE/talismane-fr-5.0.4.conf -jar ./TALISMANE/talismane-core-5.1.2.jar --analyse --sessionId=fr --encoding=UTF8 --inFile=bao1_test.txt --outFile=bao1_test.tal");
my $lefil;
{
local $/=undef; #pour inhiber la lecture ligne à ligne
open(FIC1, "<:encoding(utf8)", "bao1_test.tal");
$lefil = <FIC1>; 
close FIC1;
}
return $lefil;

}

#----------------------------------------------


                      
                

Nous avons donc en sortie un fichier texte avec juste les titres/descriptions, un autre contenant les phrases taggées par Talismane, ainsi qu'un fichier xml de ces mêmes phrases taggées par Tree-tagger!

Nous avons donc tout ce qu'il faut pour enchaîner sur la Boîte à Outils 3

Pour télécharger les fichiers, ça se passe ici (sous forme d'archive)

haut de page