Surface et profondeur avec le module XML::RSS
Ci-dessous le script filtrage-extraction-tag-modules.pl.
Téléchargement du programme.
Téléchargement des résultats :
- La sortie texte brut - SURFACE
- La sortie texte brut - PROFONDEUR
- La sortie étiquetée par TreeTagger - SURFACE
- La sortie étiquetée par TreeTagger - PROFONDEUR
- La sortie XML - SURFACE
- Et, en dehors du script (Cordial ne s'appelle pas en ligne de commande): une sortie étiquetée avec Cordial
#!/usr/bin/perl
#-*- encoding: utf-8 -*-
#- Ce script utilise les modules de traitement XMl de perl.
#- Il a été écrit pour Windows (voir les chemins des fichiers).
#- On considère que TreeTagger a été installé dans le même répertoire que ce script.
use XML::RSS;
use strict;
use warnings;
#déclaration des variables arguments
my $rep = $ARGV[0];
my $rubrique = $ARGV[1];
my %dico;
#vérification que le nom de répertoire ne finit pas par un /
$rep =~s/[\/]$//;
my $codage = 'utf-8';
# ------------------------------------------------------------------ initialisation des flux de sortie :
#sortie texte brut (surface)
mkdir "SORTIES";
my $output0 = ".\\SORTIES\\$rubrique-surface-texte-brut.txt";
if (!open(FILEOUT,"> $output0")) {die "Problème à l'ouverture du fichier $output0"};
close (FILEOUT);
#sortie texte étiqueté par Treetagger (surface)
my $output4 = ".\\SORTIES\\$rubrique-surface-texte-treetagger.xml";
if (!open(FILEOUT,"> $output4")) {die "Problème à l'ouverture du fichier $output4"};
close (FILEOUT);
#sortie XML
my $output1 = ".\\SORTIES\\$rubrique-surface-rss.xml";
if (!open(FILEOUT,"> $output1")) {die "Problème à l'ouverture du fichier $output1"};
close (FILEOUT);
#sortie XML étiquetée par Treetagger
#my $output2 = ".\\SORTIES\\$rubrique-surface-rss-treetagger.xml";
#if (!open(FILEOUT,"> $output2")) {die "Problème à l'ouverture du fichier $output2"};
#close (FILEOUT);
#sortie texte profond brut
my $output3 = ".\\SORTIES\\$rubrique-profondeur-texte-brut.txt";
if (!open(FILEOUT,"> $output3")) {die "Problème à l'ouverture du fichier $output3"};
close (FILEOUT);
#sortie texte profond étiqueté par Treetagger :
my $output5 = ".\\SORTIES\\$rubrique-profondeur-texte-treetagger.xml";
if (!open(FILEOUT,"> $output5")) {die "Problème à l'ouverture du fichier $output5"};
close (FILEOUT);
#sortie texte profond étiqueté avec Cordial :
# mkdir "PROFONDEUR-TEXTE-CORDIAL";
# pas d'output supplémentaire parce que l'étiquetage se fait en dehors de la chaîne de traîtement
# ---------------------------------------------------------------- écriture du début des fichiers XML :
open (OUT5, ">>:encoding($codage)", $output4);
print OUT5 '<?xml version="1.0" encoding="utf-8" standalone="no"?>';
print OUT5 "\n<root>\n";
close (OUT5);
open (OUT2, ">>:encoding($codage)", $output1);
print OUT2 '<?xml version="1.0" encoding="utf-8" standalone="no"?>';
print OUT2 "\n<root>\n";
close (OUT2);
#open (OUT3, ">>:encoding($codage)", $output2);
#print OUT3 '<?xml version="1.0" encoding="utf-8" standalone="no"?>';
#print OUT3 "\n<root>\n";
#close (OUT3);
open (OUT6, ">>:encoding($codage)", $output5);
print OUT6 '<?xml version="1.0" encoding="utf-8" standalone="no"?>';
print OUT6 "\n<root>\n";
close (OUT6);
# ---------------------------------------------------------------------------- traitement des fichiers :
# on lance la récursion.... et elle se terminera après examen de toute l'arborescence
&parcoursarborescencefichiers($rep);
# ---------------------------------------------------------------- écriture de la fin des fichiers XML :
open (FILEOUT,">>:encoding(utf-8)", $output1);
print FILEOUT "\n";
close(FILEOUT);
open (OUT2, ">>:encoding($codage)", $output1);
print OUT2 "\n</root>\n";
close OUT2;
#open (OUT3,">>:encoding($codage)", $output2);
#print OUT3 "\n</root>\n";
open(OUT5,">>:encoding($codage)", $output4);
print OUT5 "\n</root>\n";
close OUT5;
open (OUT6, ">>:encoding($codage)", $output5);
print OUT6 "\n</root>\n";
close OUT6;
exit;
#-------------------------------------------------------------------------------------
#définition de la fonction de parcours et de filtrage avec le module XML::RSS
sub parcoursarborescencefichiers {
my $path = shift(@_);
opendir(DIR, $path) or die "Impossible d'ouvrir $path: $!\n";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files){
next if $file =~ /^\.\.?$/;
next if $file =~ /^\._/;
next if $file =~ /^fil/;
$file = $path."/".$file;
#si c'est un dossier
if (-d $file){
print "==> ",$file,"\n";
&parcoursarborescencefichiers($file); # c'est là qu'est la récursivité
}
#si c'est un fichier
if (-f $file) {
#sélection des fichiers contenant la rubrique qui nous intéresse
if ($file =~ /$rubrique/){
#traitement des fichiers XML -- SURFACE --
if ($file =~/\.xml$/){
#ouverture du fichier xml
open (FIC, "<:encoding($codage)", $file);
#ouverture des fichiers de sortie
open (OUT, ">>:encoding($codage)", $output0);
open (OUT2, ">>:encoding($codage)", $output1);
print OUT2 "<file id=\"$file\">\n";
#open (OUT3, ">>:encoding($codage)", $output2);
open (OUT5, ">>:encoding($codage)", $output4);
print OUT5 "<file id=\"$file\">\n";
#création d'une nouvelle instance du module
my $rss=new XML::RSS;
#-------------------------------
#intialisation des variables dans lesquelles on va stocker le contenu du fichier xml
my $TEXTEDUFIL=""; # -> texte brut
my $TEXTEDUFILXML=""; # -> texte format xml
my $TEXTEDUFIL_TAG=""; # -> texte brut étiqueté treetagger
# my $TEXTEDUFILXML_TAG=""; # -> texte format xml étiqueté treetagger
#$TEXTEDUFILXML.="<file id=\"$file\">\n";
# $TEXTEDUFILXML_TAG.="<file id=\"$file\">\n";
#-------------------------------
#parsage du fichier xml
$rss->parsefile($file);
#initialisation d'un compteur
my $nbchampdescr=0;
#pour chaque élément de la liste items
foreach my $item(@{$rss->{'items'}}) {
#incrémentation du compteur
$nbchampdescr++;
#référence de l'article grâce au compteur
$TEXTEDUFILXML.="<article id=\"$nbchampdescr\">\n";
$TEXTEDUFIL_TAG.="\n<item>\n";
my $title= $item->{'title'}; # récupération du titre
my $title_tag=&etiquetage($title); # #etiquetage du titre
$title.="."; # ajout d'un point à la fin du titre
#remplissage des variables...
$TEXTEDUFIL.="$title\n"; # -> sortie texte brut
$TEXTEDUFIL_TAG.="\n<title>\n$title_tag\n</title>\n"; # -> sortie texte étiqueté avec TreeTagger
$TEXTEDUFILXML.="<title>\n"; # (balise)
$TEXTEDUFILXML.=$title; # -> sortie en xml
$TEXTEDUFILXML.="\n</title>\n"; # (balise)
#$TEXTEDUFILXML_TAG.="<title>\n"; # (balise)
#$TEXTEDUFILXML_TAG.=$title_tag; # -> sortie tagguée en xml
#$TEXTEDUFILXML_TAG.="</title>\n"; # (balise)
my $description= $item->{'description'}; # récupération de la description de l'article
$description=~s/\.<br.*$//; # suppression des lignes vides
$description=~s/<[^>]+>//g; # supression des balises
my $description_tag=&etiquetage($description); # etiquetage de la description
#remplissage des variables...
$TEXTEDUFIL.="$description\n\n"; # -> sortie texte brut
$TEXTEDUFIL_TAG.="\n<description>\n$description_tag\n</description>\n"; # -> sortie texte étiqueté avec TreeTagger
$TEXTEDUFIL_TAG.="</item>\n";
$TEXTEDUFILXML.="<description>\n"; # (balise)
$TEXTEDUFILXML.=$description; # -> sortie en xml
$TEXTEDUFILXML.="</description>\n"; # (balise)
#$TEXTEDUFILXML_TAG.="<description>\n$description_tag\n</description>\n";
#fermeture du fichier examiné
$TEXTEDUFILXML.="</article>\n";
close (FIC);
}
#-------------------------------
#écriture dans les fichiers de sortie...
print OUT $TEXTEDUFIL ;
print OUT2 $TEXTEDUFILXML;
print OUT2 "</file>\n";
#print OUT3 $TEXTEDUFILXML_TAG;
print OUT5 $TEXTEDUFIL_TAG;
print OUT5 "</file>\n";
#fermeture des fichiers de sortie
close (OUT);
close (OUT2);
#close (OUT3);
close (OUT5);
}
#traitement des articles dans les fichiers txt -- PROFONDEUR -- :
if ($file =~/\.txt$/){
# ouverture du fichier xml
open(FIC, "<:utf8", $file) || die "Impossible d'ouvrir le fichier.";
#ouverture des fichiers de sortie
open(OUT4, ">>:utf8", $output3);
open(OUT6, ">>:utf8", $output5);
# le texte est ramené sur une seule ligne
my $texte_profond="";
while (my $ligne = <FIC>) {
chomp $ligne;
#suppression des balises
$ligne =~ s/<[^>]*>//g;
$ligne =~ s/\s{3,30}/\n/g;
$ligne =~ s/\xA4/\n\n/g;
$texte_profond = $texte_profond . $ligne;
}
close FIC;
print OUT4 $texte_profond;
#etiquetage du texte de la profondeur
my $texteProfondTreetag = &etiquetage($texte_profond);
print OUT6 $texteProfondTreetag;
}
}
}
#-----------------------------------------------------------------------------------
#définition de la fonction d'étiquetage
sub etiquetage {
my ($texte) = @_;
open(TMP,">:encoding(utf8)","texteDuXml.txt");
print TMP $texte;
close TMP;
#étiquetage du texte avec TreeTagger en lignes de commande
system("perl tokenise-utf8.pl texteDuXml.txt | tree-tagger.exe -token -lemma -no-unknown TreeTagger\\lib\\french-utf8.par > texte_tag.txt");
system("perl treetagger2xml-utf8.pl texte_tag.txt utf8"); #résultat est contenu dans titre_tag.txt.xml
open(TMP2, "<:encoding(utf8)","texte_tag.txt.xml");
my $premiere_ligne=<TMP2>;
my $texte_tag = "";
while (my $ligne = <TMP2>) {
#chomp $ligne;
$texte_tag = $texte_tag . $ligne;
}
close TMP2;
return($texte_tag);
}
}
}