Sous-sections

Exercice 4

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.

Question 1

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

Question 2

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.

Question 3

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.

Question 4

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.

Question 5

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.

Question 6

Ecrivez un programme qui détermine quelles terminaisons ont au moins trois formes conjuguées différentes dans le texte.

barthe 2018-01-31