Boîte à outils 4 : des textes aux graphes


Le but de cette boîte à outils est de proposer des visualisations sous forme de graphe à partir des relations de dépendance extraites dans la BAO3. L'outil utilisé, Padagraph, a été développé par Pierre Magistry. Il requiert l'utilisation de données au format CSV qu'on redige directement du terminal vers l'interface PadaGraph avec la commande "curl".


Script Python commenté

#pour lancer le script depuis le terminal: 
#python3 bao4.py fichier_xml relation | curl -X POST -H 'Content-Type: text/csv' --data-binary @- "https://padagraph.magistry.fr/post_csv/salomechandora_rubrique"

import re
from pathlib import Path
import sys

#quand on lance le script, le premier argument est le fichier d'entrée (étiqueté par UDPipe) et le deuxième la relation 
fic = sys.argv[1] 
relation = sys.argv[2]

# on crée un buffer (dictionnaire) pour les phrases. La clé sera l'identifiant (indice) du mot dans la phrase et la valeur son lemme. 
sent_buf = {} 
#on crée un buffer (une liste) pour les  dépendants qui contiendra des tuples de forme (lemme, gouverneur)
rel_buf = []
#on crée un set contenant les couples (tuples) de la forme (gouverneur, dépendant)
couples = set()

def nettoyage(s: str):
    return re.sub('[^\w]', '', s)

for line in Path(fic).read_text().split("\n"):
    #si la ligne commence par la balise <item> (c'est-à-dire qu'il s'agit d'un mot de la phrase)
    if line.startswith("<item>"):
        #les champs correspondent aux informations contenues dans ces balises: l'indice du mot dans la phrase, la forme, le lemme, le POS
        #l'indice du gouverneur et le type de relation
        #les champs "_" concernent les informations qui ne nous intéressent pas
        fields = re.findall("<a>([^<]+)</a>", line)
        idx, word, lemma, tag, _, _, head, rel, _, _ = fields
        lemma = nettoyage(lemma)
        #on ajoute au dictionnaire l'identifiant du mot comme clé et son lemme comme valeur
        sent_buf[idx] = lemma
        #si le champ "relation" est celui que l'on souhaite étudier
        if rel == relation:
            #on ajoute au buffer le tuple contenant le lemme du mot et l'identifiant de son gouverneur
            rel_buf.append((lemma, head))
    #si la ligne commence par la balise </p> (c'est-à-dire la fin d'une phrase)        
    if line == "</p>":
        #on parcourt les tuples stockés dans le buffer
        for dep_lemma, head in rel_buf:
            #et on ajoute au set les tuples contenant le gouverneur et le dépendant
            couples.add((f"{sent_buf[head]}", f"{dep_lemma}"))
        #on réinitialise les buffers pour la nouvelle phrase
        rel_buf = []
        sent_buf = {}

#on affiche directement dans le terminal : Padagraph récupérera les données directement grâce àla commande Bash
print("@Gouv: #id, label")
for lemme in {gov for gov, _ in couples}:
    print(f'g_{lemme},{lemme}')
print("@Dep: #id, label")
for lemme in {dep for _, dep in couples}:
    print(f'd_{lemme},{lemme}')
print(f"_{relation}:")
for gouv, dep in couples:
    print(f"g_{gouv},--,d_{dep}")

Pour télécharger le script Python : Script Python

RELATION OBJ


POUR LA RUBRIQUE INTERNATIONAL:


POUR LA RUBRIQUE ECONOMIE:



POUR LA RUBRIQUE IDEES:

RELATION NSUBJ


POUR LA RUBRIQUE INTERNATIONAL:



POUR LA RUBRIQUE ECONOMIE:



POUR LA RUBRIQUE IDEES: