Commit 970ff284 authored by Sylvain Coulange's avatar Sylvain Coulange
Browse files

finalisation script analyse morphosyntaxique pour le français pour le suivi de modifications

parent ef94bdca
from bs4 import BeautifulSoup as bs
import re, difflib
import re
import spacy
nlp = spacy.load("fr_core_news_md")
fs = 'g1jpfr/g1jpfr_source.xml'
......@@ -31,33 +34,111 @@ xrPliste = xr.find_all('P')
xfPliste = xf.find_all('P')
# for i,xiP in enumerate(xiPliste):
x1 = ""
x2 = ""
# # Décommenter pour visualiser le chemin
# x1 = "^"
# x2 = "*"
def checkBefore(edit, etat):
avant = ""
if edit.previous_sibling != None:
elgauche = edit.previous_sibling
if str(elgauche)[:5] == "<edit":
# si elgauche est une balise edit
if re.match(r'^\w+$|^’\w*$|^$', str(elgauche[etat])):
# si etat ne commence pas par [ .,]
avant += x2 + checkBefore(elgauche, etat) + x2
avant += x1 + elgauche[etat] + x1
elif str(elgauche)[-1] != ">":
# si elgauche est une string
if re.match(r'^\w+$|^’\w*$|^$', str(elgauche)):
# si la string ne contient qu'un mot sans espace, peut-être qu'il n'est pas entier: checkBefore()
avant += x2 + checkBefore(elgauche, etat) + x2
checkword = re.match(r".*?(\w+|\w*’)$", str(elgauche))
if checkword:
avant += x1 + checkword.group(1) + x1
return avant
# xrPini = re.sub(r'<edit auteur="[^"]*" categorie="correction" comment="[^"]*" date="[^"]*" final="[^"]*" idodf="[^"]*" initial="([^"]*)" resolu="1" tags="" type="[^"]*"/>', r'\1', str(xrPliste[i]))
# xrPfin = re.sub(r'<edit auteur="[^"]*" categorie="correction" comment="[^"]*" date="[^"]*" final="([^"]*)" idodf="[^"]*" initial="[^"]*" resolu="1" tags="" type="[^"]*"/>', r'\1', str(xrPliste[i]))
def checkAfter(edit, etat):
apres = ""
if edit.next_sibling != None:
eldroit = edit.next_sibling
if str(eldroit)[:5] == "<edit":
# si eldroit est une balise edit
if re.match(r'^\w+$|^’\w*$|^$', str(eldroit[etat])):
# si etat ne commence pas par [ .,]
firstWord = re.match(r'^(’\w*|\w+).*?$', str(eldroit[etat]))
tok = firstWord.group(1) if firstWord else ""
apres += x1 + tok + x1
apres += x2 + checkAfter(eldroit, etat) + x2
elif str(eldroit)[-1] != ">":
# si eldroit est une string
checkword = re.match(r"^(’\w*|\w+).*?$", str(eldroit))
if checkword:
apres += x1 + checkword.group(1) + x1
if re.match(r'^\w+$|^’\w*$|^$', str(eldroit)):
# si la string ne contient qu'un mot sans espace, peut-être qu'il n'est pas entier: checkAfter()
apres += x2 + checkAfter(eldroit, etat) + x2
# if xrPini != str(xiPliste[i]) or xrPfin != str(xfPliste[i]):
# print(i, xrPini == str(xiPliste[i]), xrPfin == str(xfPliste[i]))
return apres
def recupContext(edit, etat):
if len(edit[etat]) > 0:
# ETAT INITIAL DE LA TRADUCTION
avant = ""
apres = ""
#print("|{}|".format(edit[etat]))
if not re.match(r'^[ .,].*$', str(edit[etat])):
avant = checkBefore(edit, etat)
if not re.match(r'^.*[ .,]$', str(edit[etat])):
apres = checkAfter(edit, etat)
# i = 1
contexte = avant + edit[etat] + apres
txt = nlp(contexte)
tags = []
for token in txt:
tags.append(token.tag_)
# xrPini = re.sub(r'<edit auteur="[^"]*" categorie="correction" comment="[^"]*" date="[^"]*" final="[^"]*" idodf="[^"]*" initial="([^"]*)" resolu="1" tags="" type="[^"]*"/>', r'\1', str(xrPliste[i]))
# xrPfin = re.sub(r'<edit auteur="[^"]*" categorie="correction" comment="[^"]*" date="[^"]*" final="([^"]*)" idodf="[^"]*" initial="[^"]*" resolu="1" tags="" type="[^"]*"/>', r'\1', str(xrPliste[i]))
#print("\033[0;35m{}\033[0m|{}|\033[0;35m{}\033[0m".format(avant, edit[etat], apres))
print("{}:\t\033[0;35m{}\033[0m{}\033[0;35m{}\033[0m\tTAGS:{}".format(edit['idodf'],avant, edit[etat], apres, tags))
# diff1 = difflib.ndiff(xrPini, str(xiPliste[i]))
# diff2 = difflib.ndiff(xrPfin, str(xfPliste[i]))
# for dif in diff2:
# print(dif)
for x,r in enumerate(xrPliste):
print('\nP',x)
edits = xrPliste[x].find_all('edit')
for edit in edits:
recupContext(edit,'initial')
recupContext(edit,'final')
######### TESTS SPACY #########
"""
Black 0;30 Dark Gray 1;30
Blue 0;34 Light Blue 1;34
Green 0;32 Light Green 1;32
Cyan 0;36 Light Cyan 1;36
Red 0;31 Light Red 1;31
Purple 0;35 Light Purple 1;35
Brown 0;33 Yellow 1;33
Light Gray 0;37 White 1;37
"""
# import spacy
# nlp = spacy.load("fr_core_news_md")
######### Code pour récupérer les énoncés entiers #########
'''
for x,p in enumerate(xrPliste):
# # RECUPERER LA VERSION INITIALE ET LA VERSION FINALE
# xrPini = re.sub(r'<edit auteur="[^"]*" categorie="correction" comment="[^"]*" date="[^"]*" final="[^"]*" idodf="[^"]*" initial="([^"]*)" resolu="1" tags="" type="[^"]*"/>', r'\1', str(xrPliste[i]))
......@@ -97,80 +178,4 @@ for x,p in enumerate(xrPliste):
# tags.append((tok.pos_,tok.tag_))
# print(i[3], '\t', exp, '\t', tags)
def checkBefore(edit, etat):
avant = ""
elgauche = edit.previous_sibling
search = re.match(r'(\w+)$', str(elgauche))
if search:
# si il y a un mot juste avant (sans espace entre le mot et la balise courante), on récupère le mot
avant = search.group(1)
search = re.match(r' ', str(elgauche))
if not search:
# si il n'y a pas d'espace dans previous_sibling, on checkBefore(), sinon on s'arrête
avant = checkBefore(elgauche.previous_sibling, etat) + avant
elif re.match(r'/>$', str(elgauche)):
# si l'élément gauche est une balise edit, on récupère la valeur de l'état
avant = elgauche[etat] + avant
if not re.match(r'^[ ,.]', elgauche[etat]):
# si pas d'espace au début de la valeur de l'état, on checkBefore()
avant = checkBefore(elgauche.previous_sibling, etat) + avant
return avant
def checkAfter(edit, etat):
apres = ""
eldroit = edit.next_sibling
search = re.match(r'^(\w+)', str(eldroit))
if search:
# si il y a un mot juste apres (sans espace entre le mot et la balise courante), on récupère le mot
apres = search.group(1)
search = re.match(r' ', str(eldroit))
if not search:
# si il n'y a pas d'espace dans next_sibling, on checkAfter(), sinon on s'arrête
apres += checkAfter(eldroit.next_sibling, etat)
elif re.match(r'/>$', str(eldroit)):
# si l'élément droit est une balise edit, on récupère la valeur de l'état
apres += eldroit[etat]
if not re.match(r'[ ,.]$', eldroit[etat]):
# si pas d'espace à la fin de la valeur de l'état, on checkAfter()
apres += checkAfter(eldroit.next_sibling, etat)
return apres
# def checkAfter(edit, etat):
# apres = ""
# if edit[etat][-1] != ' ' and edit[etat][0] != ' ':
# search = re.match(r'^(\w+)', str(edit.next_sibling))
# if search:
# apres = search.group(1)
# elif re.match(r'^<edit', str(edit.next_sibling)):
# if edit.next_sibling[etat] != "":
# apres += edit.next_sibling[etat]
# apres += checkBefore(edit.next_sibling, etat)
# return apres
for x in range(0,15):
print('\nP',x)
edits = xrPliste[x].find_all('edit')
for edit in edits:
if len(edit['initial']) > 0:
# ETAT INITIAL DE LA TRADUCTION
etat='initial'
avant = ""
apres = ""
if not re.match(r'^[ ,.]', edit[etat]):
# si pas d'espace au début de la valeur de l'état, on checkBefore()
avant = checkBefore(edit, etat)
elif not re.match(r'[ ,.]$', edit[etat]):
# si pas d'espace à la fin de la valeur de l'état, on checkAfter()
apres = checkAfter(edit, etat)
print("{}|{}|{}".format(avant, edit[etat], apres))
'''
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment