1.png BaO.png 3.png 4.png 5.png


Boîte à Outils 1 - parcours / extraction / étiquetage



			
#/usr/bin/perl

#-1-------------------------------------------------------------------------------

my $rep="$ARGV[0]";
my $type="$ARGV[1]";
my %dico;
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise une variable contenant le flux de sortie
#----------------------------------------
mkdir "output";
my $output1=".\/output\/$type.xml";
my $output2=".\/output\/$type.txt";
#----------------------------------------
open FILEOUT,">>:encoding(utf8)",$output1;
if (!open (FILEOUT,">:encoding(utf8)",$output1)) { die "Pb a l'ouverture du fichier $output1"};
open my $out, ">>:encoding(utf8)", $output2;

print FILEOUT "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Mekki Jade</NOM>\n";
print FILEOUT "<FILTRAGE>";

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

print FILEOUT "</FILTRAGE>\n";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
close $out;
exit;
#-------------------------------------------------------------------------------

#-2-----------------------------------------------------------------------------
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 =~ /^\.\.?$/; # if fichier_nom[0]==".": continue (python)
  $file = $path."/".$file; # os.path.join(repertoire/nom_fichier)
  if (-d $file) { # interrogation de la nature du fichier
    print "<NOUVEAU REPERTOIRE> --> \t$file\n";
    &parcoursarborescencefichiers($file);
      #recursivité, on rappelle la fonction dans la foncion si ce n'est pas un fichier
      # descente dans l'arborescence
    print "<FIN REPERTOIRE> --> \t$file\n";
   }
  if (-f $file) {
        #si c'est un fichier contenant $type : 3208.xml
        if ($file =~ /$type.+\.xml/) {
          open my $input, "<:encoding(utf8)" ,$file;
          my $texte = "";
          while (my $ligne = <$input>) {
            chomp $ligne;
            $ligne =~ s/\r//g;
            $texte = $texte . $ligne ; # $text.=$ligne
              # print $texte;
           }
            # Nettoyage du texte
          	$texte =~ s/> +</></g;
            # print $texte;
          	$texte =~ s/&#39;/'/g;
          	$texte =~ s/xE([0-9])//g;
            # print $texte;
          while ($texte =~ /<item>(<link>(.+?)<\/link>)?<title>(.+?)<\/title>(<link>(.+?)<\/link>)?<description>(.+?)<\/description>/g){
              my $titre=$3.".";
            my $description=$6;
              $description =~ s/<.+?>//g;
              # print "\n",$titre;
              # print "\n",$description,"\n";
            if (!(exists $dico{$titre})) {
              #---------------------------------
              # on étiquète la sortie XML (fichiers .txt qui deviennent .xml)
              # 1. segmentation
              # 2. étiquète
              # 3. convertion XML
            my ($xmltitre, $xmldescription) = &etiquette ($titre,$description);
              print $out "$titre\n"; # on imprime le titre
              print $out "$description\n\n"; # on imprime la description
              print FILEOUT "<item><titre>$xmltitre</titre><description>$xmldescription</description></item>\n";
              $dico{$titre} = 1;
              #print $DUMPFULL1;

            }
          }
      close $input1;
      close $input2;
      }
    }
  }
}
#-------------------------------------------------------------------------------

