#/usr/bin/perl
<<<DOC;
Jeuland Mathilde
JANVIER 2016
usage : perl parcours-arborescence-fichiers repertoire-a-parcourir
In: nom du repertoire contenant les fichiers à traiter
Out: Le programme construit en sortie un fichier structure contenant sur chaque ligne le nom du fichier et le resultat du filtrage :
<FICHIER><NOM>du fichier</NOM></FICHIER><CONTENU>du filtrage</CONTENU></FICHIER>
DOC</p>
#-----------------------------------------------------------
my $rep="$ARGV[0]"; #repertoire
my $type="$ARGV[1]"; #rubrique
my %dico;
# on s'assure que le nom du repertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# on initialise une variable contenant le flux de sortie
#----------------------------------------
mkdir "SORTIE";
my $sortie1=".\/sortie\/$type.xml";
my $sortie2=".\/sortie\/$type.txt";
open FILEOUT, ">>:encoding(utf8)",$sortie1;
if (!open (FILEOUT,">:encoding(utf8)",$sortie1)) { die "Pb a l'ouverture du fichier $sortie1"};
open my $out, ">>:encoding(utf8)", $sortie2;
print FILEOUT "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
print FILEOUT "<PARCOURS>\n";
print FILEOUT "<NOM>Mathilde Jeuland</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>";
print FILEOUT "</PARCOURS>\n";
close(FILEOUT);
close $out;
exit;
#----------------------------------------------
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 =~ /^\.\.?$/;
$file = $path."/".$file;
if (-d $file) {
print "<NOUVEAU REPERTOIRE> ==> ",$file,"\n";
&parcoursarborescencefichiers($file); #recurse!
print "<FIN REPERTOIRE> ==> ",$file,"\n";
}
if (-f $file) {
#si c'est un fichier contenant $type: Rubrique.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 ;
}
$texte =~ s/> +</></g;
$texte =~ s/'/'/g;
$texte =~ s/xE([0-9])//g;
while ($texte =~ /<item>(<link>(.+?)<\/link>)?<title>(.+?)<\/title>(<link>(.+?)<\/link>)?<description>(.+?)<\/description>/g){
my $titre=$3.".";
my $description=$6;
$description =~ s/<.+?>$//g;
if (!(exists $dico{$titre})) {
my ($xmltitre, $xmldescription) = &etiquette ($titre,$description);
print $out "$file\n";
print $out "$titre\n"; # on imprime le titre
print $out "$description\n\n"; # on imprime la description
print $out "--------------\n";
print FILEOUT "<item><titre>$xmltitre</titre><description>$xmldescription</description></item>\n";
$dico{$titre} = 1;
#print $DUMPFULL1;
}
}
close $input;
close $input2;
}
}
}
}
#----------------------------------------------
sub etiquette {
my $var1 = shift(@_); #$_[0]
my $var2 = shift(@_); #$_[1]
my $sortie3=".\/sortie\/titre.txt";
my $sortie4=".\/sortie\/description.txt";
open my $f1, ">:encoding(utf8)", $sortie3;
open my $f2, ">:encoding(utf8)", $sortie4;
print $f1 $var1;
print $f2 $var2;
close $f1;
close $f2;
system("perl tokenise-utf8.pl ./sortie/titre.txt | ./tree-tagger -token -lemma -no-unknown french-oral-utf-8.par > ./sortie/titre_etiquete.txt");
system ("perl treetagger2xml-utf8.pl ./sortie/titre_etiquete.txt utf8"); #FICHIER CREE
open my $f1, "<:encoding(utf8)", "./sortie/titre_etiquete.txt.xml";
my $concat="";
my $ligne = <$f1>;
while (my $ligne = <$f1>) {
$concat = $concat . $ligne ;
}
close $f1;
system("perl tokenise-utf8.pl ./sortie/description.txt | ./tree-tagger -token -lemma -no-unknown french-oral-utf-8.par > ./sortie/description_etiquete.txt");
system ("perl treetagger2xml-utf8.pl ./sortie/description_etiquete.txt utf8"); #FICHIER CREE
open my $f2, "<:encoding(utf8)", "./sortie/description_etiquete.txt.xml";
my $concat2="";
my $ligne = <$f2>;
while (my $ligne = <$f2>) {
$concat2 = $concat2 . $ligne ;
}
close $f2;
return $concat, $concat2;
# exit;
}
2. Voici deux extraits des sorties réalisées par ce script:
A] La sortie XML étiquetée grâce à l'appel de Tree tagger dans le script:
<?xml version="1.0" encoding="utf-8" ?>
<PARCOURS>
<NOM>Mathilde Jeuland</NOM>
<FILTRAGE>
<item>
<titre><document>
<article>
<element><data type="type">NOM</data><data type="lemma">Pixmania</data><data type="string">Pixmania</data></element>
<element><data type="type">PRP</data><data type="lemma">en</data><data type="string">en</data></element>
<element><data type="type">NOM</data><data type="lemma">redressement</data><data type="string">redressement</data></element>
<element><data type="type">ADJ</data><data type="lemma">judiciaire</data><data type="string">judiciaire</data></element>
<element><data type="type">PUN</data><data type="lemma">:</data><data type="string">:</data></element>
<element><data type="type">ADV</data><data type="lemma">ne</data><data type="string">ne</data></element>
<element><data type="type">VER:pres</data><data type="lemma">commander</data><data type="string">commandez</data></element>
<element><data type="type">ADV</data><data type="lemma">plus</data><data type="string">plus</data></element>
<element><data type="type">SENT</data><data type="lemma">!</data><data type="string">!</data></element>
</article>
</document>
</titre>
<description><document>
<article>
<element><data type="type">NOM</data><data type="lemma">SOSconso</data><data type="string">SOSconso</data></element>
<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>
<element><data type="type">NAM</data><data type="lemma">L'association</data><data type="string">L'association</data></element>
<element><data type="type">NAM</data><data type="lemma">Net-Litiges</data><data type="string">Net-Litiges</data></element>
<element><data type="type">VER:pres</data><data type="lemma">recevoir</data><data type="string">reçoit</data></element>
<element><data type="type">ADJ</data><data type="lemma">d'innombrables</data><data type="string">d'innombrables</data></element>
<element><data type="type">NOM</data><data type="lemma">protestation</data><data type="string">protestations</data></element>
<element><data type="type">PRP</data><data type="lemma">de</data><data type="string">de</data></element>
<element><data type="type">NOM</data><data type="lemma">client</data><data type="string">clients</data></element>
<element><data type="type">PRO:REL</data><data type="lemma">qui</data><data type="string">qui</data></element>
<element><data type="type">PUN</data><data type="lemma">,</data><data type="string">,</data></element>
<element><data type="type">VER:ppre</data><data type="lemma">avoir</data><data type="string">ayant</data></element>
<element><data type="type">VER:pper</data><data type="lemma">commander</data><data type="string">commandé</data></element>
<element><data type="type">PRP:det</data><data type="lemma">du</data><data type="string">des</data></element>
<element><data type="type">NOM</data><data type="lemma">objet</data><data type="string">objets</data></element>
<element><data type="type">PRP</data><data type="lemma">sur</data><data type="string">sur</data></element>
<element><data type="type">DET:ART</data><data type="lemma">le</data><data type="string">le</data></element>
<element><data type="type">NOM</data><data type="lemma">site</data><data type="string">site</data></element>
<element><data type="type">PRP</data><data type="lemma">de</data><data type="string">de</data></element>
<element><data type="type">NOM</data><data type="lemma">vente</data><data type="string">vente</data></element>
<element><data type="type">PRP</data><data type="lemma">en</data><data type="string">en</data></element>
<element><data type="type">NOM</data><data type="lemma">ligne</data><data type="string">ligne</data></element>
<element><data type="type">PRP</data><data type="lemma">de</data><data type="string">de</data></element>
<element><data type="type">NOM</data><data type="lemma">produit</data><data type="string">produits</data></element>
<element><data type="type">ADJ</data><data type="lemma">électronique</data><data type="string">électroniques</data></element>
<element><data type="type">NOM</data><data type="lemma">Pixamania</data><data type="string">Pixamania</data></element>
<element><data type="type">PUN</data><data type="lemma">,</data><data type="string">,</data></element>
<element><data type="type">ADV</data><data type="lemma">ne</data><data type="string">ne</data></element>
<element><data type="type">PRO:PER</data><data type="lemma">la|le</data><data type="string">les</data></element>
<element><data type="type">VER:pres</data><data type="lemma">recevoir</data><data type="string">reçoivent</data></element>
<element><data type="type">ADV</data><data type="lemma">pas</data><data type="string">pas</data></element>
<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>
</article>
</document>
</description>
</item>
B] La sortie TXT qui n'est pas étiquetée par ce script mais qui sera donnée au logiciel Cordial pour que celui-ci étiquette ces fichiers:
Pixmania en redressement judiciaire : ne commandez plus !.
SOSconso. L'association Net-Litiges reçoit d'innombrables protestations de clients qui, ayant commandé des objets sur le site de vente en ligne de produits électroniques Pixamania, ne les reçoivent pas.
Pour télécharger le script voici le lien:
--> SCRIPT
Pour obtenir les sorties XML sur lesquelles on va travailler:
--> XML
--> XML
--> XML