#/usr/bin/perl <<DOC; CARON Juliette REY Camille 2020 usage : perl bao2_carrey.pl repertoire-a-parcourir rubrique Le programme prend en entrée le nom du répertoire-racine contenant les fichiers à traiter et le nom de la rubrique à traiter parmi ces fichiers -> étiquetage TreeTagger & Talismane DOC #-------------------------------------------------------------------------------------------- use utf8; #récupération des arguments du programme my $rep="$ARGV[0]"; my $rubrique="$ARGV[1]"; my $i = 0; #le nom du répertoire ne doit pas se terminer pas par un "/" $rep=~ s/[\/]$//; #ouverture des fichiers de sortie open(OUT,">:encoding(utf8)","SORTIEBAO2/sortie-slurp_$rubrique.txt"); open(OUTTALISMANE, ">:encoding(utf8)", "SORTIEBAO2/sortie-talismane-$rubrique.txt"); open(OUTXML,">:encoding(utf8)","SORTIEBAO2/sortiexml-slurp_$rubrique.xml"); #écriture des premières lignes du fichier de sortie xml print OUTXML "<!--?xml version=\"1.0\" encoding=\"utf-8\" ?-->\n"; print OUTXML "<corpus2019>\n"; #initialisation du dico pour les doublons my @dico_des_titres; #---------------------------------------- &parcoursarborescencefichiers($rep); #parcours de l'arborescence avec une fonction recursive #---------------------------------------- #fermeture des fichiers print OUTXML "</corpus2019>\n"; close OUT; close OUTXML; close OUTTALISMANE; exit; #----------------------------------------- sub parcoursarborescencefichiers { my $path = shift(@_); #chemin du repertoire opendir(DIR, $path) or die "can't open $path: $!\n"; #ouverture repertoire (ou probleme) my @files = readdir(DIR); #lecture du contenu du repertoire closedir(DIR); #fermeture repertoire foreach my $file (@files) { #boucle sur les éléments du repertoire next if $file =~ /^\.\.?$/; $file = $path."/".$file; if (-d $file) { #si c'est un répertoire &parcoursarborescencefichiers($file); #recursif } if (-f $file) { #si c'est un fichier if ($file=~/$rubrique.+\.xml$/) { print $i++," Traitement de : ",$file,"\n"; open(FIC,"<:encoding(utf8)",$file); $/=undef; my $textelu; while (my $line = <FIC>) { #on continue à lire tant que c'est possible chomp $line; #supprimer le caractère de fin de ligne $textelu = $textelu . " $line";} close FIC; #initialisation du texte global my $titredescriptionglobal=""; while ($textelu =~/<item>.*?<title>(.+?)<\/title>.+?<description>(.+?)<\/description>/sg) { #R.E. pour récup. les 2 parties qui nous intéressent my $titre = $1; #on stocke les deux chaînes extraites dans des variables locales my $description = $2; if ( !(exists $dico_des_titres{$titre}) ) { #éviter les doublons $dico_des_titres{$titre}=$description ; #appel du sous-programme de nettoyage ($titre,$description)=&nettoyage($titre,$description); $titredescriptionglobal=$titredescriptionglobal.$titre."\n"; $titredescriptionglobal=$titredescriptionglobal.$description."\n"; #appel de la fonction d'étiquetage TreeTagger my ($titre_etiket,$description_etiket)=&etiquetageTREE($titre,$description); #écriture des résultats en sorties print OUT $titre,"\n"; print OUT $description,"\n\n"; print OUTXML "<item>\n<titre>$titre_etiket</titre>\n<description>$description_etiket</description>\n</item>\n"; } } #étiquetage talismane = aussi par appel d'une fonction (parce que c'est + cool) my $etiqTALIS = &etiquetageTALIS($titredescriptionglobal); #écriture en sortie print OUTTALISMANE "$etiqTALIS"; } } } } #------------------------------------------------------------- #------------------FONCTIONS---------------------------------- #------------------------------------------------------------- #FONCTION DE NETTOYAGE sub nettoyage { my $titre = $_[0]; my $description = $_[1]; #on remplace/supprime tous les éléments qui posent pb (surtout les car. transcodés) $titre=~s/^<!\[CDATA\[//; $titre=~s/\]\]>$//; $titre=~s/<.+?>//g; $titre=~s/'/'/g; $titre=~s/"/"/g; $titre=~s/$/\./g; $titre=~s/&/&/g; $description=~s/^<!\[CDATA\[//; $description=~s/\]\]>$//; $description=~s/<.+?>//g; $description=~s/'/'/g; $description=~s/"/"/g; $description=~s/&/&/g; return $titre,$description; } #---------------------------------------------- #FONCTION ETIQUETAGE TALISMANE sub etiquetageTALIS { my $y = shift @_; open (TALIS, ">:encoding(utf8)", "PROCESS/bao_test.txt" ); #on stocke les fichiers qui ne nous serviront plus à la fin du programme dans un dossier PROCESS print TALIS $y; close TALIS; system ("java -Xmx1G -Dconfig.file=TALISMANE/talismane-fr-5.0.4.conf -jar TALISMANE/talismane-core-5.1.2.jar --analyse --sessionId=fr --encoding=UTF8 --inFile=PROCESS/bao_test.txt --outFile=PROCESS/bao_test.tal"); #le dossier TALISMANE contient tous les fichiers/applications nécessaires pour effectuer l'étiquetage avec TALISMANE my $temp; { local $/=undef; open(TEMP, "<:encoding(utf8)", "PROCESS/bao_test.tal"); $temp = <TEMP>; close TEMP; } return $temp; } #---------------------------------------------- #FONCTION ETIQUETAGE TREETAGGER sub etiquetageTREE { my $titre = $_[0]; my $description = $_[1]; #-----------------etiquetage titre----------------------------- my $titre_etik_xml; open (ETI, ">:encoding(utf8)", "PROCESS/temporaire.txt"); print ETI $titre ; close ETI; system("perl -f tokenise-utf8.pl -f PROCESS/temporaire.txt | ./TTAGGER/tree-tagger.exe -token -lemma -no-unknown TTAGGER/french-utf8.par > PROCESS/test.txt.pos"); #le dossier TTAGGER contient tous les fichiers/applications nécessaires pour effectuer l'étiquetage avec TreeTagger system("perl -f TTAGGER/treetagger2xml-utf8.pl PROCESS/test.txt.pos utf8"); { local $/=undef; open(TEMP, "<:encoding(utf8)", "PROCESS/test.txt.pos.xml"); $titre_etik_xml = <TEMP>; close TEMP; $titre_etik_xml =~ s/<\?xml.+?>//; } #-----------------etiquetage description----------------------------- my $description_etik_xml; open (ETI, ">:encoding(utf8)", "PROCESS/temporaire.txt"); print ETI $description ; close ETI; system("perl -f tokenise-utf8.pl -f PROCESS/temporaire.txt | ./TTAGGER/tree-tagger.exe -token -lemma -no-unknown TTAGGER/french-utf8.par > PROCESS/test.txt.pos"); system("perl TTAGGER/treetagger2xml-utf8.pl PROCESS/test.txt.pos utf8"); { local $/=undef; open(TEMP, "<:encoding(utf8)", "PROCESS/test.txt.pos.xml"); $description_etik_xml = <TEMP>; $description_etik_xml =~ s/<\?xml.+?>//; close TEMP; } print "$titre\n"; return $titre_etik_xml, $description_etik_xml; #on renvoie les éléments étiquetés }