Project encadré 2
Extraction et analyse des flux RSS du journal Le Monde

Extraction de patrons morphosyntaxiques à partir des flux RSS du journal Le Monde de l'année 2017 avec Perl et la biliothèque XML::RSS

0 Présentation

Ce site a été réalisé dans le cadre du cours Projet encadré 2 du Master Plurital de L'Inalco, encadré par Serge Fleury et Jean-Michel Daube. Le but de ce cours sera de réaliser et d'utiliser une batterie d'outils permettant d'extraire des données linguistiques (récupération de corpus, normalisation des textes, segmentation, étiquetage, extraction, structuration et présentation des résultats...) notamment grâce aux langages Perl et XML.

Les finalités de cette chaîne de traitement sont multiples : lexicologie, recherche d'information, terminologie... Ce projet est aussi l'occasion d'une évaluation critique des résultats obtenus, d'un point de vue quantitatif et qualitatif.

► Environnement et données

Pour atteindre ces objectifs, nous utiliserons les fonctionnalités de Perl v5.26.1 et de ses bibliothèques. Nous utiliserons également des programmes créés pour le cours, tels que patron2graphe.exe (pour la visualisation), ou encore des requêtes XPath et XQuery pour l'extraction de patrons morphosyntaxiques.

Le corpus traité correspond aux flux RSS du journal Le Monde de l'année 2017. Les fils sont classés par rubrique, sous forme de fichiers XML. Chaque fichier contient un ensemble de données agencés selon une arboresence XML (voir graphique ci-dessous). Nous nous intéresserons dans le cadre de notre projet à l'extraction des sous-nœuds titre et description des sous-nœuds item.

► Étapes du projet

Le projet se divise en quatre étapes clé, correspondant chacune à un ensemble de programmes appelés "Boîtes à outils", ou "BàO", dont voici les objectifs :

BàO 1 : Créer un programme permettant de parcourir l'arboresence des flux RSS afin d'en extraire du texte brut et du texte balisé au format XML. Le texte pourra ensuite être traité dans le logiciel d'étiquetage Cordial et TreeTagger. Le programme s'appuiera sur les expressions régulières de Perl.

BàO 2 (BàO 1 enrichie) : Créer une version enrichie des programmes de la BàO1, avec étiquetage automatique des textes extraits à l'aide du programme TreeTagger. Cette étape sera également l'occasion d'évaluer et de comparer les sorties obtenues avec TreeTagger et l'étiqueteur Cordial.

BàO 3 : Créer des requêtes et des programmes permettant d'extraire les termes à l'aide de patrons morphosyntaxiques (code Perl), du langage XQuery/XPath (plusieurs méthodes), de la technologie XSLT, sur les contenus étiquetés avec TreeTagger et Cordial. Le but de cette étape sera également d'évaluer l'efficacité des différentes méthodes en termes de prétraitement des fichiers, de temps d'écriture, de résultats obtenus, etc. Les résultats seront ensuite évalués en fonction des différentes rubriques.

BàO 4 : Visualiser les résultats obtenus et les dépendances entre les termes à l'aide du programme patron2graphe

On peut résumer les étapes du projet à l'aide du schéma suivant. Le bleu correspond au corpus de départ, les boîtes roses aux différentes étapes, et les boîtes en violet au sorties obtenues.

Retour au menu

0 BàO 1 : parcours d'arborescence de fichiers et extraction des titres et des descriptions

Lors de cette étape, nous allons créer deux programmes permettant de parcourir l'arboresence des flux RSS afin d'en extraire du texte brut et du texte balisé au format XML. Nous traiterons les résultats obtenus dans le logiciel d'étiquetage Cordial. Le premier programme s'appuiera sur la techologie Perl regexp, et le deuxième sur la bibliothèque XML::RSS.

► Extraction avec Regexp

On commence par extraire les fichiers à l'aide d'un script Perl permettant de parcourir l'arborescence. Un programme de lecture de fichier est appelé de manière récursive : si l'élément trouvé dans l'arborescence est un fichier, on extrait son contenu, s'il s'agit d'un dossier, le même programme est appelé à nouveau. Pour chaque fichier trouvé, nous lançons plusieurs commandes afin d'extraire le contenu souhaité, à savoir les titres et les descriptions des articles.

