Commit e4489259 authored by Sylvain Coulange's avatar Sylvain Coulange
Browse files

réinitialisation du dépôt GitLab

parents
Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)
https://creativecommons.org/licenses/by-nc-sa/4.0/
\ No newline at end of file
# phon2graph
Phon2graph est un algorithme d'alignement graphophonémique du français. Il prend en entrée un mot et sa transcription et aligne chaque phonèmes aux graphèmes du mot. Ainsi le couple "bonjour" /bɔ̃ʒuʁ/ donne l'alignement /b/→b, /ɔ̃/→on, /ʒ/→j, /u/→ou, /ʁ/→r.
Phon2graph a été développé pour les besoins de l'application [WikiColor](http://wikicolor.alem-app.fr/), outil permettant de coloriser un texte en fonction de sa prononciation et selon l'approche Silent Way. Conformément à cette approche pédagogique, les sons /wa/ ou /ks/ sont donc considérés comme des phonèmes uniques. Le mot "oiseau" est donc aligné /wa/→oi, /z/→s, /o/→eau ; "exemple" est aligné /ɛ/→e, /ɡz/→x, /ɑ̃/→em, /p/→p, /l/→le.
Phon2graph utilise un dictionnaire de graphies (Fidel) qui liste toutes les graphies possibles pour chaque phonème de la langue. Pour les besoins de WikiColor, phon2graph représente également chaque phonème par un code inspiré du [X-SAMPA](https://fr.wikipedia.org/wiki/X-SAMPA), plus facilement manipulable informatiquement. Ces codes sont listés [ici](https://gricad-gitlab.univ-grenoble-alpes.fr/pedagogies-multimodales/phon2graph/-/blob/master/data/class2api.json).
## Fonctionnement de l'algorithme
### Prétraitements des chaînes de caractères en entrée
#### Prétraitement de la transcription
phon2graph ignore tous les caractères de la transcription inutiles à l'alignement, comme les points de segmentation des syllabes, les astérisques ou les parenthèses. Ces caractères sont présents dans le [dictionnaire phonétisé](https://gricad-gitlab.univ-grenoble-alpes.fr/pedagogies-multimodales/wikiphon) utilisé par WikiColor, mais ne sont pas utilisés pour l'alignement et sont donc supprimés temporairement pour permettre l'alignement. Voici la liste complète des caractères supprimés : `.͡* ()‿`
#### Prétraitement du mot
Pour le mot, phon2graph supprime temporairement les espaces et les tirets.
### Alignement
Phon2graph boucle sur la transcription et tente d'aligner chaque phonème, un par un, à la plus longue graphie possible dans le mot, étant donné la liste des graphies suggérées par le Fidel pour le phonème en question. À chaque alignement, le phonème aligné et la graphie choisie sont supprimées. Le programme s'arrête quand tous les phonèmes ont été alignés et qu'il ne reste plus de lettres dans le mot. Pour des raisons de simplicité, l'alignement se fait en partant de la fin.
Il arrive bien sûr que la graphie à choisir ne soit pas la plus longue (comme "essentiel" où /s/ peut être aligné à "ssent" ou "sent", mais doit l'être seulement à "t" pour arriver jusqu'à la fin du mot). Si un alignement ne permet pas d'aligner tous les phonèmes à tous les graphèmes, l'algorithme revient en arrière pour prendre une graphie moins longue. Actuellement, phon2graph peut revenir jusqu'à deux phonèmes en arrière si l'alignement ne convient pas. Il ne s'est pas encore révélé nécessaire de remonter plus loin dans les choix de l'algorithme.
Voici les phases d'alignement d'un mot qui ne présente pas de difficulté : "bonjour"
1. "bonjour" /bɔ̃ʒuʁ/ : ʁ → 'r'
2. "bonjou" /bɔ̃ʒu/ : u → 'ou'
3. "bonj" /bɔ̃ʒ/ : ʒ → 'j'
4. "bon" /bɔ̃/ : ɔ̃ → 'on'
5. "b" /b/ : b → 'b'
### Identification du phonème à aligner
Par défaut, chaque caractère de la transcription est considéré comme un phonème à aligner (/a/, /t/, /z/ etc.). Cependant, dans certains cas plusieurs caractères constituent un seul phonème, comme /ks/ ou /tʃ/, ou encore /ɛ̃/ (la nasalisation étant un caractère à elle seule `ɛ̃`) mais aussi /wa/ ou /wɛ̃/ par exemple). Dans ce cas, une série de règles permettent de traiter la suite de caractère comme un seul phonème.
#### Cas de /wɛ̃/
Si les trois derniers caractères de la transcription sont 'wɛ̃', ils sont traités ensemble comme un seul phonème. L'algorithme tente alors un alignement sur les graphies de /wɛ̃/ (oin,oint,oins,oints,oing,oings,ouin,ouins,ooing,ooings...).
#### Cas des phonèmes bigraphes
Si les deux derniers caractères de la transcription font partie de la liste des phonèmes bigraphes ('ts','tʃ','dz','dʒ','ks','ɡz','wa','ɥi','ij','ɑ̃','ɔ̃','ɛ̃'), ils sont à traiter ensemble comme un seul phonème, _sauf dans les cas suivants :_
- le bigraphe est 'ks' et le mot se termine par 'xc' (comme "excellent"), dans ce cas on considère les deux caractères comme deux phonèmes indépendants ('x' est aligné à /k/ et 'c' à /s/);
- le bigraphe est 'ks' et le mot *ne se termine pas* par 'x' (comme dans "fonction") /s/ est aligné à 't' et /k/ à 'c';
- le bigraphe est 'dʒ' et le mot termine par 'dj' ou 'dg' ("adjectif", "badge"), alors /ʒ/ est aligné à 'j' ou 'g' et /d/ est aligné à 'd';
- le bigraphe est 'ɥi' et le mot *ne se termine pas* par 'u', dans ce cas on considère les phonèmes /ɥ/ et /i/ indépendamment *(vérifier si cette règle sert à quelque chose, à la base elle servait à faire un 'u' bicolore mais on l'a changé pour Alexandre)*;
- le bigraphe est 'ij' et le mot finit par 'lle', 'lles' ou 'llent' (trille, quilles, pillent...), dans ce cas on aligne /j/ à ces graphies-là et /i/ à 'i', pour éviter un "ille" bicolore.
### Identification de la graphie cible
Lorsque le phonème à aligner est identifié, phon2graph récupère la liste de ses graphies dans le Fidel, puis sélectionne toutes les graphies alignables dans le mot. Par exemple dans le mot "passes" /pas/, l'alignement du dernier phonème peut se faire sur 's', 'ses' ou 'sses'. Aligner ici /s/ sur 's' ne permettrait pas de terminer l'alignement, l'aligner sur 'ses' donnerait un alignement incorrect : /p/→p, /a/→as, /s/→ses. Par défaut, phon2graph choisit donc en priorité la graphie la plus longue.
Mais la plus longue graphie ne convient pas toujours. Dans "château", aligner /a/ à "hâ" ne permettrait pas de terminer l'alignement, une règle permet donc d'éviter les graphies commençant par un 'h' si le caractère précédent ce 'h' fait partie des caractères suivants : "c s p t w g r". Dans ces cas précis, la probabilité que le 'h' fasse partie de la graphie suivante est plus grande ("wh","ph","th","ch","sth","ch","sh","sch","cch","ch","gh","rrh","rh"). La majorité des alignements convient, mais il reste quelques rares problèmes : "désherber" ou "déshydrater", pour lesquels l'alignement plante (/z/→'sh' impossible) ; "Bouddhisme" qui est aligné par défaut "dd hi" (notons ici que si on ajoute "d" à la liste des exceptions, "adhésion" sera aligné "dh é") ; "stakhanoviste" ou "kolkhoze" pour lesquels 'h' appartient à la graphie de /a/ et /ɔ/).
Si toutefois le choix de la graphie ne permet pas de terminer l'alignement, et qu'il reste des phonèmes ou des graphèmes non alignés à la sortie de la boucle, ou que l'alignement d'un phonème est impossible sur le mot restant, l'algorithme revient en arrière pour prendre une graphie moins longue et retenter un alignement. Si le phonème précédent n'a pas d'autres graphies possibles, il remonte au phonème encore précédent. La configuration actuelle de l'algorithme permet de revenir jusqu'à 2 phonèmes en arrière, cela semble être suffisant.
Voici un exemple pour illustrer le retour en arrière de l'algorithme :
"essentiel" /esɑ̃sjɛl/
1. "essentiel" /esɑ̃sjɛl/ : l → 'l'
2. "essentie" /esɑ̃sjɛ/ : ɛ → 'e'
3. "essenti" /esɑ̃sj/ : j → 'i'
4. "essent" /esɑ̃s/ : s → 'ssent' (ou 'sent', 't')
5. "essen" /esɑ̃/ : ɑ̃ → 'e'
6. "ess" /es/ : s → **alignement impossible** : on revient au phonème précédent
7. "essen" /esɑ̃/ : ɑ̃ → il n'y a pas d'autres graphies possibles ici : on revient au phonème d'encore avant
8. "essent" /esɑ̃s/ : il reste 'sent' et 't'. On prend la plus longue
9. "es" /esɑ̃/ : ɑ̃ → **alignement impossible** : on revient au phonème précédent
10. "essent" /esɑ̃s/ : s → il reste 't'. On le prend.
11. "essen" /esɑ̃/ : ɑ̃ → 'en'
12. "ess" /es/ : s → 'ss' (ou 's')
13. "e" /e/ : e → 'e'
Résultat : /e/→e, /s/→ss, /ɑ̃/→en, /s/→j, /ɛ/→e, /l/→l
*Phon2graph est écrit en Python version 3.7.1*
# -*- encoding:utf8 -*-
######### phon2graph.py #########
#
# Version Python 3.7.1
#
# Prend en entrée :
# - dictionnaire phonème→couleur (phoneme-couleur.csv)
# - dictionnaire phonème→graphies (Fidel) (phoneme-graphies_fr.scsv)
# - dictionnaire phonétisé (dico_frwiki.csv)
#
# Sylvain Coulange (2020)
# cf. README pour explications détaillées
import re
from phon2graph import decoupage
############ DÉCLARATIONS DES CHEMINS ############
phonColFile = "data/class-phoneme_v2.csv"
fidelFilePath = "data/phoneme-graphies_fr.scsv"
dicoFilePath = "../wikiphon/dico_frwiktionary-20200301-alpha.csv"
##################################################
# LECTURE DU DICTIONNAIRE PHONEME-CLASSE
phonFile = open(phonColFile,mode="r")
phon2class = {}
phonCpt = 0
for line in phonFile:
line = line.strip()
l= line.split(',')
if len(l) == 2:
phonId,phon = l
phon2class[phon]=phonId
phonCpt += 1
print(phonCpt,"classes-phonèmes détectées.")
phonFile.close()
# LECTURE DU DICTIONNAIRE PHONEME-GRAPHIES (FIDEL)
fidel = open(fidelFilePath,mode="r")
phon2graph = {}
phonCpt = 0
graphCpt = 0
for line in fidel:
phonCpt+=1
line = line.strip()
l= line.split(':')
phon2graph[l[0]] = []
listegraphies = l[1].split(',')
for graph in listegraphies:
phon2graph[l[0]].append(graph)
graphCpt+=1
print(phonCpt,"phonèmes pour le français.")
print(graphCpt,"graphies extraites du Fidel français.")
fidel.close()
# LECTURE DU DICTIONNAIRE PHONÉTISÉ
dicoFile = open(dicoFilePath,mode="r")
wordtrans = []
wordCpt = 0
for line in dicoFile:
line = line.strip()
l = line.split('§')
if len(l) == 2:
mot,trans = l
wordCpt += 1
wordtrans.append((mot,trans))
print(wordCpt,"mots enregistrés depuis le dictionnaire phonétisé.")
dicoFile.close()
# INTERFACE
quit = False
while not quit:
print("Tapez un mot à découper (ou $ pour quitter)...")
mot = input()
result = []
if mot == "$":
quit = True
break
for mottrans in wordtrans:
if mottrans[0].lower() == mot:
result.append(mottrans)
bolres = True
print(len(result),'résultats trouvés !')
for i,j in result:
print(i,':',j,' → découpage :',decoupage(i,j,phon2graph,phon2class))
wordtrans = []
# problèmes restants : couvent/couvent fils/fils est/est → analyse syntaxique avec Spacy possible
# problèmes restants : CD-ROM, T-shirt, SNCF...
# REMARQUES:
# Pistes : Apprentissage automatique des patterns de transcription →quel algo?
# Pistes : modèle statistique (dans tel contexte graphique, quel pourcentage pour chaque graphie du phonème?) →ngram
# Pistes : grammaire de règles prenant en compte la position de la graphie dans le mot. [ɛ] ne s'écrira "aid" qu'à la fin d'un mot.
# Débat sur forum : https://openclassrooms.com/forum/sujet/comment-decoupe-une-chaine-de-caractere-en-syllabe-23388
phon_1,ɨ
phon_2,ø
phon_4,ɾ
phon_7,ɤ
phon_9,œ
phon_9_nas,œ̃
phon_a_maj,ɑ
phon_a,a
phon_arob_rho,ɚ
phon_arobase,ə
phon_a_maj_nas,ɑ̃
phon_b,b
phon_b_maj,β
phon_d,d
phon_d_maj,ð
phon_e,e
phon_e_maj,ɛ
phon_e_maj_nas,ɛ̃
phon_f,f
phon_g,ɡ
phon_x,x
phon_h_maj,ɥ
phon_i,i
phon_i_maj,ɪ
phon_j,j
phon_k,k
phon_k_h,kʰ
phon_l,l
phon_m_maj,ɯ
phon_m,m
phon_n_maj,ŋ
phon_n,n
phon_o,o
phon_o_maj,ɔ
phon_o_maj_nas,ɔ̃
phon_p,p
phon_p_bilab,ɸ
phon_p_h,pʰ
phon_r_maj,ʁ
phon_r_retr,ɻ
phon_s_maj,ʃ
phon_s,s
phon_s_alvpal,ɕ
phon_s_retr,ʂ
phon_t,t
phon_t_maj,θ
phon_t_h,tʰ
phon_u,u
phon_u_maj,ʊ
phon_v,v
phon_w,w
phon_y,y
phon_z_maj,ʒ
phon_z,z
phon_z_alvpal,ʑ
phon_z_retr,ʐ
phon_wa,wa
phon_we_maj_nas,wɛ̃
phon_ts,ts
phon_ts_maj,tʃ
phon_dz,dz
phon_dz_maj,dʒ
phon_ks,ks
phon_gz,ɡz
phon_ij,ij
phon_h_maj_i,ɥi
phon_nj,ɲ
{
"phon_1":"ɨ",
"phon_2":"ø",
"phon_4":"ɾ",
"phon_7":"ɤ",
"phon_9_nas":"œ̃",
"phon_9":"œ",
"phon_a_maj_nas":"ɑ̃",
"phon_a_maj":"ɑ",
"phon_a":"a",
"phon_arob_rho":"ɚ",
"phon_arobase":"ə",
"phon_b_maj":"β",
"phon_b":"b",
"phon_d_maj":"ð",
"phon_d":"d",
"phon_dz_maj":"dʒ",
"phon_dz":"dz",
"phon_e_maj_nas":"ɛ̃",
"phon_e_maj":"ɛ",
"phon_e":"e",
"phon_f":"f",
"phon_g":"ɡ",
"phon_gz":"ɡz",
"phon_h_maj_i":"ɥi",
"phon_h_maj":"ɥ",
"phon_i_maj":"ɪ",
"phon_i":"i",
"phon_ij":"ij",
"phon_j":"j",
"phon_k_h":"kʰ",
"phon_k":"k",
"phon_ks":"ks",
"phon_l":"l",
"phon_m_maj":"ɯ",
"phon_m":"m",
"phon_n_maj":"ŋ",
"phon_n":"n",
"phon_nj":"nj",
"phon_o_maj_nas":"ɔ̃",
"phon_o_maj":"ɔ",
"phon_o":"o",
"phon_p_bilab":"ɸ",
"phon_p_h":"pʰ",
"phon_p":"p",
"phon_r_maj":"ʁ",
"phon_r_retr":"ɻ",
"phon_s_alvpal":"ɕ",
"phon_s_maj":"ʃ",
"phon_s_retr":"ʂ",
"phon_s":"s",
"phon_t_h":"tʰ",
"phon_t_maj":"θ",
"phon_t":"t",
"phon_ts_maj":"tʃ",
"phon_ts":"ts",
"phon_u_maj":"ʊ",
"phon_u":"u",
"phon_v":"v",
"phon_w":"w",
"phon_wa":"wa",
"phon_we_maj_nas":"wɛ̃",
"phon_x":"x",
"phon_y":"y",
"phon_z_alvpal":"ʑ",
"phon_z_maj":"ʒ",
"phon_z_retr":"ʐ",
"phon_z":"z"
}
\ No newline at end of file
a:a,à,at,ah,ac,act,ach,ap,e,as,â,ats,ha,acs,acts,achs,aps,ao,az,ât,âts,hâ,ars
b:b,be,bb,bes,bent,bs
d:d,de,dd,des,dent,ds,d’
e:é,és,ée,ées,es,ai,ez,et,er,ers,ef,efs,ed,eds,æ,a,éent,he,hé,ë,ës,ê,œ,e
f:f,fe,ff,fes,fent,ffe,ffes,ffent,fs,ph,phe,phes,phent
ɡ:g,gue,gues,guent,gg,gu,gh,gs,c
i:i,is,it,ie,ix,il,id,iz,ï,î,ît,ye,ee,ea,ït,ïe,ïs,y,ys,its,ies,ient,ils,ids,hi,hy,hî,hît,hit,his,hie,hies,ïes,yg,yes
j:y,lle,ll,lles,llent,i,il,ill,ille,illes,illent,illi,ils,ye,yes,yent,yi,ï,ïe,lli,l,hi,hy,j,͜,‿
k:c,ch,cc,cs,k,ke,ck,cks,chs,x,q,qu,qu’,qs,que,ques,quent,cqu,cque,cques,cch
l:l,le,ll,les,lent,lle,lles,llent,ls,l’
m:m,me,mm,mes,ment,mme,mmes,mment,ms,m’
n:n,ne,nn,nes,nent,nne,nnes,nnent,ns,mn,mne,mnes,mnent,n’,‿
o:ô,o,au,ot,ôt,op,oc,aut,aud,hot,ho,hau,haut,hauts,heau,aulx,aux,eau,eaux,aux,ots,ôts,ops,ocs,auts,auds,hots,oh,hô,os
p:p,pe,pp,pes,pent,ppe,ppes,ppent,ps,b,‿
s:s,se,ss,ses,sent,sse,sses,ssent,sth,sc,sce,sces,scent,ce,ces,cent,s’,c,ç,c’,t,sç,x,ls
t:t,te,tt,tes,tent,tte,ttes,ttent,ts,th,the,thes,pt,d,cht,chts,t’,‿
u:ou,où,ous,oux,oup,out,oue,oû,oud,oût,ouc,oug,aou,oo,ow,oub,houent,ouent,hou,houe,houes,houx,oups,outs,oues,oûts,ouds,août,oucs,ougs,aoul,aouls,ouls,oubs
v:v,ve,ves,vent,w,we,wes,went,f,‿
y:u,û,eu,ue,eû,ux,ut,ût,uë,hu,hut,hue,ul,uent,huent,us,eus,eut,eue,eues,eût,uts,ûts,uës,hues,huts,ues,uls
z:s,se,x,ses,sent,z,ze,zes,zent,zz,‿
ɑ:a,as,ât,ha,ah,â,az,âts,hâ,ars
ɛ:è,ê,e,ei,es,ai,a,ay,et,est,êt,ë,aie,ès,ait,aid,ey,ets,hè,hê,he,hai,ect,œ,aî,ais,êts,aix,aies,aits,aient,aids,eys,hais,hait,haits,haie,haies,ects,eî,aît,é
ɥ:u,hu,ü
w:w,wh,ou,hou,hu,u,o
ɲ:gn,gne,gni,gnes,gnent,ni
ŋ:ng,ngs
ɔ:o,ho,au,u,oi,oo,a,ü
ʁ:r,re,rr,res,rent,rre,rres,rrent,rh,rrh,rrhe,rrhes,rs,rt,rts,rd,rds,rf,rfs,rc,rcs,rg,rgs,rps,‿
ʃ:ch,che,sch,ches,chent,chs,sh
ʒ:j,ge,g,ges,gent,j’,je
ə:e,ai,on,es
ø:eu,eux,œufs,eur,eurs,eus,eue,eues,eut,œu,œux,œud,œuds,eû,heu,euh,œh
œ:eu,œu,heu,ue,œ,u
œ̃:un,hun,hum,huns,um,ums,eun,uns,unt,unts
ɛ̃:in,en,ens,im,ent,ing,ïn,aim,ins,int,hen,hin,în,înt,inq,yn,ym,ain,ein,eins,eint,eints,ingt,ingts,aims,inc,inct,incts,ainc,aincs,aint,aints,ains,yms,aing,aings,eing,eings,hein
ɔ̃:on,ont,onc,ond,ong,om,omb,ombs,omp,omps,ompt,ompts,hon,ons,onts,onc,oncs,onds,ongs,oms,un
ɑ̃:en,an,ant,em,hen,han,ham,am,ent,end,eng,aon,and,anc,ang,e,ens,ans,ants,emps,empts,amp,amps,ents,ends,engs,aons,ands,ancs,angs
ts:ts
tʃ:ch,chs
dz:zz
dʒ:j,g
ks:x,xe,xes,xent
ɡz:x
wa:oi,oî,oe,oê,o,ua,oie,oix,oid,oig,hoi,oye,a,ois,oîs,oît,oit,oits,oua,oies,oient,oids,oigt,oigts,oyes,at
wɛ̃:oin,oint,oins,oints,oing,oings,ouin,ouins,ooing,ooings
ij:i,y,hi
ɥi:u
.:.
# -*- encoding:utf8 -*-
######### phon2graph.py #########
#
# Version Python 3.7.1
#
# Prend en arguments :
# - un mot
# - sa transcription
# - un dictionnaire qui donne chaque graphie pour chaque phonème
# - un dictionnaire qui donne la classe de chaque phonème (classe css pour afficher en couleurs)
#
# Mode verbose : passer mode_verbose à True dans la fonction printlog()
#
# Sylvain Coulange (2020)
# cf. README pour explications détaillées
import re
def printlog(*txt):
mode_verbose = False # à passer en True pour afficher le détail dans la console
if mode_verbose:
outp = ''
for i in txt:
outp += str(i)+' '
print(outp)
# DECOUPAGE PHONOGRAPHEMIQUE
def decoupage(mot,trans,phon2graph,phon2class):
phonographie = []
# Listes des exceptionss
scphListe = ['s','c','p','t', 'w', 'g', 'r'] # avec -h donnent 1 phonème (reste problème avec désherber...) FidelDo : "ah","ach","euh","ah","oh","wh","ph","th","ch","sth","ch","sh","sch","cch","ch","gh","rrh","rh"
xListe = ['ts','tʃ','dz','dʒ','ks','ɡz','wa','ɥi','ij','ɑ̃','ɔ̃','ɛ̃','œ̃'] # peuvent donner 1 graphème
# Prétraitements de la transcription et du mot orthographié
trans = trans.replace('.','')
trans = trans.replace('‿','')
trans = trans.replace(' ','')
trans = trans.replace('(','')
trans = trans.replace(')','')
trans = trans.replace('͡','')
trans = trans.replace('*','')
mot = mot.lower()
mot = mot.replace('-','')
mot = mot.replace(' ','')
# Déclarations préalables des mémoires 1 et 2
graphWinners_precedent2 = []
graphWinners_precedent = []
mot_save2 = ''
mot_save = ''
phon_save2= ''
phon_save = ''
trans_save2 = ''
trans_save = ''
echec = False # permet de renvoyer le mot sans trancription si impossible à coloriser (ex CM2)
motOrigin = mot # permet de renvoyer le mot d'origine
# Association phonème→graphème
# Boucle sur la chaîne de phonèmes à partir du dernier
while trans != '':
printlog('##################################')
printlog('Départ : "',mot,'", [',trans,']')
# Traitement des caractères phonèmes à prendre par trois (wɛ̃)
if trans[-3:]=='wɛ̃':
phon = trans[-3:]
#trans = trans[:-2]
# Traitement des caractères phonèmes à prendre par deux
elif trans[-2:] in xListe:
# EXCEPTIONS
if trans[-2:]=='ks' and re.match(r'^.*xc$',mot): # permettre 'xc' comme [ks]
phon = trans[-1]
elif trans[-2:]=='ks' and not re.match(r'^.*x$',mot): # éviter de traiter 'ct' (fonction) comme [ks]
phon = trans[-1]
elif trans[-2:]=='dʒ' and re.match(r'^.*dj.*$',mot) or re.match(r'^.*dg.*$',mot): # si 'dj' (adjectif) alors 'j' = [ʒ] et pas [dʒ] pareil pour badge
phon = trans[-1]
elif trans[-2:]=='ɥi' and not mot[-1]=='u': # vérifier si cette règle sert à qqchose
phon = 'i'
elif trans[-2:]=='ij' and re.match(r'^.*ll[ents]*$',mot): # permettre ill comme [ij] #gri lle
phon = trans[-1]
else:
phon = trans[-2:]
#trans = trans[:-1]
# Sinon le phonème correspond au dernier caractère de la transcription
else:
phon = trans[-1]
printlog("Cherche : [",phon,"]")
# Récupération des graphies possibles dans le Fidel étant donné le mot
graphWinners = [] # liste de 2 possibilités de graphie (dans le cas où ce n'est pas la graphie la plus longue qu'il faut choisir)
if phon in phon2graph.keys():
# Boucle sur la liste de graphies possible pour le phonème phon
for graph in phon2graph[phon]:
# On cherche cette graphie dans la fin du mot
s = re.match(r'^.*'+graph+'$',mot)
if s and graph[0]=='h' and len(mot)>len(graph) and mot[-(len(graph)+1)] in scphListe:
# si la graphie commence par h, et la lettre qui précède dans le mot fait partie de scphListe, alors on ne prend pas cette graphie (le h fait partie du phonème suivant)
# pour les graphies commençant par h, si le mot est plus long que la graphie on aligne h avec le phonème suivant (télé ph one, th éâtre)
printlog('!! trouvé',graph,'; on laisse',graphWinners)
elif s :
graphWinners.append(graph)
printlog('trouvé',graph)
else:
printlog('Phonème',phon,'non trouvé dans le Fidel !')
graphWinners = sorted(graphWinners, key=len) # on réordonne les graphies par taille
printlog(graphWinners)
if len(graphWinners)>0:
printlog('OK len(graphWinners)>0',graphWinners, 'ajout de :', graphWinners[-1])
phonographie.append((phon2class[phon],graphWinners[-1]))
# MISES EN MÉMOIRE (1→2, courant→1)
graphWinners_precedent2 = graphWinners_precedent # on fait passer la mémoire des autres graphies du phonème précédent dans la seconde mémoire avant d'écraser la première avec la liste des graphies du phonème courant (cas de essentiellement, on doit revenir 2 phonèmes en arrières)
printlog('update graphWinners_precedent2 :',graphWinners_precedent2)
graphWinners_precedent = graphWinners[:-1] # on garde en mémoire la liste des autres graphies possibles pour y revenir si besoin
printlog('update graphWinners_precedent :',graphWinners_precedent)
phon_save2 = phon_save
printlog('update phon_save2 :',phon_save2)
phon_save = phon # on garde en mémoire le phonème aussi
printlog('update phon_save :',phon_save)
mot_save2 = mot_save # on passe mot_save dans la deuxième mémoire
mot_save = mot # on passe mot en mémoire avant de lui enlever les lettres de la graphies choisie
trans_save2 = trans_save # on passe trans_save dans la deuxième mémoire
trans_save = trans # on garde en mémoire l'état actuel de la transcription
# MISE À JOUR DE mot ET trans
mot = mot[:-len(graphWinners[-1])]
trans = trans[:-len(phon)] # et on enlève le dernier phonème pour passer au suivant
printlog('trans :',trans_save,'→',trans)
printlog('phonographie :',phonographie)
elif len(graphWinners_precedent) > 0:
# Cas où on a pas trouvé de graphie pour le phonème courant, parce que la graphie précédente n'était pas la bonne (elle est trop longue)
remplacant = graphWinners_precedent[-1]
printlog("Aucune graphie touvée ! → On revient sur le dernier phonème et on prend sa graphie suivante :", remplacant)
phonographie = phonographie[:-1] # on supprime la dernière graphie (qui n'était pas la bonne)
phonographie.append((phon2class[phon_save],remplacant)) # on y met à la place le graphie suivante avec son phonème
# CORRECTION DES VARIABLES
trans = trans_save # on remet la transcription du coup d'avant (avant de la tronquer plus bas)
mot = mot_save # pareil avec le mot
# MISES EN MÉMOIRE (1→2, courant→1)
#graphWinners_precedent2 = graphWinners_precedent[:-1] # on fait passer la mémoire des autres graphies du phonème précédent dans la seconde mémoire avant d'écraser la première avec la liste des graphies du phonème courant (cas de essentiellement, on doit revenir 2 phonèmes en arrières)
printlog('update graphWinners_precedent2 :',graphWinners_precedent2)
graphWinners_precedent = graphWinners_precedent[:-1] # on garde en mémoire la liste des autres graphies possibles pour y revenir si besoin
printlog('update graphWinners_precedent :',graphWinners_precedent)
phon_save2 = phon_save2
printlog('update phon_save2 :',phon_save2)
phon_save = phon_save # on garde en mémoire le phonème aussi
printlog('update phon_save :',phon_save)
mot_save2 = mot_save # on passe mot_save dans la deuxième mémoire
mot_save = mot # on passe mot en mémoire avant de lui enlever les lettres de la graphies choisie
trans_save2 = trans_save # on passe trans_save dans la deuxième mémoire
trans_save = trans # on garde en mémoire l'état actuel de la transcription
# MISE À JOUR DE mot ET trans
mot = mot[:-len(remplacant)]
trans = trans[:-len(phon_save)] # et on enlève le dernier phonème pour passer au suivant (attention phon_save est passé à save2)
printlog('trans :',trans_save,'→',trans)
printlog('phonographie :',phonographie)
elif len(graphWinners_precedent2) > 0:
# Si pas d'autres graphies possibles pour le phonème précédent, on va chercher la graphie suivante du phonème d'avant
remplacant = graphWinners_precedent2[-1]
phonConcerne = phon_save2
printlog("Aucune graphie touvée ! Ni pour le phonème d'avant ! → on va chercher la graphie suivante du phonème encore avant :",remplacant)
phonographie = phonographie[:-2] # on supprime les 2 dernières graphies (qui n'étaient pas la bonnes)
phonographie.append((phon2class[phonConcerne],remplacant)) # on y met à la place le graphie suivante avec son phonème
# CORRECTION DES VARIABLES
trans = trans_save2 # on remet la transcription du coup d'avant (avant de la tronquer plus bas)
mot = mot_save2 # pareil avec le mot
# MISES EN MÉMOIRE (1→2, courant→1)
#graphWinners_precedent2 = graphWinners_precedent2[:-1] # on fait passer la mémoire des autres graphies du phonème précédent dans la seconde mémoire avant d'écraser la première avec la liste des graphies du phonème courant (cas de essentiellement, on doit revenir 2 phonèmes en arrières)
printlog('update graphWinners_precedent2 :',graphWinners_precedent2)
graphWinners_precedent = graphWinners_precedent2[:-1] # on garde en mémoire la liste des autres graphies possibles pour y revenir si besoin
printlog('update graphWinners_precedent :',graphWinners_precedent)
phon_save2 = phon_save
printlog('update phon_save2 :',phon_save2)
phon_save = phon # on garde en mémoire le phonème aussi
printlog('update phon_save :',phon_save)
mot_save2 = mot_save # on passe mot_save dans la deuxième mémoire
mot_save = mot # on passe mot en mémoire avant de lui enlever les lettres de la graphies choisie
trans_save2 = trans_save # on passe trans_save dans la deuxième mémoire
trans_save = trans # on garde en mémoire l'état actuel de la transcription
# MISE À JOUR DE mot ET trans
mot = mot[:-len(remplacant)]
trans = trans[:-len(phonConcerne)] # et on enlève le dernier phonème pour passer au suivant (attention phon_save2 a été écrasé donc il faut le garder en mémoire temporaire (phonConcerne))
printlog('trans :',trans_save,'→',trans)
printlog('phonographie :',phonographie)
else:
printlog('AUCUNE GRAPHIE TROUVÉE POUR CE MOT !')
echec = True
break
if echec:
printlog("Mot impossible à coloriser. Renvoie du mot sans couleur.")
phonographie = [('phon_neutre',motOrigin)]
printlog(("Phonographie :",phonographie))
else:
# Si le mot a bien été colorisé jusqu'à la fin
# On remet tout dans l'ordre et on envoie
phonographie.reverse()
printlog("FINI !",phonographie)
printlog("###########")
printlog("###########")
return phonographie # revoie donc un liste de (phonème(s), graphème(s))
\ 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