[Boîtes à outils]


  • Présentation
  • Boîte à outils n°1
  • Boîte à outils n°2
  • Boîte à outils n°3
  • Analyses

  • Boîte à outils n°1 - parcours arborescence | extraction | étiquetage


    1. Premier script qui dans un premier temps parcours l'arborescence; puis extrait l'ensemble du contenu situé entre les balises "Titre" et "Description" dans deux fichiers distinct: l'un au format XML l'autre au format TXT et qui étiquette grâce au tokeniser le contenu de sorte qu'un mot soit associé à sa catégorie.

            
              

    #/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/&#39;/'/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; }

    >__Pour cette première étape on utilise un premier script en perl qui va d'abord définir deux sorties, une au format TXT et l'autre au format XML. Ce programme va prendre comme argument un dossier qu'on appellera "arborescence" et qui est l'ensemble des fils RSS du journal le monde de l'année 2016 ainsi qu'une rubrique qu'on aura choisis.

    >__Ensuite il va parcourir l'ensemble de cette arborescence afin d'extraire toutes les parties situées entre les balises <Titre> et <Description> parmi tous les fichiers d'une rubrique comme par exemple "A la une".

    >__Une fois extraits, ces fichiers XML et TXT vont etre étiquetés par deux outils différent, le premier sera tree-tagger (pour la sortie XML) et le second sera Cordial (pour la sortie TXT). Le script est ici utilisé pour l'étiquetage de l'arborescence 2016 et par la suite les sorties seront étiqueté de sorte qu'un mot soit associé à sa catégorie et son lemme. Les deux sorties réalisés par ce script serviront aux deux outils mentionnés: Tree tagger et Cordial mais l'outil Cordial n'utilisera que la sortie .TXT rendu par l'étiquetage fait par Tree Tagger.



    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