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