#-3-----------------------------------------------------------------------------
sub etiquette {

my $var1 = shift(@_); #$_[0]
my $var2 = shift(@_); #$_[1]

my $output3=".\/output\/titre.txt";
my $output4=".\/output\/description.txt";

open my $f1, ">:encoding(utf8)", $output3;
open my $f2, ">:encoding(utf8)", $output4;

print $f1 $var1;
print $f2 $var2;
close $f1;
close $f2;

system("perl  tokenise-utf8.pl ./output/titre.txt | ./tree-tagger -token -lemma -no-unknown french-oral-utf-8.par > ./output/titre_etiquete.txt");
system ("perl treetagger2xml-utf8.pl ./output/titre_etiquete.txt utf8"); #FICHIER CREE
open my $f1, "<:encoding(utf8)", "./output/titre_etiquete.txt.xml";
 my $concat="";
 my $ligne = <$f1>;
 while (my $ligne = <$f1>) {
 $concat = $concat . $ligne ;
 }
close $f1;
system("perl  tokenise-utf8.pl ./output/description.txt | ./tree-tagger -token -lemma -no-unknown french-oral-utf-8.par > ./output/description_etiquete.txt");
system ("perl treetagger2xml-utf8.pl ./output/description_etiquete.txt utf8"); #FICHIER CREE
open my $f2, "<:encoding(utf8)", "./output/description_etiquete.txt.xml";
 my $concat2="";
 my $ligne = <$f2>;
 while (my $ligne = <$f2>) {
 $concat2 = $concat2 . $ligne ;
 }
close $f2;


return $concat, $concat2;

# exit;
#-------------------------------------------------------------------------------

}
				
			


Cette première boîte à outils permet d'instancier différentes sorties, de parcourir l'arborescence et d'extraire le texte désiré. Par la suite ces outputs sont traités afin d'être étiquetés: pour chaque token (mot) nous obtenons sa catégorie morphosyntaxique et son lemme. Il est important de noter que la sortie .txt est étiquetée par le logiciel Cordial, la fonction "etiquette" ne traite donc que de la sortie .xml.

Tout d'abord le script ci-dessus Se structure en trois temps:

  1. Instanciation des données d'entrée et de sortie
  2. Définition de la fonction qui parcours l'arborescence (elle rappelle la fonction "etiquette")
  3. Définition de la fonction qui étiquette les fichiers de sortie




1. Première partie :

	➝ Lorsque nous lançons ce script nous devons donner 2 arguments :     ex 2016 3208
		1. Le répertoire que nous voulons parcourir
		2. La rubrique dont nous voulons extraire le texte

	➝ Instanciation des 2 fichiers de sortie :
		➝ texte brut
		➝ XML
		 ➝ Ecriture de l'entête normalisée du fichier XML

	➝ Appel de la fonction
		➝ Ecriture du texte extrait dans les fichiers de sortie

	➝ Fermeture des fichiers de sortie
		➝ Fermeture des balises ouvertes afin de normaliser l'écriture du fichier XML


2. Deuxième partie :

	➝ Définition de la fonction parcoursarborescencefichiers
		➝ Sélection du premier élément donné en argument : le répertoire <2016>
		➝ Descente de l'arboresence + test sur le type de chaque élément rencontré:
			➝ Si c'est un répertoire
				➝ Alors nous rappelons la fonction dans la fonction (qui est donc récursive)
				➝ Nous continuons de descendre l'arborescence afin de trouver un élément de type fichier
			➝ Si c'est un fichier
				➝ Lecture du fichier
				➝ Nettoyage du fichier
				➝ Recherche du texte à extraire
					➝ Nous stockons en mémoire tous les titres et les descriptions extraites
				➝ Appel de la fonction "etiquette" qui prend en argument les variables incrémentées précédemment
					➝ Ecriture de l'étiquetage retourné par la fonction:
						➝ Dans le fichier texte brut (descripteur : $out)
						➝ Dans le fichier XML (descripteur : FILEOUT )

3. Troisième partie :

	La fonction "etiquette" comprend une chaîne de traitement qui appelle des scripts perl afin de :
		➝ Segmenter le fichier : tokenise-utf8.pl
		➝ Etiqueter le fichier segmenté : tree-tagger
		➝ Convertir le fichier texte segmenté et étiqueté en fichier xml  : treetagger2xml-utf8.pl
		➝ Mémorisation de leur contenu dans $concat / $concat2
		➝ Retourne les variables $concat et $concat3 : écriture dans les fichiers de sortie de la fonction parcoursarborescencefichiers

			


Nous pouvons noter l'emboîtement des fonctions qui peuvent elles-mêmes appeler des éléments extérieurs :

  1. parcoursarborescencefichiers est récursive
  2. parcoursarborescencefichiers appelle "etiquette"
  3. etiquette appelle tokenise-utf8.pl
  4. etiquette appelle tree-tagger



