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 :

								
#!/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); 
	}
}
}