Le but de la BAO 2 est d'étiqueter en morphosyntaxe le texte nettoyé dans la BAO 1. On aimerait, pour chaque token du texte, récupérer sa forme, son lemme et sa Part of Speech (POS). On aimerait également faire afficher les relations de dépendances entre les tokens.
Pour ça, on va repartir du programme de la BAO 1 et y ajouter des sous-programmes pour la segmentation et l'annotation.
En entrée, on aura donc encore une fois le nom d'un dossier et le numéro de la rubrique.
Sur tous les fichiers de sortie, certains ne seront pas gardés car ce ne seront que des fichiers "tampon". On gardera donc seulement :
- le fichier de texte brut avec les titres et descriptions nettoyés qui est le même que dans la BAO1 1,
- un fichier au format CoNLL annoté avec UDpipe et reformaté au format XML,
- un fichier au format TreeTagger reformaté au format XML
par rubrique.
LANGAGE INFORMATIQUE | MODE D'EMPLOI DU LANCEMENT DU SCRIPT DANS LE TERMINAL | TELECHARGEMENT DU SCRIPT ENTIER COMMENTE |
---|---|---|
Perl | perl bao2-parcours-etiquetage.pl nom_dossier numero_rubrique | bao2-parcours-etiquetage.pl |
Python | python3 bao2-parcours-etiquetage.py nom_dossier numero_rubrique |
bao2-parcours-etiquetage.py |
Tout d'abord, nous créons deux fichiers :
- un fichier TXT dans lequel on mettra les titres et descriptions nettoyés
- un fichier XML dans lequel on mettra les titres et descriptions nettoyés avec un token par ligne. Cette segmentation sera effectué grâce à un sous-programme &segmentationTD qui utilise TreeTagger. Chaque titre et chaque description se trouvera dans des balises respectives <titre></titre> et <description></description>.
Le fichier de pré-corpus XML ressemble à ça :
<item><titre>
Brexit
:
comment
l’Europe
a
encaissé
la
perte
du
Royaume-Uni
.
</titre><description>
La
sortie
des
Britanniques
a
d’abord
sidéré
l’Union
européenne
,
qui
a
su
faire
preuve
de
résilience
pour
éviter
un
effet
domino
.
Mais
,
sur
bien
des
sujets
,
l’Europe
est
encore
au
milieu
du
gué
.
</description></item>
Nous avons besoin de rajouter cette étape pour le fichier XML car TreeTagger a besoin de ça pour pouvoir annoter correctement en morphosyntaxe les tokens.
Le sous-programme &etiquetageTT prend ensuite ce fichier XML pré-segmenté et renvoie un fichier TreeTagger avec la forme, le lemme et la POS de chaque token du texte.
Ce fichier "tampon" est reformaté au format XML grâce au programme "treetagger2xml-utf8.pl". Le fichier XML ressemble à ça :
<element><data type="type">NAM</data><data type="lemma">Brexit</data><data type="string">Brexit</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">comment</data><data type="string">comment</data></element>
Le sous-programme &etiquetageUP prend le fichier de texte brut des titres et descriptions nettoyés et le tokenize, le lemmatise, l'annote en POS et en dépendance syntaxique. Il renvoie un fichier au format CoNLL. On prend ensuite ce fichier au format CoNLL, on le passe dans le programme Perl "udpipe2xml-version-sans-titrevsdescription-v2.pl" pour pouvoir le reformater au format XML. Ce fichier CoNLL reformaté ressemble à ça :
<item><a>1</a><a>Brexit</a><a>Brexit</a><a>NOUN</a><a>_</a><a>Gender=Masc|Number=Sing</a><a>6</a><a>nsubj</a><a>_</a><a>SpacesAfter= </a></item>
<item><a>2</a><a>:</a><a>:</a><a>PUNCT</a><a>_</a><a>_</a><a>1</a><a>punct</a><a>_</a><a>_</a></item>
Avec la commande "time" sur le terminal Bash, on sait que le temps d'exécution du programme pour une rubrique est d'environ 9 minutes.
Ci-dessous, vous pouvez télécharger les archives utiles pour l'annotation avec UDpipe et TreeTagger. Elles doivent être mises dans le même dossier que le script Perl.
Chaque titre et chaque description est nettoyé puis envoyé dans la fonction analyse_txt(). Cette fonction, qui utilise Spacy_UDpipe, renvoie une ligne par token contenant le lemma, la forme et la POS de chaque token des titres et descriptions séparés par des tabulations. Ce résultat est sauvegardé dans un fichier texte. Ci-dessous se trouve un extrait de ce fichier :
Brexit Brexit NOUN
: : PUNCT
comment comment ADV
l’Europe l’Europe PROPN
a avoir AUX
Les titres et descriptions nettoyés sont également envoyés dans une autre fonction. Analyse_xml(), qui utilise également Spacy_UDpipe, renvoie la même chose que la fonction précédente mais cette fois-ci formaté au format XML :
- la POS de chaque token se trouve dans la balise <data type="type">
- le lemme dans la balise <data type="lemma">
- et la forme dans <data type="string">
Pour chaque token, les trois informations (POS - lemme - forme) sont mises dans une balise <element>. Chaque titre est ensuite mis dans une balise <titre> et chaque description dans la balise <description>. Le couple titre-description est enfin mis dans des balises <item>...</item>. On sauvegarde ce résultat dans un fichier XML. Le résultat est le même qu'avec le programme Perl.
Pour le programme en Python, nous n'avons donc pas de fichier au format CoNLL reformaté en XML comme dans le programme Perl.
Les fichiers de base sans aucune annotation de la BAO1 ne sont également pas resortis. On obtient directement le fichier TXT avec les tabulations et le fichier XML.
Pour installer spacy_udpipe, il faut créer un environnement virtuel sur le terminal avec les commandes suivantes :
python3 -m venv env
source env/bin/activate
pip install spacy_udpipe
Le programme en Python faisant moins de choses que le programme en Perl, il ne prend que 6 minutes pour le traitement d'une rubrique.