Ainsi les fichiers de sortie se présentent de la sorte :

1. sortie .xml étiquetée par Tree Tagger:

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<document>
	<article>
		<element><data type="type">DET:def</data><data type="lemma">le</data><data type="string">Le</data></element>

		<element><data type="type">ADJ</data><data type="lemma">diplomate</data><data type="string">diplomate</data></element>

		<element><data type="type">NOM</data><data type="lemma">Kyriakos</data><data type="string">Kyriakos</data></element>

		<element><data type="type">NOM</data><data type="lemma">Amiridis</data><data type="string">Amiridis</data></element>

		<element><data type="type">AUX:cond</data><data type="lemma">avoir</data><data type="string">aurait</data></element>

		<element><data type="type">AUX:pper</data><data type="lemma">être</data><data type="string">été</data></element>

		<element><data type="type">VER:pper</data><data type="lemma">tuer</data><data type="string">tué</data></element>

		<element><data type="type">NOM</data><data type="lemma">lundi</data><data type="string">lundi</data></element>

		<element><data type="type">PRP</data><data type="lemma">par</data><data type="string">par</data></element>

		<element><data type="type">DET:ind</data><data type="lemma">un</data><data type="string">un</data></element>

		<element><data type="type">ADJ</data><data type="lemma">policier</data><data type="string">policier</data></element>

		<element><data type="type">NOM</data><data type="lemma">brésilien</data><data type="string">brésilien</data></element>

		<element><data type="type">NAM</data><data type="lemma">,</data><data type="string">,</data></element>

		<element><data type="type">PRO:rel</data><data type="lemma">qui</data><data type="string">qui</data></element>

		<element><data type="type">VER:pres</data><data type="lemma">entretenir</data><data type="string">entretient</data></element>

		<element><data type="type">DET:ind</data><data type="lemma">un</data><data type="string">une</data></element>

		<element><data type="type">NOM</data><data type="lemma">liaison</data><data type="string">liaison</data></element>

		<element><data type="type">PRP</data><data type="lemma">avec</data><data type="string">avec</data></element>

		<element><data type="type">DET:pos</data><data type="lemma">son</data><data type="string">son</data></element>

		<element><data type="type">NOM</data><data type="lemma">épouse</data><data type="string">épouse</data></element>

		<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>

		<element><data type="type">DET:dem</data><data type="lemma">ce</data><data type="string">Ce</data></element>

		<element><data type="type">ADJ</data><data type="lemma">dernier</data><data type="string">dernier</data></element>

		<element><data type="type">NOM</data><data type="lemma">s’est</data><data type="string">s’est</data></element>

		<element><data type="type">VER:pper</data><data type="lemma">livrer</data><data type="string">livré</data></element>

		<element><data type="type">PRP</data><data type="lemma">à</data><data type="string">à</data></element>

		<element><data type="type">DET:def</data><data type="lemma">le</data><data type="string">la</data></element>

		<element><data type="type">NOM</data><data type="lemma">police</data><data type="string">police</data></element>

		<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>

	</article>
</document>


2. sortie .txt non étiquetée qui le sera par le logiciel Cordial :

#VivreAvec : Bâtir sur le néant.
Nous avons voulu donner la parole à plusieurs de nos journalistes qui ont participé à la couverture des attentats du 22 mars, afin d’interroger la manière dont nous écrivons une « grammaire des attentats ».

Trois humoristes racontent leur succès post-attentats sur Internet.
L’auteur belge de la pièce « Djihad » a échangé avec les internautes du Monde.fr sur le rôle des artistes, et de l’humour, dans ce climat de la menace terroriste.

Après la mort d’un de leurs amis au Bataclan, ils organisent un festival en hommage.
#VivreAvec. Que peut faire le droit face à la menace terroriste ? Les mesures d’exception sont-elles efficaces ? Eléments de réponse avec la juriste Mireille Delmas-Marty.



			


Vous pouvez télécharger le script