Objectif BAO4:

Avec la BAO4 on achève notre projet. Son objectif principale est la visualisation sous forme de graphe des relations de dépendance entre unités lexicales (extraites dans la BAO3bis). Padagraph, l'outil qui nous permettera de visualiser nos données sous forme de graphe a été mis en place par M.Pierre Magistry. Afin qu'il puisse construire le graphe, il est nécéssaire de lui donner un fichier csv où on va spécifier les sommets, les noeuds et les relations entre éléments léxicaux. On va donc mettre en place un script python en gré de filtrer et organiser les données d'une telle façon. Ensuite, on va envoyer le csv au serveur directement à travers le terminal avec la ligne de commande suivante: 'python BAO4.py | curl -X POST -H 'Content-Type: text/csv' --data-binary @- \"https://padagraph.magistry.fr/post_csv/annacolli-nsubj\" '. On changera à chaque fois le nom du graphe.
Le script python qu'on présente ici complète les script présentés dans la BAO3bis.
Comme pour la BAO3bis, on vous présentera d'abord le script dans sa version base et on dédiera une section dans la partie 'explication' pour les améliorations possibles. En effet, comme montre la première photo, le graphe sans aucun type de filtres est quasi illisible et très bruité.
On vous présentera aussi un script très similaire dont la sortie n'est pas un csv mais un fichier texte. Ainsi on sera en gré de le comparer aux script python, XSLT et XQuery de BAO3bis.

Voilà le fichier en entrée:

fichier Udpipe XML

Voilà les script python :

PYTHON script base - sortie csv pour Padagraph

PYTHON script base - sortie txt

PYTHON script amelioré - sortie csv pour Padagraph

Voilà les fichiers txt:

sortie txt - obj - à la une

sortie txt - obj - internationa

sortie txt - obj - europe

sortie txt - nsubj - à la une

sortie txt - nsubj - international

sortie txt - nsubj - europe

******************************************** Rendez vous aux graphes en bas de page! ******************************************************

Les scripts commentés: PYTHON






Script principal :

On commence par initialiser toutes les variables dont on aura besoin :

  • 2 variables buffer (sent et obj) qui vont se vider à chaque tour de boucle et qui ont le role de 'entrpôt temporaire' pour les objets qu'on va répérer.
  • La variable couple, de type set() (un ensemble de 'types') qui contiendra les couples dépendant-gouvernor.
  • La variable gouvernors qui contiendra les gouvernors.
  • La variable deps qui contientra les dépendants.
On va déclarer la fonction de néttoyage de texte qui enlevera tout ce qui n'est pas mot dans la string du lemma.
Le cœur de la fonction commence par la lecture intégrale du fichier stocké au début dans la variable 'fic' qu'on divise en lignes avec 'split'. On va ensuite analyser chaque element en stockant dans des variables la position, le pos, le lemma, la string, la relation et l'indice du gouvernor trouvés à travers un re.findall. Après le nettoyage du lemma (on doit enlever les apostrophes pour avoir une sortie exploitable par le serveur) on va stocker le lemma, acompagné par sa position (idx) dans un dictionnaire buffeur (sent_buf) et, si la relation correspond au type recherché, on va stocker le lemma et la position du gouvernor (head) sous forme de tuple, dans un autre buffeur (obj_lemma), cette fois de type liste (NB: il est intéressant de remarquer deux façons différentes de stocker des éléments en relation: sous forme de couple valeur-clé dans un dictionnaire ou sous forme de tuple à l'intérieur d'une liste). Une fois arrivé à la fin de la ligne, on démarre une boucle sur la liste des tuples et on remplit les variables:
- 'couples' avec le lemma du gouvernor (extrait du dictionnaire buffeur en s'appuyant sur l'indice de position fourni par 'head') et le lemma du dépendant (extrait de la liste de tuples buffeur). --> cela sera outil pour les relations pour le csv
- 'gouvernors' avec le lemma du gouvernor (extrait du dictionnaire buffeur). --> outil pour la liste des gouvernors pour le csv
- 'deps' avec le lemma du dépendant (extrait de la liste buffeur).
À la fin de la boucle on vide seulement les variables buffeurs.

La dernière partie du programme est complétement dédiée à la sortie qui peut se présenter :
- sous forme de CSV à envoyer au serveur padagraph
- sous forme de txt.




Sortie txt:

Pour la sortie txt est nécéssaire faire certains changements:
- changer le type d'objet 'couples' en list: en effet, l'objet 'set()' est un ensemble et donc il prendre en compte une seule couple par type (et pas toutes les occurrences de chaque couple dépendant-gouvernor). En le transformant en list on pourra compter les occurrences de chaque couple comme en perl (modifier la fonction d'ajout d'éléments dans un set ('add()')en 'append()')
- enlever les variables 'gouvernors' et 'deps' parce qu'on aura besoin seulement de la liste 'couples' pour la sortie.
- changer 'lemme' avec 'word'. Pour avoir une sortie comparable à celle de perl, on s'intéressera à la string et pas au lemme.
- enlever la fonction de nettoyage. Elle n'est pas nécéssaire pour une sortie txt et les mots seront plus lisibles.
- enlever la sortie csv et ajouter une sortie txt.