Script BàO 1

On exécutera ce script à l'aide de la commande suivante :

perl5.26.1 parcours-arborescence-fichiers-2018-BAO1.pl IN 3260

Ici, le premier argument correspond au nom du répertoire à parcourir (IN) et le deuxième au numéro de la rubrique recherchée. Dans notre cas, il s'agira de la rubrique 3260, correspondant au fil RSS de la rubrique littéraire.

Exemple de fichier XML lu en entrée Sortie au format texte Sortie au format XML

À l'issue du programme, nous obtenons le premier résultat escompté, à savoir un document au format texte contenant uniquement les titres et les descriptions des articles ainsi qu'un fichier XML que nous étiqueterons morphosyntaxiquement à la prochaine étape. Nous avons également pu parcourir l'ensemble de l'arboresence grâce à l'appel récursif du programme de lecture de fichiers.

Retour au menu

0 BàO 2 : étiquetage des corpus

Maintenant que nous sommes parvenus à récupérer le contenu de nos fils RSS, nous allons créer une version enrichie de nos programmes, en y intégrant l'étiquetage morphosyntaxique des textes. Pour effectuer cette opération, nous aurons recours au programme d'étiquetage morphosyntaxique TreeTagger pour le fichier XML, et au programme Cordial pour la sortie au format texte brut. Cette étape sera également l'occasion d'évaluer et de comparer les sorties obtenues avec les deux étiqueteurs.

► Cordial

Nous commençons par étiqueter le corpus au format texte brut à l'aide des fonctionnalités d'étiquetage morphosyntaxique du logiciel Cordial 6. Le résultat de l'étiquetage est un fichier texte séparé par des tabulations au format .cnr. Dans notre cas, nous n'avons conservé que la forme, le lemme et la catégorie grammaticale de chaque mot. Le résultat est donc une liste des mots tokenisés en trois colonnes. Cette opération ne peut pas être réalisée directement dans le script. Nous passons donc par l'interface du logiciel. Voici le résultat obtenu sur la rubrique littéraire (3260) :

Sortie au format CNR

Extrait de la sortie :

► TreeTagger

Pour la version XML, nous utilisons le programme TreeTagger, que nous pouvons intégrer directement à notre précédent script grâce à la fonction system de Perl. Pour ce faire, nous ajoutons une fonction etiquetage qui appelle le programme et s'exécute sur chaque élément titre et description. Téléchargement du script enrichi :

Script BàO 2

Comme pour la première BàO, on exécutera ce script sur l'ensemble de l'arborescence à l'aide de la commande suivante :

perl5.26.1 parcours-arborescence-fichiers-2018-BAO2.pl IN 3260

Après étiquetage, nous obtenons un nouveau fichier XML avec pour chaque mot, sa forme, son lemme et sa catégorie grammaticale. Contrairement à Cordial, la sortie est représentée directement dans le corps du texte à l'aide de balises. Ces balises nous permettront par la suite d'appliquer des patrons morphosyntaxiques, grâce notamment aux langages de requête Xquery ou à la technologie XSLT.

Sortie au format XML, avec étiquetage TreeTagger

Le programme TreeTagger se contentant d'indiquer les parties du discours, nous avons dû recourir à deux programmes intermédiaires, respectivement tokenise-utf8.pl, pour la tokénisation en amont du traitement, et treetagger2xml-utf8.pl, pour la transformation du texte au format XML avec balises, afin d'obtenir ce résultat final.

À l'issue du programme, nous obtenons le résultat attendu : un document au format XML contenant les textes étiquetés avec TreeTagger au sein du document XML d'origine.

Extrait de la sortie :

Retour au menu

0 BàO 3 : extraction des patrons morphosyntaxiques

Pour cette troisième étape, nous allons créer des requêtes et des programmes permettant d'extraire les termes à l'aide de patrons morphosyntaxiques. Nous nous aiderons pour cela des contenus étiquetés avec TreeTagger et Cordial d'autres technologies : commandes Perl, langage XQuery/XPath et XSLT. Le but de cette étape sera également d'évaluer l'efficacité des différentes méthodes en termes de prétraitement des fichiers, de temps d'écriture, de résultats obtenus, etc.

► Motifs

Pour commencer, nous allons extraire les patrons morphosyntaxiques à l'aide d'un simple programme Perl utilisant un fichier de paramètres contenant un motif. Le script suivant permet d'extraire dans un premier temps les termes du texte à partir du fichier Cordial. Puis, dans un second, d'appliquer un patron morphosyntaxique, afin de n'extraire que les suites de catégories grammaticales indiquées dans le fichier de paramètre.

Script d'extraction de patrons morphosyntaxiques Fichier de paramètres

L'exécution du script avec le patron NOM-PREP-NOM nous permet d'obtenir la liste des occurrences suivante.

Liste NOM-PREP-NOM

Extrait de la sortie :

Nous pouvons tester cette opération sur des éléments plus spécifiques, comme les noms propres mentionnés dans les articles (patron NP.?.?.? NP.?.?.?).

Liste NP-NP

Extrait de la sortie :

La fonction d'étiquetage de Cordial a l'avantage d'être précise dans sa catégorisation, et de permettre ainsi l'application de patrons spécifiques. Elle offre également un taux d'erreur plus faible que d'autres programmes d'étiquetage morphosyntaxique comme TreeTagger. Le seul inconvénient du logiciel est l'impossibilité de l'utiliser en ligne de commande et donc de l'intégrer au sein d'un script.

► XSLT/XPath

La technologie XSLT/Xpath fait partie du langage XML. Elle permet d'effectuer des traitements sur des nœuds donnés au sein d'un document structuré au format XML grâce à l'application de règles, en agissant comme une feuille de style. La technologie s'appuie sur le langage de requête XPath.

Pour obtenir des patrons morphosyntaxiques, nous allons utiliser cette fois-ci le corpus au format XML étiqueté avec TreeTagger. Nous pouvons, comme pour la sortie Cordial, extraire uniquement les motifs NOM-PREP-NOM. Il nous suffit pour cela de créer une feuille de style XSL indiquant les nœuds à extraire, et d'ajouter dans notre fichier XML étiqueté une ligne indiquant la feuille de style XSL à appliquer.

Feuille de style XSL

Une fois la feuille de style avec motif NOM-PRP-NOM appliquée, nous obtenons le résultat suivant

Liste NOM-PRP-NOM

Extrait de la sortie :

Comme pour l'extraction de motifs sur la sortie Cordial, nous pouvons extraire les patrons des noms de personnes. Dans TreeTagger, ces derniers peuvent être extraits à l'aide du motif NAM-NAM.

Liste NAM-NAM Feuille de style XSL

Extrait de la sortie :

Si l'on compare les premiers résultas avec ceux de la sortie Cordial, on remarque que l'opération d'extraction par feuille de style sur sortie TreeTagger n'a pas reconnue le nom "Alexia Stresi" contrairement au script précédent. Par ailleurs, si l'on regarde de plus près, on constate que ce nom a été étiqueté par TreeTagger avec les balises "VER:simp" et "VER:ppr", autrement dit, en tant que verbes.

Malgré de type d'erreur, si l'on compare le nombre de tokens, on s'aperçoit que pour le même motif NAM-NAM, l'extraction sur sortie Cordial permet d'obtenir 1419 résultats contre 1545 avec la sortie TreeTagger. On observe la même tendance pour le motif NOM-PREP-NOM. Cette différence de résultats est liée à la plus grande précision de l'étiquetage de Cordial, qui catérogise par exemple les articles contractés "au" et "des" en tant que "DETDETDMS" et "DETDPIG" respectivement, tandis que TreeTagger rangera ces mots dans la super-catégorie "PRP".

► Xquery/XPath

Pour finir, nous utiliserons une troisième méthode utilisant exclusivement le langage de requêtes Xquery basé, comme la technologie XSLT, sur le langage de requête XPath. Pour y parvenir, nous nous servirons du logiciel d'édition XML BaseX.

