BAO 4

Peut-on attribuer la rubrique associée à un fil RSS au regard du texte qu'il contient ? On essaiera de mettre en oeuvre un processus qui extrait le texte d'un fil puis lui attribue sa rubrique parmi celles disponibles dans le journal (problème a priori "très difficile"...)


Quel est le but de cette boîte à outil?

Nous allons générer un graphe nous permettant de mieux rendre compte des relations entre les mots. Pour cela nous allons utiliser un programme python puis nous utiliserons Padagraph pour charger nos données et les visualiser.

Quelques petites explications avant de plonger :

- Pour mettre nos données dans le calc on utilise le lien https://calc.magistry.fr/nomdenotrecalque
- Pour charger notre graphe on utilise le lien https://padagraph.magistry.fr/
- Pour mieux comprendre Padagraph



Python (extraction de relations de dépendance)


Le code ci-dessous est commenté. La version téléchargeable : ici

            
#!/usr/bin/python3
#utilisation : python3 bao4.py ./rubrique/corpus_titre-description.udpipe.xml | curl -X POST -H 'Content-Type: text/csv' --data-binary @- "https://padagraph.magistry.fr/post_csv/elisabethsavatier"

import re
from pathlib import Path
import sys

fic = sys.argv[1] #le fichier udpipe.xml

sent_buf= {}
obj_buf = []
couples = set()
gouverneur = set()
dependant = set()

def clean (s) : #fonction de nettoyage (on retire tout ce qui n'est pas un mot)
    return re.sub("[^\w]", "", s)

for line in Path(fic).read_text(encoding="utf-8",errors="ignore").split("\n") :
    if line.startswith("<item>") :
        fields = re.findall("<a>([^<]+)</a>", line)
        idx, word, lemma, tag, _, _, head, rel, _, _ = fields
        # _ = on s'en fiche de la valeur de ça.
        #on stocke tout ce qui n'est pas "_"
        lemma = clean(lemma) #on nettoie le lemme
        sent_buf[idx] = lemma #on met sa position dans un dictionnaire
        if rel == 'obj' : #s'il est en dépendance de type objet
            obj_buf.append((lemma,head)) #on stocke l'id du gouverneur
    if line == "</p>" :
        for obj_lemma, head in obj_buf :
            couples.add((f"{sent_buf[head]}", f"{obj_lemma}")) #on stoke le couple gouv-dep
            gouverneur.add(sent_buf[head]) #on stocke le gouvernant
            dependant.add(obj_lemma) #on stocke le dépendant
        obj_buf = [] #on réinitialise les buffers
        sent_buf = {}

# une manière fe faire | egrep "\w" | sort | uniq -c pour les gouv et les dep : 
weightgov = {}
for lemme in {gov for gov, _ in couples}: #si le lemme est pas dans le dictionnaire on l'ajoute en lui donnant une fréquence de 1
    if lemme not in weightgov : 
        weightgov[lemme] = 1
    else : 
        valeur = weightgov.get(lemme) #on ajoute un à la fréquence du lemme
        valeur += 1
        weightgov.update({lemme : valeur})

weightdep = {}
for lemme in {dep for _, dep in couples}:
    if lemme not in weightdep : #si le lemme est pas dans le dictionnaire on l'ajoute en lui donnant une fréquence de 1
        weightdep[lemme] = 1
    else : 
        valeur = weightdep.get(lemme) #on ajoute un à la fréquence du lemme
        valeur += 1
        weightdep.update({lemme : valeur})

#on créé la feuille de calc pour padagraph
print("@Gouv: #id, label")
for lemme in {gov for gov, _ in couples}:
    print(f'g_{lemme},{lemme},{weightgov.get(lemme)},')
print("@Dep: #id, label")
for lemme in {dep for _, dep in couples}:
    print(f'd_{lemme},{lemme},{weightdep.get(lemme)},')
print("_obj:")
for gouv, dep in couples:
    print(f"g_{gouv},--,d_{dep}")
            
        

Extrait de la sortie de ce programme si on ne le donne pas directement à Padagraph :

Graphe de la rubrique A la Une du Monde en relation obj :



Graphe de la rubrique Livres du Monde en relation obj :



Graphe de la rubrique Cinéma du Monde en relation obj :