Les images présentent les différences les plus remarquables de la sortie txt par rapport à la sortie csv pour le serveur. Il est possible de consulter la totalité du script au début de la page en cliquant sur le bouton.





Améliorations possibles

Pour avoir des résultats plus ciblés et des graphes plus lisibles, il est possibles de faire des améliorations et notamment des filtrer les éléments pris en compte.

En outre, sur padagraph on a la possibilité d'ajouter un poids aux relations selon leur fréquence d'occurrence. Les relations qui sont plus fréquentes auront un poids majeur par rapport à celles qui sont présentes une seule fois et le lien visuel sur le graphe sera moins éloigné plus le poids est grand. Pour définir le poids d'une relation on crée un dictionnaire avec tous les éléments de la liste 'couples' (transformée en liste, noter que dans le script 'base' elle est un set() mais vue que le set() est un ensemble on n'aura pas d'occurrences) comme clés (des tuples) et leur nombre d'occurrences comme valeur. Ensuite, dans la création du csv, en particulier dans le remplissage des case des 'relations' on ajoutera l'attribut 'weight' où on inserera la valeur du dictionnaire liée à sa clé. On pourra aussi ajouter un filtre en plus (comme on a fait dans certains graphes) pour faire afficher seulement les relations qui ont un poids supérieur ou inférieur à une valeur donnée.

Graphes obj:

à la une - général

Voilà le graphe des relations 'objet' sur la rubrique 'à la une'. On remarque des noyaux autour des jours de la semaine 'mardi', 'lundi'; ce résultat est attendu vu que dans cette rubrique toutes les nouvelles 'flash' sont ressemblées. Les autres termes présents sont très hétérogènes et différents, un autre indice de l'hétérogéneité des nouvelles qu'on retrouve dans cette rubrique.

Zoom : campagne et mesure

Voilà deux 'zoom' sur les noyaux 'campagne' et 'mésure', des mots clés de la période 2021 qui renvoient, le premier à les éléctions présidentielles d'avril 2022 et le deuxième à la situation pandémique et aux mésures sanitaires conséquentes.

International - général

Dans le graphe de la rubrique International on remarque d'un nombre de noyaux les uns à coté des autres: président, pays, gouvernement. On n'est pas étonné par ce résultat, vu que la majorité des nouvelles internationales rélèvent de la politique. On vous propose donc plus en bas un zoom sur le noyau 'pays'

Zoom : pays

Europe - général

Aussi dans le graphe de cette rubrique on retrouve beaucoup de noyaux liés au domaine de la politique. Les noyaux très visibles de 'droit' et 'enquête' attirent notre attention : quelque chose se passe en Europe...peut être Brexit!

Zoom : pays

En suivant les suggestions jaillies pendant la lecture du premier graphe, on peut remarquer deux verbes clés liés au noyau 'pays': rester et quitter. On peut donc deviner que beaucoup de nouvelles portent sur la question Brexit et sur la crise interne qu'elle a causé.

Graphes nsubj:

Pour les graphes portants sur la relation 'nsubj' on a essayé d'améliorer les graphes en suivant les suggestions présentées dans l'onglet 'améliorations possibles'

En particulier, on a utilisé la stoplist et le poids, en excluant de la relation toutes les couples avec un poids inférieur à 1 (toutes les mots dont la relation a lieu une seule fois en total). Comme vous pouvez remarquer, dans le graphe les gouvernors et dépendants avec un poids mineure de 1 apparaissent mais ils ne sont pas liés entre eux parce qu'on a exclus leurs relations.

à la une :

Zoom : président

On peut séléctionner le mot 'président' et si on clique sur la relation avec un élément voir son poids. La rélation entre président et 'promettre' a un poids de '5' donc assez élévé.

Internationale

En regardant la sortie txt on peut déjà remarque des relations entre éléments variées, similaires à celles de 'à la une', très générales et difficilement renvoyables à des événements précis. On voit parmi les premiers résultats une relation très fréquente entre Vladimir et Poutine. Bien qu'il s'agit d'une relation nsubj érronée, on peut retenir la grande fréquence de ce nom à l'intérieur des nouvelles de cette rubrique. Un indice des tensions russes dont on voit les conséquences maintenant.

Pour la production de ce graphe on a décidé de rendre la sortie encore plus propre en indiquant que afin qu'un lien entre deux éléments apparaisse sur le graphe il faut que son nombre d'occurrences soit compris entre 1 et 3 pour éviter des relations trop générales et donc pas intéressantes

Europe

En regardant la sortie txt on peut remarquer des sorties plus spécifiques par rapport à les autres rubriques analysées. Il y a beuacoup de références à la Brexit (post-Brexit, Royame-uni) et aux devoirs de l'UE (beaucoup de 'doit'). On retrouve même ici des références à la Russie.

Dans cette image on voit clairement la centralité du mot 'devoir'

MOI

Anna Colli
M1 TAL
Sorbonne Nouvelle
anna.colli@sorbonne-nouvelle.fr