BaseX reconnaît automatiquement l'ensemble de l'arborescence XML. Notre but sera, comme pour XSLT/Xpath, d'extraire uniquement les termes correspondant aux patrons morphosyntaxiques de notre choix, en restreignant le contenu affiché. Pour ce faire, nous nous baserons une nouvelle fois sur le fichier XML étiqueté avec TreeTagger, avec comme patrons les séquences NOM-PRP-NOM et NAM-NAM.

Comme pour XSLT/Xpath, nous devrons sélectionner les nœuds souhaités en pointant d'abord vers les éléments de l'arborescence à traiter, puis en affichant les résultats à l'aide d'une condition. La requête et les résultats pour la reconnaissance des patrons NOM-PRP-NOM se présentent ainsi...

Requête Xquery : NOM-PRP-NOM Résultat dans BaseX

Extrait de la sortie :

...ceux des patrons NAM-NAM...

Requête Xquery : NAM-NAM Résultat dans BaseX

Extrait de la sortie :

On constate que les deux résultats sont en tous points identiques à ceux générés par l'application de la feuille de style XSL. Cette méthode semble cependant encore plus rapide et moins complexe que la précédente (pas de création de feuille de style, meilleure visualisation des erreurs de saisie éventuelles, plus grande rapidité de traitement).

Retour au menu

0 BàO 4 : affichage des résultats sous forme de graphes

Pour la dernière étape, nous allons visualiser les relations de dépendance entre les termes de notre corpus grâce au programme Patron2graphe.

► Patron2graphe

Dans notre exemple, nous nous servirons d'une liste de patrons NOM-ADJ afin d'y analyser les occurrences du mot "écrivain".

Exemple de commande d'exécution du programme :

./patron2graphe.exe "utf-8" Liste3_NOM-ADJ.txt motif-utf8.txt > out.log 2> err.log

Liste NOM-ADJ Motif

L'exécution est effectuée sur un corpus donné. Dans notre exemple, nous nous sommes limité à la liste des NOM-ADJ que nous avons extraite à l'étape précédente. Le programme patron2graphe nous permet de limiter les dépendances à un motif particulier. Dans notre liste, nous choisirons de visualiser les mots "écrivains", "écrivain" et "écrivaine" grâce au motif "écrivain.?.?". Nous pouvons alors observer leurs dépendances comme dans l'illustration ci-dessous.

Résultat de patron2graphe pour le mot écrivain

► Analyse de graphe

Ce mode de visualisation permet de mettre en évidence la force des relations entre certains termes et la fréquence de leurs co-occurrences. Dans notre exemple, on constate par exemple que les trois formes du mot écrivains sont la plupart du temps associées à un adjectif de nationalité. De même, "écrivain" au masculin est plus fortement lié à "américain", tout comme "américaine" l'est pour pour "écrivaine" ou "anglo-saxons" pour "écrivains" au pluriel.

On constate également, sans suprise, que la forme "écrivain" au masculin est surreprésentée par rapport à sa forme féminine, moins fréquente. De même, si l'on s'attarde encore un peu plus sur les pays d'origine, on observe encore une fois une prévalence des pays anglophones (américain, britannique, anglo-saxon, 20 occurrences) et des pays européens (12 pays représentés, 27 occurrences), une représentation moindre des pays d'Amérique du Sud, d'Afrique et du Proche-Orient, et l'absence d'autres régions du monde, comme la Chine et le reste de l'Asie.

Pour tenter de confirmer ces premiers résultats, nous pouvons effectuer une nouvelle opération sur le corpus NOM-ADJ, mais avec cette fois le motif "auteur.?.?". Nous pourrons ainsi voir si ces tendance se reproduisent. Après exécution de la commande, nous obtenons ce nouveau graphe, moins complexe.

Résultat de patron2graphe pour le mot écrivain

Malgré le nombre plus restreint d'occurrences, on constate des proportions similaires dans les résultats obtenus. Ici, la forme féminine n'est plus du tout utilisée, et les pays anglo-saxons sont encore une fois en tête. Les pays européens sont également en majorité, accompagnés des adjectifs "afro" et "japonais". On voit toutefois que le mot "auteur" est plus fréquemment employé avec des adjectifs qualificatifs (par opposition aux adjectifs de nationalité) que le mot "écrivain".

Retour au menu