# Importation des modules utilisé import re, sys #--------------------------------------------------------------- #On définition la fonction extract_relation() qui va prendre en entrée un corpus et une relation. def extract_relation(corpus, relation): #On crée un buffer pour les phrases. C'est un dictionnaire qui va prendre comme clé l'index d'un mot dans la phrase et comme valeur son lemme. sent_buf={} #On crée un buffer pour les relations. Quand la relation qu'on veut est rencontré, on mettra dans ce buffer un tuple contenant le lemme du gouverné et la position du gouverneur dans la phrase. relation_buf=[] #On crée un ensemble qui contiendra tous nos paires de gouverneur-gouverné. couples=set() #On ouvre notre fichier en lecture. with open(corpus, "r", encoding="utf-8") as doc: #On met toutes les lignes dans la liste "lignes". lignes=doc.readlines() #Pour chaque ligne de notre fichier : for line in lignes: #Si la ligne commence par ça veut dire que l'on a pas changé de phrase donc : if line.startswith(""): #On recherche tous les balises ... et on met le contenu de chacun des match dans la variable "fields". fields=re.findall("([^<]+)", line) #On assigne à chacun des items dans field une variable : index (position dans la phrase), word (forme du mot), lemma, POS, _ pour les relations qui ne nous intéressent pas, position du gouverneur dans la phrase, la relation. idx, word, lemma, tag, _, _, position_gouv, rel, _, _ = fields #On ajoute pour chaque mot de la phrase, l'index du mot avec son lemme dans notre dictionnaire. sent_buf[idx] = lemma #Si la relation de la ligne est celle que l'on recherche if rel == relation: #On garde dans notre buffer de relation son lemme (gouverné) et la position dans la phrase du gouverneur. relation_buf.append((lemma, position_gouv)) #Si la ligne correspond à un

, cela signifie qu'on est arrivé à la fin de la phrase. if line == "

\n": #On ajoute dans notre ensemble "couples", un tuple comprenant le lemme du gouverneur et le lemme du dépendant. for dep_lemma, position_gouv in relation_buf: couples.add((f"{sent_buf[position_gouv]}", f"{dep_lemma}")) #On vide nos buffers. relation_buf = [] sent_buf = {} #On écrit chaque couple gouverneur-dépendant dans notre fichier en précisant la relation. for item in couples: f.write(f"{item[0]}---{relation}--->{item[1]}\n") #--------------------------------------------------------------- if __name__=="__main__": #Le corpus est le premier argument de la liste d'arguments. corpus=sys.argv[1] #La relation est le deuxième argument. relation=sys.argv[2] #On récupère le numéro de la rubrique pour pouvoir l'écrire dans le nom de notre fichier de sortie. m=re.search("(\d+).udpipe.xml", corpus) rubrique=m.group(1) #On ouvre notre fichier de sortie et dans son nom, on précise la rubrique, que le fichier de travail est celui étiqueté avec UDpipe (ud) et la relation. f=open(f"extract_relation_{rubrique}_ud_{relation}.txt", "w", encoding="utf-8") #On lance la fonction extract_relation() sur notre corpus et la relation. extract_relation(corpus, relation) #On ferme le fichier de sortie. f.close()