Le but de cette boîte à outils est d'utiliser la fonction de parcours d'arborescence de Fils RSS dans la bao1, et d'étiqueter la sortie xml avec Treetagger, la sortie txt avec UDpipe.
Avant d'écrire le script perl, on est face à un choix important : appeler TreeTagger et UDpipe après le parcours d'arborescence ou pendant le parcours (c'est à dire qu'on appelle TreeTagger et UDpipe à chaque fois qu'on extrait les titres et les descriptions d'un fichier).
Nous avons choisi d'appler les outils d'annotation après avoir parcouru l'arborescence. Si l'on devait appeler les outils d'étiquetage pour chaque extraction d'un fichier, cela nécessiterait une durée d'exécution trop longue.
L'image ci-dessous illsutre le déroulement d'utilisation de Treetagger.
L'utilisation d'Udpipe est plus simple que celle de Treetagger. Nous pouvons appeler directement Udpipe en lui donnant une entrée de fichier .txt sans traitement.
#obtenir l'extraction pour trois rubriques, en parcourant la liste des rubriques
foreach my $r (@RUBRIQUES){
# créer un dictionnaire vide qui enregistre les informations distingues (sans répétition) pour chaque rubrique
my %dico_des_titres=();
# créer un nouveau fichier .txt et un nouveau fichier .xml qui contient le numéro de rubrique
open my $out, ">:encoding(UTF-8)","sortie-slurp_$r.txt";
open my $outxml, ">:encoding(UTF-8)","sortiexml-slurp_$r.xml";
print $outxml "<?xml version=\"1.0\" encoding=\"utf-8\" ?>>\n";
print $outxml "<corpus2020>\n";
# parcourir l'arborescence et trouver les informations dans la rubrique ciblée
# en portant les paramètres nom de l'arborescence, le numéro de rubrique, le fichier .txt, le fichier .xml,
# et le dictionnaire qui mémorise les informations déjà enregistrées
&parcoursarborescencefichiers($rep,$r,$out,$outxml,%dico_des_titres);
print $outxml "</corpus2020>\n";
close $out;
close $outxml;
# appler la fonction d'étiquetagge TreeTagger
# en donnant un paramètre pour il trouve le bon fichier grâce au repère de rubrique
&etiquetageTT($r);
# appler la fonction d'étiquetagge Udpipe
# en donnant un paramètre pour il trouve le bon fichier grâce au repère de rubrique
&etiquetageUD($r);
}
#-----------------------------------------
sub etiquetageTT {
my $rubrique = shift(@_);
# lancer tree-tagger-MacOSX-3.2.3
system ("./tree-tagger-MacOSX-3.2.3/bin/tree-tagger ./tree-tagger-MacOSX-3.2.3/bin/french-utf8.par -token -lemma -no-unknown -sgml sortiexml-slurp_$rubrique.xml > sortiexml-slurp_TT_$rubrique.txt");
system ("perl ./tree-tagger-MacOSX-3.2.3/bin/treetagger2xml-utf8.pl sortiexml-slurp_TT_$rubrique.txt utf8");
}
sub etiquetageUD {
my $rubrique = shift(@_);
# Etiquetage avec udpipe
# lancer udpipe : distrib-udpipe-1.2.0-bin
system("./distrib-udpipe-1.2.0-bin/udpipe-1.2.0-bin/bin-osx/udpipe --tokenize --tag --parse ./distrib-udpipe-1.2.0-bin/modeles/french-gsd-ud-2.5-191206.udpipe sortie-slurp_$rubrique.txt > sortieudpipe-slurp_$rubrique.txt");
}
sub preetiquetage {
my $titre = $_[0];
my $description = $_[1];
#-----------------etiquetage titre-----------------------------
# créer un fichier temporaire.txt et test.txt.pos pour enregistrer temporarement les informations
# parce que Treetagger ne peut pas traiter directement les chaines de caractères, il faut prendre les inforamtions à partir d'un fichier
open (ETI, ">:encoding(utf8)", "temporaire.txt");
print ETI $titre;
close ETI;
system ("perl -f ./tree-tagger-MacOSX-3.2.3/bin/tokenise-utf8.pl temporaire.txt > test.txt.pos");
open (TEMP, "<:encoding(utf8)", "test.txt.pos");
$/=undef;
my $titre_etik_xml=<TEMP>;
close TEMP;
#-----------------etiquetage description-----------------------------
open (ETI, ">:encoding(utf8)", "temporaire.txt");
print ETI $description;
close ETI;
system ("perl -f ./tree-tagger-MacOSX-3.2.3/bin/tokenise-utf8.pl temporaire.txt > test.txt.pos");
open (TEMP, "<:encoding(utf8)", "test.txt.pos");
$/=undef;
my $description_etik_xml=;
close TEMP;
return $titre_etik_xml,$description_etik_xml;
}
En python nous avons utilisé la bibliothèque spacy-udpipe pour réaliser à la fois l'annotation morpho-syntaxique et de dépendance.
Grâce au traitement de spacy, on peut traiter chaque token du texte comme un objet python doté de multiples attributs (lemme, pos, dépendance....).
def analyse_txt(texte):
doc = udpipe(texte)
result = ""
for token in doc:
result += f"{token.text}\t{token.lemma_}\t{token.pos_}\t{token.parent}\t{token.dep_}\n"
return result
def token2xml(token):
return f'{token.pos_}{token.lemma_}{token.text} \n'
def analyse_xml(texte):
doc = udpipe(texte)
result = ""
for token in doc:
result += token2xml(token)
return result
Cependant, l'étiquetage de python n'est pas tout à fait le-même que celui de perl au niveau de pos.
Commande | Script |
---|---|
perl parcours-arborescence-fichiers-BAO2-regexp-global.pl ../path/to/corpus/2021 3210 3244 3246 | |
pyhon3 parcour-arborescence-BAO2.py ../path/to/corpus/2021 3210 3244 3246 |