BAO 2

BAO 2

En utilisant comme données d'entrée les fichiers XML et TXT générés contenant les titres et les descriptions par la BAO 1, nous avons utilisé les logiciels Cordial et Treetagger afin d'obtenir des fichiers de sortie tokénisés et étiquetés.

Cordial n'étant pas un logiciel open source et puisqu'il est payant nous l'avons dû utilisé à l'ILPGA afin de produire les fichiers attendus.

Pour étiqueter l'ensemble de notre corpus, contenant nos quatre rubriques, le programme a tourné toute une nuit.

En utilisant le logiciel Cordial, nous obtenons les fichiers résultats suivant:

Le logiciel Treetagger est, quant à lui, un logiciel open source et, bien qu'il soit, a priori, moins efficace que Cordial pour certains points, il permet tout de même de tokéniser et d'étiqueter avec suffisamment de précision pour que nous puissions analyser les fichiers résultats. Qui plus est, le logiciel Treetagger permet d'être incorporé à notre script afin de produire le fichier de la BAO1 et la BAO2 simultanément.

Script PERL de la BAO 2:

									
#/usr/bin/perl

use warnings;
use strict;

<<DOC; 
Votre Nom : COLLOMB-ALFONSO
JANVIER 2016
 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
 Le programme prend en entrée le nom du répertoire contenant les fichiers
 à traiter
 Le programme construit en sortie un fichier structuré contenant sur chaque
 ligne le nom du fichier et le résultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC
#----------------START-Arguments-Entree-(input)----------------
my $rep="$ARGV[0]";
my $rubrique = "3246|651865|3476|3260";
my %dico;
$rep=~ s/[\/]$//;
#----------------END-Arguments-Entree-(input)----------------

#----------------START-Declaration-Variables---------------
my $output1="2015-3246.xml";
my $output2="2015-651865.xml";
my $output3="2015-3476.xml";
my $output4="2015-3260.xml";
#----------------END-Declaration-Variables----------------

#----------------START-Enregistrement-Texte-Entete---------------
if (!open (FILEOUT,">$output1")) { die "Pb a l'ouverture du fichier $output1"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output2")) { die "Pb a l'ouverture du fichier $output2"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output3")) { die "Pb a l'ouverture du fichier $output3"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
if (!open (FILEOUT,">$output4")) { die "Pb a l'ouverture du fichier $output4"};
print  FILEOUT "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
print  FILEOUT "<PARCOURS>\n";
print  FILEOUT "<NOM>ALFONSO-COLLOMB</NOM>\n\n";
close (FILEOUT);
#----------------END-Enregistrement-Texte-Entete----------------

#----------------START-Appel-Fonction---------------
&parcoursarborescencefichiers($rep);	
#----------------END-Appel-Fonction----------------

#----------------START-Enregistrement-Texte-Fil-RSS---------------
open (FILEOUT,">>:encoding(utf-8)", $output1);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output2);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output3);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);
open (FILEOUT,">>:encoding(utf-8)", $output4);
print  FILEOUT "</PARCOURS>\n";
close (FILEOUT);

exit ;
#----------------END-Enregistrement-Texte-Fil-RSS----------------

