La BàO2 est une extension de la BàO1 qui permet d'extraire l'information textuelle des fils RSS. Mais la BàO2 va plus loin que ça ! Grâce à elle, on pourra effectuer l'étiquetage gramatical des données récupérées, c'est-à-dire, fournir le lemme et la catégorie grammaticale de chaque mot trouvé dans les textes.

Les programmes capables d'effectuer l'étiquetage grammatical sont souvent compliqués et coûteux. Pour cette étape du projet, notre but consiste seulement à lancer un de ces programmes, notamment TreeTagger, sur les données que l'on extrait.

De plus, nous allons organiser la sortie par rubrique. Pour chaque rubrique trouvée dans les fichiers RSS, on créera un flux de sortie différent.

  • Objectifs
  • - parcourir l'arborescence des fichiers RSS donnée par l'utilisateur, répérer le contenu des articles (comme dans la BàO1) et les noms des rubriques
    - étiqueter les articles avec Treetagger
    - ranger les résultats de l'extraction et de l'étiquetage par rubrique et les enregistrer en format txt et xml

  • Qu'y a-t'il dans la boîte ?
  • En dehors de ce que l'on a appliqué dans la BàO2, nous allons utiliser :

  1. TreeTagger, le programme d'étiquetage grammatical
  2. Tokenise-utf8.pl, un outil de tokenisation pour séparer les mots des textes
  3. Treetagger2xml-utf8.pl, un programme qui convertit la sortie de TreeTagger en XML
  • Comment faire ?
  1. Repérer la rubrique
  2. Comme effectué dans la BàO2, on peut le faire de deux manières différentes :

    Soit on lit la totalité de chaque fichier ligne par ligne puis on trouve la ligne nécessaire grâce à une expression régulière :

    while (my $ligne=<FILEIN>){
    
    chomp($ligne);
    $ligne=~ s/> *?</></g;
    $texte.=$ligne;
    	}
    #Une expression regulière pour trouver des lignes contenant la rubrique et les données de publication				
    $texte=~/<channel>.+?<title>(.+?)<\/title>.+?<pubDate>(.+?)<\/pubDate>/;
    my $rub=$1;
    my $donnees=$2;
    #...}
    

    Soit on utilise Perl XML::RSS et on localise le noeud contenant le nom de la rubrique par la méthode de cette bibliothèque :

    my $rss=new XML::RSS;
    $rss->parsefile($file);
    #On récupère le nom de la rubrique et les données de publication en définissant le chemin vers les noeuds correspondants
    my $rub=$rss->{'channel'}->{'title'};
    my $donnees=$rss->{'channel'}->{'pubDate'};
    

    Mais cela ne suffit pas. La ligne que l'on vient de récupérer est initialement sous la forme :

    <title>Le Monde.fr : à la Une</title>

    On doit extraire le nom exact de la rubrique et le modifier afin qu'il puisse servir de nom de dossier ou de fichier :

    $rub=~s/é/e/gi;
    $rub=~s/è/e/gi;
    $rub=~s/ê/e/gi;
    $rub=~s/à/a/gi;
    $rub=~ s/( - )?Le *?Monde *\. *?fr *:? *//gi;
    $rub=~ s/ /_/g;
    $rub=~ s/,//;
    $rub=uc($rub);
    

    Voici le résultat : A_LA_UNE

  3. Gérer la sortie
  4. Maintenant on peut organiser l'espace où l'on gardera tout nos résultats. D'abord, on crée un répertoire RESULTATS dans lequel on va stocker tout nos fichiers de sortie :

    mkdir("RESULTATS");
    

    Après avoir répéré la rubrique du fichier, on vérifie si cette rubrique apparaît pour la première fois. Si c'est le cas, on crée un répertoire portant le nom de la rubrique dans le répertoire RESULTATS :

    if (!(exists($dictionnairedesrubriques{$rub}))) {
    #On l'ajoute au tableau associatif des rubriques
    $dictionnairedesrubriques{$rub}++;
    #...on crée un sous-répertoire correspondants dans le repertoire de sortie
    mkdir ("RESULTATS/$rub");
    #...}
    

    A l'intérieur de ce répertoire, on crée trois fichiers de sortie portant chaqu'un le nom de la rubrique. Un fichier sera pour la sortie texte brut, par exemple sortA_LA_UNE.txt ; le deuxième pour la sortie xml, soit sortA_LA_UNE.xml et le troisième pour le résultat d'étiquetage TreeTagger, soit sortA_LA_UNE.ttg.xml :

    open (FILEOUT_XML,">:encoding($encodagexml)","RESULTATS/$rub/sort$rub.xml") or die "pb ouverture fichier $!";
    open (FILEOUT_TXT,">:encoding($encodagetxt)","RESULTATS/$rub/sort$rub.txt") or die "pb ouverture fichier $!";
    open (FILEOUT_TTG,">:encoding($encodagexml)","RESULTATS/$rub/sort$rub.ttg.xml") or die "pb ouverture fichier $!";
    

    Dans les fichiers au format .xml, on écrit le préambule xml. C'est précisément pour cette raison que l'on doit distinguer la première apparition de chaque rubrique. Si on ne procède pas ainsi, à chaque fois que l'on va enregistrer une nouvelle portion des données, on mettera le préambule dans le ficher de résultats !

    print FILEOUT_XML "<?xml version=\"1.0\" encoding=\"$encodagexml\" ?>\n";
    print FILEOUT_XML "<PARCOURS>\n<NOM>Denis, Nadel</NOM>\n<FILTRAGE>\n";
    
    print FILEOUT_TTG "<?xml version=\"1.0\" encoding=\"$encodagexml\" ?>\n";
    print FILEOUT_TTG "<PARCOURS>\n<NOM>Denis, Nadel</NOM>\n<ETIQUETAGE>\n";
    

    Dans le cas où la rubrique que l'on vient de repérer dans un fichier n'est pas nouvelle, on ouvre les fichiers de sortie correspondants déjà existants pour y ajouter les données que l'on va extraire puis étiqueter.

  5. Etiqueter les données
  6. On lance la fonction d'etiquetage sur le titre et le contenu du chaque article que l'on trouve dans le fichier d'entrée :

    $titre=&nettoietexte($titre);
    $description=&nettoietexte($description);
    

    Cette fonction, qui s'initialise en bas, sauvegarde le texte extrait dans un fichier temporaire :

    sub etiqttg {
    
    my ($texte)=@_;
    #On ouvre un fichier temporaire pour formater l'entrée de Treetagger
    open (TMPFILE,">:encoding(utf-8)", "texteaetiqueter.txt");
    
    #On y stocke notre texte à etiquetter
    print TMPFILE $texte,"\n";
    #...}
    

    Puis, elle lance le programme de tokenisation dont la sortie est rédirigée à TreeTagger. Les données étiquetées par le dernier sont stockées dans un fichier toujours temporaire, treetagger.txt :

    system("perl tokenise-utf8.pl $tmptag | ./tree-tagger french-par-linux-3.2-utf8.bin -lemma -token -no-unknown -sgml > treetagger.txt");
    

    Voici venu le moment de faire marcher le programme de conversion en xml. Il prend comme argument le fichier treetagger.txt...

    system("perl ./treetagger2xml-utf8.pl treetagger.txt $encodagexml");
    

    ...et rend un fichier appelé tretagger.txt.xml dans lequel à chaque mot correspond un noeud "élément" ayant l'allure suivante :

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

    Il ne reste qu'à lire ce nouveau fichier ligne par ligne et à conserver le résultat dans notre sortie pour les données étiquetées.

  7. Enregistrer les résultats
  8. L'impression de sortie dans les fichiers correspondants ne pose pas de problème, elle se fait dans la même boucle que celle où l'on crée les fichiers.

    Par contre, pour mettre les balises fermantes on se trouve devant le même souci que celui du préambule : il ne faut les imprimer qu'une seule fois !
    Pour cette raison, en fin du programme on parcourt tous les noms des rubriques, on ouvre les fichiers en format xml et on y met les balises :

    #Pour chaque rubrique du tableau associatif qui a été construite par la fonction...
    my @liste=keys(%dictionnairedesrubriques);
    foreach my $rub(@liste) {
    	# on ouvre ses fichiers de sortie en format xml
    	my $output1="RESULTATS/$rub/sort$rub.xml";
    	my $output3="RESULTATS/$rub/sort$rub.ttg.xml";
    	open (FILEOUT_XML,">>:encoding($encodagexml)",$output1) or die "pb ouverture fichier $!";
    	open (FILEOUT_TTG,">>:encoding($encodagexml)",$output3) or die "pb ouverture fichier $!";
    
    	#et on y met les balises fermantes
    	print FILEOUT_XML "</FILTRAGE>\n</PARCOURS>";
    	print FILEOUT_TTG "</ETIQUETAGE>\n</PARCOURS>";}
    exit;	}
    

    Voilà pour la BàO2 !

    L'arborescence finale :

    Pour télécharger les scripts de la BàO2 cliquez ici puis, .


 

Charlène DENIS & Larisa NADEL