boîte à outils 2
Annotation du texte
Savoir plusParcours du répertoire arborescent, extraction du texte
RSS (« Really Simple Syndication ») est un des applications de XML, qui est généré automatiquement et régulièrement pendant la mise à jour d’un site web. Il comporte les titres et les résumés des dernières infos, qui nous permet de suivre les nouvelles d’un site. Ici, on utilise l’ensemble des fils RSS de l’an 2019, recueilli par M. Fleury, comme notre corpus de travail.
La première méthode n’utilise que Perl et le RegExp. On trouve que les titres et leur description suivent l’élément « item ». Après avoir récupérer le contenu entre deux balises, on fait un petit nettoyage.
Néanmoins, pour que le script puisse traiter tous les fichiers en lançant une seule fois, on doit aussi utiliser l’idée de récursivité, qui nous permet de parcourir le corpus arborescent.
Dans mon script, à part le corps principal, j’ai créé trois sous-fonctions : la première sert à parcourir le corpus et trouver les fichiers RSS de la rubrique demandée; la 2e sert à extraire le texte; la 3e est pour le nettoyage.
4 rubriques sont traitées par ce script : "À la une"(3208), "International"(3210), "Economie"(3234) et "Technologies"(651865). Voici le script et les résultats.
#usr/bin/perl -w
<<DOC;
Votre Nom : Jianying LIU
JANVIER 2020
usage : perl BaO1.pl repertoire-a-parcourir rubrique
Le programme prend en entrée le nom du répertoire-racine contenant les fichiers
à traiter et le nom de la rubrique à traiter parmi ces fichiers
DOC
use strict;
use utf8;
#indiquer l'encodage de sortie dans le console
binmode(STDOUT, ":utf8");
my $rep = $ARGV[0]; #?guillemets?
$rep =~ s/[\/]$//; #[\/] choisir entre deux
my $rubrique = $ARGV[1];
#programme principal
#ouvrir le fichier txt et le fichier xml pour l'écriture
open(TXT, ">:encoding(utf8)", "sortie_$rubrique.txt");
open(XML, ">:encoding(utf8)", "sortiexml_$rubrique.xml");
print XML "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<corpus 2019>\n"; #écrire la tête du fichier xml
my $i = 1; #compteur pour le calcul total de fichiers rss traités
my $count_item = 1;
my %dico_titres = ();
&parcoursArbFic($rep);
print XML "</corpus 2019>\n";
close TXT;
close XML;
exit;
###############################################
sub parcoursArbFic {
my $path = shift(@_); #shift obligatoire
my @files = <$path/*>; #cette opération renvoie la liste des fichiers/répertoire dans ce répertoire, sans . et .. (donc pas besoin de tester et sauter), ordonné, avec chemin complet (donc pas besoin de concaténation pour obtenir le path
foreach my $file (@files) {
#if rep. recursif
if (-d $file) {
&parcoursArbFic($file);
}
#if file : open, chercher motif, ecrire sous-fonction
if (-f $file and $file =~ /$rubrique.+xml$/) {
print $i++," Traitement de : ",$file,"\n";
&ecritureFic($file);
}
}
}
#traitement sur un fichier rss cherché
sub ecritureFic{
#ouvrir le fichier RSS
my $fichier = shift(@_);
open(RSS, "<:encoding(utf8)", $fichier);
#lecture global du fichier
$/ = undef;
my $textelu = <RSS>;
close RSS;
#chercher motif avec RegExp
while ($textelu =~ /<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg){ #m multiple lines, on peut matcher plusieurs lignes,influencer ^ et $; s influence . qui peut matcher aussi \n maintenant
my $titre = $1;
my $description = $2;
#tester si ce titre existe déjà dans le dico_titre
if (! (exists $dico_titres{$titre})){ #!布尔值取反 存在 --> 不存在; exists fonctionne sur les clés
$dico_titres{$titre} = $description;
($titre, $description) = &nettoyage($titre,$description); #sans paranthèses, on n'arrive pas à ajouter le point à la fin de chaque titre, mais pourquoi??
#écrire le contenu dans deux fichiers
print TXT "$titre\n$description\n--------------------\n";
print XML "<item numero=\"$count_item\">\n<titre>$titre<\/titre>\n<description>$description<\/description>\n<\/item>\n"; #slash可以转义也可不转
$count_item++;
}
}
}
#nettoyer le contenu extrait du rss avec une sous-fonction
sub nettoyage {
my $titre = $_[0];
my $description = $_[1];
$titre=~s/^<!\[CDATA\[//; ##
$titre=~s/\]\]>$//; ##
$description=~s/^<!\[CDATA\[//; ##
$description=~s/\]\]>$//; ##
$description=~s/<.+?>//g;
$description=~s/&#39;/'/g;
$description=~s/&#34;/"/g;
$description=~s/ +/ /g; #supprimer les espaces abondantes successifs; le nettoyage manquant?
$titre=~s/<.+?>//g;
$titre=~s/&#39;/'/g;
$titre=~s/&#34;/"/g;
$titre=~s/([^?\.])$/$1\./g; #?ajouter un point à la fin de chaque titre####
return $titre,$description;
}
Annotation du texte
Savoir plusRécupération des patrons morphosyntaxiques
Savoir plus