#----------------START-Definition-Fonction---------------
sub  parcoursarborescencefichiers 
	{
	#definition du repertoire de lecture comme l'element passe en argument
    my $path= shift(@_);
    opendir (DIR, $path) or die "can't open $path: $!\n";
	
	#definition d'une liste contenant le nom de chaque fichier du repertoire
    my @files = readdir(DIR);
    closedir (DIR);
	
	#boucle permettant de parcourir la liste contenant le nom des fichiers
    foreach  my $file (@files) 
		{
		#reconnaissance des lignes porteuses des informations pertinentes
		next  if $file =~ /^\.\.?$/;
		
		#definition du chemin du fichier un par un
		$file = $path."/".$file;
		
		#condition verifiant si le repertoire existe et enregistrant des
		#balises dans le fichier de résultat en début et en fin
		if (-d $file) 
			{
			print  "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
			&parcoursarborescencefichiers ($file);
			print  "<FIN REPERTOIRE> ==> ",$file,"\n";
			}
			
		#condition verifiant si le fichier existe
		if (-f $file) 
			{
			#condition verifiant si le fichier correspond au numero de rubrique
            if ($file =~ /($rubrique).+\.xml$/) 
				{
				#implementation d'un compteur
				my $numeroDerniereRubrique = $1;
                print  "<",$i++,"> ==> ",$file,"\n\n\n";
				
				#definition de variables ouvrant des fichiers en mode d'ecriture
				#dans un encodage UTF-8
                $codage = "utf-8";
                open (FIC, "<:encoding($codage)", $file);
                open (OUT, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.txt");
                open (OUT2, ">>:encoding($codage)", "2015-$numeroDerniereRubrique.xml");
				
				#definition de variable afin d'y ajouter le texte ligne par ligne
                my $texte="";
				
				#boucle parcourant chaque ligne de texte du fichier
                while (my $ligne = ) 
					{
					#mise en forme de la ligne de texte
                    chomp $ligne;
                    $ligne =~ s/\r//g;
                    $texte = $texte . $ligne;
					}
				#fermeture du fichier
                close FIC;
				
				#mise en forme de la variable
                $texte =~ s/>\s+</></g;
				
				#definition de compteur et boucle recherchant les
				#elements titre et description dans le texte
				my $compteurArticle = 1 ;
                while ($texte =~m/<item>< title>([^<]+?)<\/ title>< link>(?:[^<]+?)<\/ link><description>([^<]+?)<\/description>/g) 
					{
						#definition des variables et mise en forme des elements tite et description
						my $titre = $1;
                        my $description = $2;
                        $titre=~s/<.+?>.+&.//g;
                        $titre.=".";
                        $titre=~s/\?\.$/\?/;
                        $description=~s/<.+?>//g;
						
						#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
						#le fichier resultat les balises et le contenu du compteur d'articles, du
						#titre et de la description
                        if (!(exists  $dico{$titre})) 
							{
                            $dico{$titre} = 1;
							my $compteurArticle  = $compteurArticle++;
                            print  OUT "$titre\n";
                            print  OUT "$description\n\n";
                            print  OUT2 "<item num=\"$compteurArticle\" >\n< title>$titre</ title>\n<description>$description</description>\n</item>\n\n";   

							
							#######################################################################################
							#START - SECTION DU SCRIPT EXCLUSIVE DE BAO2 1/2	
							#######################################################################################
							&etiquetage($titre, $description, $numeroDerniereRubrique); 
							#######################################################################################
							#END - SECTION DU SCRIPT EXCLUSIVE DE BAO2 1/2
							#######################################################################################
							}
					}
				#fermeture des fichiers
                close OUT;
                close OUT2;
                # fin de traitement du fichier
				}

			#condition appelant le fichier TXT
			if ($file =~ /($rubrique).+\.txt$/) 
				{
		        my $rubriquereconnnue=$1;
                print "< PPPPPP",$i++,"> ==> ",$file,"\n\n\n";
				
				#definition de variables ouvrant des fichiers en mode d'ecriture
				#dans un encodage UTF-8
                $codage = "utf-8";
                open (FIC2, "<:encoding($codage)", $file);
                open (OUT3, ">>:encoding($codage)", "Profond$rubriquereconnnue.txt");
				
				#definition de variable afin d'y ajouter le texte ligne par ligne
                my $texteProfond="";
					
					#boucle parcourant chaque ligne de texte du fichier
					while (my $ligne=) 
						{
						#condition excluant des éléments présentas dans les lignes de texte
						if (($ligne!~/[<>\|]/))
							{
							#condition excluant des éléments présentas dans les lignes de texte
							if (($ligne!~/^(\s|\n|Le Monde|Journaliste|Suivre|Aller|Lire|Suivre|\d\d.\d\d.\d\d\d\d|\/|\]|\}|\{|\\|require|Découvrir|Article sélectionné| la matinale|La sélection du|Voir aussi|Photo(s)?|Texte|(\()?function.|sdk.|Image|Rejouer|Accédez|GMURZYNSKA.|stall.|\"|\'|initCharts\)|\$.|if|Highcharts.|Réagir|Classer|Email|Partager)/))
								{
								#condition cherchant a eviter(supprimer) les doublons et a enregistrer dans
								#le fichier resultat les balises et le contenu du compteur d'articles, du 
								#titre et de la description
								if (!(exists  $dico2{$ligne})) 
									{
								    $dico2{$ligne} = 1;
								    print OUT3 "$ligne\n";
									}
							

								}
							} 
						}
					#fermeture des fichiers
					print OUT3 "\n*************************************************************\n";
					close FIC2;
				close OUT3;
				}
       		}
		}
	}
#######################################################################################
#SECTION DU SCRIPT EXCLUSIVE DE BAO2 2/2
#######################################################################################
#fonction pour obtenir le fichier etiqueté
sub etiquetage
	{
	#appel des arguments donnés à la fonction
	my ($titr, $descript, $numeroDerniereRubriq) = @_; 

	#section pour le TITRE
	open(TMP, ">:encoding(utf8)", "TEMPtitre.txt");
	#enregistrement dans un fichier temporaire du contenu de la variable
	print(TMP $titr); 
	close(TMP);
	#appel du logiciel Treetagger
	system("perl tokenise-utf8.pl TEMPtitre.txt | treetagger/cmd/tree-tagger-french >> articlesEtiquettes/$numeroDerniereRubriq-titre.txt");#system est une fonction dans perl qui permet d'appeller un autre programme que perl; ATTENTION, le prog appelle est .exe sous win mais pas sous linux
	# -token -lemma -no-unknown french.par
	system("perl treetagger2xml-utf8.pl articlesEtiquettes/$numeroDerniereRubriq-titre.txt utf-8"); 
	#par défaut le prog treetagger2xml-utf8.pl enregistre le résultat dans un fichier 017titre_tag.txt.xml
	open (TMP2, "<:encoding(utf8)", "articlesEtiquettes/$numeroDerniereRubriq-titre.txt.xml");
	my $titr_tag="";
	#on lit la premiere ligne de meta xml pour du beurre car elle ne nous interesse pas
	my $ligne = ; 
	#on lit le fichier et a chaque fois qu'on rencontre une ligne on l'ajoute a la variable $titr_tag
	while(my $ligne = <TMP2>)
		{
		$titr_tag = $titr_tag.$ligne;
		}
	close TMP2;

	#section pour la DESCRIPTION
	open(TMP, ">:encoding(utf8)", "TEMPdescription.txt");
	print(TMP $descript); 
	#enregistrement dans un fichier temporaire du contenu de la variable
	close(TMP);
	#appel du logiciel Treetagger
	system("perl tokenise-utf8.pl TEMPdescription.txt | treetagger/cmd/tree-tagger-french >> articlesEtiquettes/$numeroDerniereRubriq-description.txt") ;#system est une fonction dans perl qui permet d'appeller un autre programme que perl; ATTENTION, le prog appelle est .exe sous win mais pas sous linux
	system("perl treetagger2xml-utf8.pl articlesEtiquettes/$numeroDerniereRubriq-description.txt utf8"); #par défaut le prog treetagger2xml-utf8.pl enregistre le résultat dans un fichier 017titre_tag.txt.xml
	open (TMP2,"<:encoding(utf8)", "articlesEtiquettes/$numeroDerniereRubriq-description.txt.xml");
	my $descript_tag="";
	#on lit la premiere ligne de meta xml pour du beurre car elle ne nous interesse pas
	my $ligne = <TMP2>; 
	#on lit le fichier et a chaque fois qu'on rencontre une ligne on l'ajoute a la variable $descript_tag
	while(my $ligne = <TMP2>)
		{
		#on prend pas en compte les sauts de ligne
		$descript_tag = $descript_tag.$ligne; 
		}
	close TMP2;

	return($titr_tag, $descript_tag);
	}


#----------------END-Definition-Fonction---------------
									
								

En utilisant le logiciel Treetagger dans notre script nous obtenons les fichiers résultats suivants: