#Copyright (C) 2020 Valentin-Gabriel SOUMAH # coding: utf-8 import time, os from lxml import etree def extractionPatrons(patron, fichier): motif = patron.split() # On aura besoin de séparer chaque partie du discours recherchée if fichier.endswith(".tal.xml"): patronsxml(motif,fichier) elif fichier.endswith(".tal"): with open(fichier, encoding="utf8") as fic,open ("resultats/patrons.txt", "w", encoding="utf8") as out: phrases=fic.read().split("\n\n") #On coupe le contenu du fichier en paragraphes (soit chaque phrase traitée par talismane) for i,phrase in enumerate(phrases): lignes= phrase.split("\n") #Chaque paragraphe est composé de lignes (soit un mot avec toutes ses informations syntaxiques) for j, ligne in enumerate(lignes): elements=ligne.split() #On coupe chaque information de la ligne) if not ligne: continue #Debug les eventuelles lignes vides if elements[3] == motif[0] and len(motif) < len(lignes[j-1:]): '''la troisième information est le mot la partie du discours du mot En parcourant chaque ligne on va regarder si on trouve la première partie du discours On vérifie aussi si le nombre de mots restants dans la phrase est suffisant pour faire rentrer toutes les parties du discours qui suivent''' correspond = True #On initialise une variable qui va nous dire si on a trouvé la suite qu'on cherche match= elements[1] for k, PoS in enumerate(motif[1:]): lgnsuivantes=lignes[j+k+1].split() #On crée une liste contenant toutes les lignes à tester (lignes qui suivent susceptible de matcher le patron) if PoS!= lgnsuivantes[3]: #On compare chaque partie du discours suivant dans le motif aux partie du discours suivants dans la phrase correspond=False #Si la PoS ne correspond pas, on enregistre que ça ne match pas. break #Pas besoin de vérifier les lignes d'apres vu que ça match pas. else: #print(lignes[j+k]) match+=" "+ lgnsuivantes[1] #Et on retient le mot correspondant à chaque fois if correspond : #Si on a jamais rencontré de non correspondance à la fin de la boucle alors on a trouvé notre suite! out.write(match+"\n") #On l'écrit dans un fichier else: print("fichier non supporté, choisissez un autre fichier") def patronsxml(motif,fichier): #Meme principe que la fonction du haut mais version xml avec xpath arbre = etree.parse(fichier) with open ("resultats/patrons.txt", "w", encoding="utf8") as out: for item in arbre.xpath("/basetalismane/p/item"): #print(item.xpath("a[1]")[0].text) if not item.xpath("a[4]"): continue if item.xpath("a[4]")[0].text == motif[0]: correspond = True match = item.xpath("a[2]")[0].text try: for i in range(1, len(motif)): if item.xpath("following-sibling::item["+str(i)+"]/a[4]")[0].text != motif[i]: correspond = False else: match += " " + item.xpath("following-sibling::item["+str(i)+"]/a[2]")[0].text if correspond : out.write(match+"\n") except IndexError: pass if __name__=='__main__': dicoPoS= {"nom propre": "NP", "nom commun": "NC", "adjectif":"ADJ","déterminant": "DET","verbe":"V","pronom":"PRO","adverbe":"ADV","préposition":"P","conjonction de subordination":"CS" ,"Conjonction de coordination":"CC"} for clé, valeur in dicoPoS.items(): print(clé, ":" ,valeur) patron=input("\nQuel patron? Separez chaque partie du discours par un espace\n") lisfic = [fic for fic in os.listdir("resultats") if fic.endswith(".tal") or fic.endswith(".tal.xml")] fic = input("Dans quel fichier? Fichiers possibles: \n"+ str(lisfic) +"\n") debut=time.time() extractionPatrons(patron, "resultats/"+fic) #renseigner le fichier Talismane dans lequel extraire print("temps d'éxécution", time.time()-debut) if input("afficher le resultat?" ).lower() == "oui": with open("resultats/patrons.txt", encoding="utf8") as fichier: print(fichier.read())