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

Après avoir réalisé l'extraction des balises titres et descriptions à l'aide l'algorithme de la Boîte à Outils 1, des rubriques Culture, Europe et Société nous arrivons donc à la Boîte à Outils 2. La deuxième boîte à outils permet d'étiquetter les fichiers produits par la BAO1. Cette partie de code est à ajouter sous la fonction de nettoyage de la boîte à outils 1.

Pour ce faire, nous utilisons deux techniques, Treetagger et Cordial. Cordial produit en sortie un fichier texte avec 3 colonnes (forme, lemme, catégorie). Treetagger produit en sortie un fichier XML et permet d'étiqueter les contenus textuels des fils RSS juste après leur extraction

Partie TreeTagger

Voici le code pour la fonction d'étiquettage ajouté sous la fonction nettoyage :

	                    
			------------------------- TREETAGGER EN PERL ---------------------------

			#/usr/bin/perl
			<<DOC;
			JANVIER 2018
			 usage : perl parcours-arborescence-fichiers repertoire-a-parcourir rubrique
			 Par exemple : perl parcours-arborescence-fichiers-2018.pl 2017 3208
			 Le programme prend en entrée le nom du répertoire contenant les fichiers à traiter et le "nom" de la rubrique à traiter
			DOC
			#-----------------------------------------------------------
			my $rep="$ARGV[0]";
			my $rubrique="$ARGV[1]";
			my%dico;
			open(FILEOUT, ">:encoding(utf8)", "sortie_$rubrique.txt");
			open(FILEOUT2, ">:encoding(utf8)", "sortie_$rubrique.xml");

			# on s'assure que le nom du répertoire ne se termine pas par un "/"
			$rep=~ s/[\/]$//;

			my $codage="utf-8";

			print FILEOUT2 "<?xml version=\"1.0\" encoding=\"$codage\" ?>\n";
			print FILEOUT2 "<PARCOURS>\n";
			print FILEOUT2 "<NOM> Audrey GOMBAULT, 2017-2018</NOM>\n";
			print FILEOUT2 "<FILTRAGE>\n";

			#----------------------------------------
			&parcoursarborescencefichiers($rep);	# on lance la récursion.... et elle se terminera après examen de toute l'arborescence

			print FILEOUT2 "</FILTRAGE>\n";
			print FILEOUT2 "</PARCOURS>\n";
			close(FILEOUT2);

			#----------------------------------------
			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 "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
						&parcoursarborescencefichiers($file);	#recurse!
						print "<FIN REPERTOIRE> ==> ",$file,"\n";
					}
					if (-f $file) {
			            if ($file =~ m/$rubrique.+\.xml$/) {
			                print "<",$i++,"> ==> ",$file,"\n";
			                my $texte="";
			                open(FILEIN, "<:encoding($codage)", $file);

			                while (my $ligne=<FILEIN>) {
			                    chomp $ligne;
			                    $ligne =~ s/\r//g;
			                    $texte = $texte . $ligne ;
			                    #print $ligne;
			                }
			                $texte =~ s/> +</></g;
			    						$texte =~ s/&#38;#39;/'/g;
			                while ($texte =~ m/<item>.*?<title>(.+?)<\/title>.*?<description>(.+?)<\/description>.*?<\/item>/g){
			                    my $titre = $1;
			                    my $description=$2;
			                    #print $titre;
			                    #$description =~ s/&lt;.+?&gt;$//g;
			                    if (!(exists $dico{$titre})){

			                        my ($titre_propre,$description_propre) = &nettoyage($titre,$description);
			                        print FILEOUT "§$titre_propre\n$description_propre\n\n";
			                        $compteurItem++; #va nous permettre de savoir combien d'item nous avons


			                        my ($xmltitre, $xmldescription) = &etiquette($titre_propre,$description_propre);
			                        #on attribue au valeurs xml_titre et xml_description le résultat du passage de titre_propre et description_propre
			                        print FILEOUT2 "<item id=\"$compteurItem\"><titre>$xmltitre</titre>\n<description>$xmldescription</description></item>";

			                        $dico{$titre}=1;

			                        }
			                }
			                close FILEIN;
			            }
			        }
					}

			}
			#----------------------------------------------

			sub nettoyage {
			    my $var1 = shift(@_);
			    my $var2 = shift(@_);
			    $var1=~s/&lt;.+?&gt;//g;
			    $var1.=".";# nettoyage à compléter...
			    $var2=~s/&lt;.+?&gt;//g; # nettoyage à compléter...
			    return $var1,$var2 ;
			}

			sub etiquette {

			my $var3 = shift(@_); #$_[0] # on indique que la fonction va prendre deux variables qu'on appelera entre paranthèses dans le script plus haut
			my $var4 = shift(@_); #$_[1]

			open my $f1, ">:encoding(utf8)", "titre.txt" ;
			open my $f2, ">:encoding(utf8)", "description.txt" ;
			print $f1 $var3;
			print $f2 $var4;
			close $f1;
			close $f2;


			# On appelle les programmes que l'on souhaite appliqué sur les fichiers qui seront créés par la fonction "arborescence fichier"

			# Préparation
			system("perl  tokenise-utf8.pl titre.txt | ./tree-tagger-MacOSX-3.2/bin/tree-tagger -token -lemma -no-unknown french-utf8.par > titre_etiquete.txt");
			  #on découpe en token le fichier de titre et on ajoute le résultat à titre_etiquete.txt qui est vide actuellement
			system ("perl treetagger2xml-utf8.pl titre_etiquete.txt utf8"); #FICHIER CREE, le fichier de titre etiquete est maintenant etiquete
			open my $f1, "<:encoding(utf8)", "titre_etiquete.txt.xml"; # $f1 est le fichier d'entree
				my $concat=""; # concat est le fichier de sortie
				my $ligne = <$f1>;
				while (my $ligne = <$f1>) {
				   $concat = $concat . $ligne ; # on ajoute à chaque fois le contenu de du nouveau passage dans le programme
				}
			close $f1;

			# Préparation
			system("perl  tokenise-utf8.pl description.txt | ./tree-tagger-MacOSX-3.2/bin/tree-tagger -token -lemma -no-unknown french-utf8.par > description_etiquete.txt");
			  # on fait pareil pour la description
			system ("perl treetagger2xml-utf8.pl description_etiquete.txt utf8"); #FICHIER CREE
			open my $f2, "<:encoding($codage)", "description_etiquete.txt.xml";
				my $concat2="";
				my $ligne = <$f2>;
				while (my $ligne = <$f2>) {
				   $concat2 = $concat2 . $ligne ;
				}
			close $f2;

			return $concat, $concat2;
			}
			# segmenter le fichier avant de l'envoyer à cordial, d'où l'utilité de tokenizer
			#perl tokenise-utf8.pl texteaetiqueter.txt | ./tree-tagger.exe(mac) french-utf8.par -lemma -token -no-unknown > resultat-token.txt
			# attention aux quotes dans le programme de tokenisation

			# perl treetagger2xml-utf8.pl resultat-token.txt "utf8"
			# nécessité de unicode string library



                      
                

les fichiers XML produits contiennent des lignes vides qu'il a fallut retirer. Pour ce faire, nous avons utilisé le "find and replace" d'Oxygen, en remplaçant les occurrences de (\n)* par \n (! attention à bien cocher "expressions régulières" et décocher "boucler la recherche" !)

Il faut également remplacer les "&amp" en "&amp;" !!

Une fois cela fait, nos fichiers sont prêts pour la BAO 3 !!

PARTIE CORDIAL

Avec le résultat .txt de l'extraction des titres et descriptions nous allons procéder à leur étiquetage via le logiciel Cordial qui étiquette différemment de Treetagger. Cordial ne prenant que des entrées en ISO ils nous a fallut convertir les fichiers d'abord et une fois obtenu les rebasculer en UTF8.

Voici les résultats :

Cordial

haut de page