Pour cet exercice, ont vous fournit des fonctions python qui peuvent vous être utiles. Ces fonction sont dans le fichier utilitaires.py
nbstring = 0 class erreur(Exception): pass class decoder: def __init__(self,type='ascii',isymbols=None,osymbols=None): self.type=type self.isymbols=isymbols self.osymbols=osymbols def decode(self, n, mode='in'): if n==0: return '' if self.type=='ascii': return(chr(n)) elif mode == 'in': return self.isymbols.find(n) else: return self.osymbols.find(n) def optimize(mach): mach.rmepsilon() res = fst.determinize(mach) res.minimize() return res def walk_inside(omach,state,inst,outst,acceptor,decoder): global nbstring if nbstring == 0: return wei = omach.final(state) if wei != fst.Weight.Zero(wei.type()): if acceptor: print(inst) else: print(inst+':'+outst) nbstring = nbstring - 1 for arc in omach.arcs(state): walk_inside(omach,arc.nextstate,inst+decoder.decode(arc.ilabel,'in'),\ outst+decoder.decode(arc.olabel,'out'),acceptor,decoder) def walk_inside_collect(omach,state,inst,outst,acceptor,decoder,lst): global nbstring if nbstring == 0: return wei = omach.final(state) if wei != fst.Weight.Zero(wei.type()): if acceptor: lst.append(inst) else: lst.append((inst,outst)) nbstring = nbstring - 1 for arc in omach.arcs(state): walk_inside_collect(omach,arc.nextstate,\ inst+decoder.decode(arc.ilabel,'in'),\ outst+decoder.decode(arc.olabel,'out'),acceptor,decoder,lst) def prepare(mach,dec=None,opt=True,rand=False,\ acceptor=False, num=None): global nbstring if dec==None: dec = decoder() if mach.properties(fst.CYCLIC, True) == fst.CYCLIC: if rand: if num == None: num = 1 omach = fst.randgen(mach,npath=num) else: raise erreur() else: if opt: omach = optimize(mach) else: omach = mach if num!=None: nbstring = num else: nbstring = 1000000 return (omach, dec) def print_strings(mach,decoder=None,opt=True,rand=False,\ acceptor=False, num=None): (omach,dec)=prepare(mach,decoder,opt,rand,acceptor, num) walk_inside(omach,omach.start(),'','',acceptor,dec) def collect_strings(mach,decoder=None,opt=True,rand=False,\ acceptor=False, num=None): (omach,dec)=prepare(mach,decoder,opt,rand,acceptor, num) res = [] walk_inside_collect(omach,omach.start(),'','',acceptor,dec,res) return res def compile_string(stri): compiler = fst.Compiler() stn = 0 for st in stri: chn = ord(st) lig = str(stn) + "\t" + str(stn+1) + "\t"+str(chn)+"\t"+str(chn) print >> compiler, lig stn = stn + 1 print >> compiler, stn return compiler.compile()
Les trois fonctions utiles fournies par ce fichier sont print_strings pour afficher les chaînes ou les paires de chaînes d'une machine finie, collect_strings qui renvoie les chaînes ou paires de chaînes dans une liste python et compile_string qui compile une chaîne en un automate. Ces trois fonctions utilisent par défaut l'ascii comme table de symboles.
On va faire des extractions de nature textuelle dans du texte en ascii. Créez les machines nécessaires pour extraire tous les mots composés d'un texte. On considère qu'un mot composé comporte une série de lettres, un trait d'union et une autre série de lettres.
Testez ce code sur un chapitre de texte donné ici: Le Grand d'Espagne
Pour cet exercice, il est utile de distinguer les lettres des autres caractères. Vous pouvez utiliser la liste de lettres suivantes (en python ou en opengrm) qui comporte toutes les lettres du code iso-8859-15:
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ¦¨´¸¼½¾ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
Vous constatez qu'il y a beaucoup de mots extraits qui ne sont pas des mots-composés. Il faut exclure notamment les pronoms qui se construisent également avec un trait d'union. Créez une machine représentant ces pronoms et éventuellement d'autres éléments à exclure des mots composés et créez une définition affinée des mots composés.
Si ce n'est pas déjà le cas, transformez votre code pour qu'il comporte des fonctions permettant de faire de l'extraction de mots composés de n'importe quel texte donné sous forme d'une chaîne de caractère python.
On veut maintenant extraire tous les mots qui se terminent par ons, ez, ais, ait, aient que l'on considère à tort ou à raison comme des terminaisons purement verbales. Ecrivez un transducteur qui fasse cette extraction.
Ecrivez un transducteur qui extraie la racine des verbes conjugés qui ont une des terminaisons ons, ez, ais, ait, aient. Extraire la racine verbale consiste à supprimer la terminaison.
Ecrivez un programme qui détermine quelles terminaisons ont au moins trois formes conjuguées différentes dans le texte.
barthe 2018-01-31