Boîte à Outils 4

Visualisation des données avec Padagraph

Image

ETAPES :
1) Formatage des données avant l'envoi vers Padagraph
2) Visualisation avec Padagraph et évaluation

EN ENTREE :
Le fichier "fichier.udpipe.xml" de la BAO2 ainsi que la relation que l'on veut étudier.

EN SORTIE :
Différents graphiques sur le site Padagraph.

SCRIPT :
Vous pouvez directement télécharger les scripts commentés de la BAO1 ci-dessous.

Langage Ligne de commande Téléchargement
Python python3 BAO3-relations.py fichier.udpipe.xml relation | curl -X POST -H 'Content-Type: text/csv' --data-binary @- https://padagraph.magistry.fr/post_csv/prenom_nom BAO4.py

PYTHON

Note : Ce script reprend ce qui a été fait dans le script Python BAO3-relations.py

Modification 1/2 : Création d'un dictionnaire pour les poids des relations
Padagraph nous permet de donner un poids aux relations trouvées (si par exemple le même couple de gouverneur et dépendant apparait un certain nombre de fois, cela montre un lien fort entre ces deux mots qui pourra être montrer avec un poids plus important). Pour ce faire, un dictionnaire de fréquences a été créé, avec comme clé un couple contenant le lemme du gouverneur et du dépendant, et comme valeur leur nombre d'occurrences.
Remarque : la fonction renvoie cette fois-ci, 4 valeurs : un set avec les gouverneurs (uniques), un set avec les dépendants (uniques), un set des couples (uniques), et le dictionnaire contenant le poids des relations (également uniques).

def padagraph(f, relation):
	# On initialise les variables dont on va avoir besoin
	sent_buf = {} 
	...
    
	### --- DEBUT DE LA MODIFICATION --- ###
	# Un dictionnaire comptant les fréquences de chaque relation dep->gouv
	dic_poids={}
	### --- FIN DE LA MODIFICATION --- ###
    
	# Pour chaque ligne
	for line in Path(f).read_text().split("\n"):
		if line.startswith("<item>"):
			...
        # Si on arrive à la fin d'une phrase (signalé avec la balise fermante "</p>")
        if line == "</p>":
            # Pour chaque lemme et gouverneur dans la liste obj_buf
            for dep_lemma, head in obj_buf:
		...
                ### --- DEBUT DE LA MODIFICATION --- ###
                # On incrémente les fréquences dans notre dictionnaire dic_poids
                dic_poids[(sent_buf[head],dep_lemma)] = dic_poids.get((sent_buf[head],dep_lemma),0)+1
                ### --- FIN DE LA MODIFICATION --- ###
                
            # On vide nos buffers pour la phrase suivante
            obj_buf = []
            sent_buf = {}
            
    ### --- DEBUT DE LA MODIFICATION --- ###
    return gouvernors, deps, couples, dic_poids
    ### --- FIN DE LA MODIFICATION --- ###

Modification 2/2 : Formatage pour l'envoi vers Padagraph
Dans la fonction principale, on récupère les données après exécution de la fonction padagraph, qui nous permettent de créer chaque noeud de gouverneur et de dépendant à partir des sets uniques (important pour ne pas avoir plusieurs noeuds avec le même label). Les arcs sont créés avec les couples de gouverneur et dépendants, avec comme poids leur nombre d'occurrences.

# Programme principal                
if __name__== "__main__":
    fichier = sys.argv[1]
    relation = sys.argv[2]
    
    ### --- DEBUT DE LA MODIFICATION --- ###
    gouvernors, deps, couples, dic_poids = padagraph(fichier, relation)
    ### --- FIN DE LA MODIFICATION --- ###

#-------------------------------------------------------------------------
    ### --- DEBUT DE LA MODIFICATION --- ###
    # On formate pour l'envoi vers padagraph
    print("@Gouv: #id, label")
    for lemme in gouvernors:
        print(f"g_{lemme},{lemme}")
    print("@Gouv: #id, label")
    for lemme in deps:
        print(f"d_{lemme},{lemme}")
    print(f"_{relation},weight:")
    for gouv, dep in couples:
        print(f"g_{gouv},--,d_{dep},{dic_poids[(gouv,dep)]}")
    ### --- FIN DE LA MODIFICATION --- ###
#-------------------------------------------------------------------------

Visualisation des graphes

"Planète"

Padagraph nous permet de visualiser les données sous forme de graphes 2D ou 3D que l'on peut observer sous tous les angles, avec des liens plus ou moins lointains. En voici quelques images montrant les voisins les plus proches du terme "planète" avec la relation obj pour les rubriques "planète" puis "culture". On peut s'apercevoir que l'entourage reste assez différent mais se rejoint sur une forte présence du mot "sauver" qui semble aujourd'hui, couplé avec "planète", devenus une véritable molécule sémique qui se retrouve dans des rubriques pourtant assez différentes. Bien entendu, on peut néanmoins vite s'apercevoir que le graphe dans la rubrique "planète" semble plus riche, on retrouve notamment des termes comme "ravager", "préserver" ou encore le "monde". Tandis que le terme "planète" est bien plus discret dans le graphique de la rubrique "culture" et ne se reliant pas particulièrement avec les termes cités précédemment.

Image

Image
"Crise"

Si l'on regarde un autre mot comme celui de "crise", les mots qui y sont reliés sont très vite divergents. Tandis que dans la rubrique "planète", on peut observer des pôles liés au covid ("pandémie", "vague"), le mot "crise" dans la rubrique "culture" sera vite reliée à la "vie", la "mort" ou encore au "pays". Ce point de divergence où la distinction est assez nette pourrait par exemple aider à un tri de documents par rubrique. Bien entendu, d'autres termes sont encore plus indicatifs : par exemple le mot "environnement" est quasi inexistant ou avec peu de lien dans la catégorie "culture", contrairement à la rubrique "planète" qui en est le thème principal.

Image

Image

Limites

Au niveau quantitatif, la taille des données d'une année entière, même pour les rubriques moins importantes, semble être tout de même assez conséquente et donc convenable pour une analyse. Néanmoins, au niveau qualitatif, la segmentation des tokens par le parseur n'est pas parfaite : certains mots comme "environnement" et "lenvironnement" par exemple sont pris comme des mots différents. Il en est de même pour l'étiquetage, qui a montré certaines faiblesses, observables dès l'extraction de quelques patrons réalisés dans la BAO3.