Aller au contenu

Découpage de mots⚓︎

Pour analyser automatiquement les débats entre des orateurs, on vous demande de créer une fonction decoupe_mots qui renvoie la liste des mots de 4 lettres ou plus dans une chaine de caractères discours passée en paramètre.

On suppose que la chaine discours a été renvoyée par une fonction de reconnaissance vocale qui ignore la ponctuation et ne renvoie que des lettres minuscules sans accent ainsi que des espaces. Le discours se termine aussi par une espace.

On n'utilisera pas la fonction split dans cet exercice.

Exemples
🐍 Console Python
>>> discours = "je peux vous dire aujourd hui mes amis qu en depit des difficultes et des frustrations actuelles j ai quand meme fait un reve c est un reve profondement enracine dans le reve americain "
>>> decoupe_mots(discours)
['peux', 'vous', 'dire', 'aujourd', 'amis', 'depit', 'difficultes', 'frustrations', 'actuelles', 'quand', 'meme', 'fait', 'reve', 'reve', 'profondement', 'enracine', 'dans', 'reve', 'americain']
🐍 Console Python
>>> test_2 = "abcd azerty   xyz    azerty     "
>>> decoupe_mots(test_2)
['abcd', 'azerty', 'azerty']
###
# testsbksl-nlbksl-nldiscours = "je peux vous dire aujourd hui mes amis qu en depit des difficultes et des frustrations actuelles j ai quand meme fait un reve c est un reve profondement enracine dans le reve americain "bksl-nlbksl-nlassert decoupepy-undmots(discours) == [bksl-nl "peux",bksl-nl "vous",bksl-nl "dire",bksl-nl "aujourd",bksl-nl "amis",bksl-nl "depit",bksl-nl "difficultes",bksl-nl "frustrations",bksl-nl "actuelles",bksl-nl "quand",bksl-nl "meme",bksl-nl "fait",bksl-nl "reve",bksl-nl "reve",bksl-nl "profondement",bksl-nl "enracine",bksl-nl "dans",bksl-nl "reve",bksl-nl "americain",bksl-nl]bksl-nlbksl-nlbksl-nltestpy-und2 = "abcd azerty xyz azerty "bksl-nlbksl-nlassert decoupepy-undmots(testpy-und2) == ["abcd", "azerty", "azerty"]bksl-nlbksl-nlbksl-nlassert decoupepy-undmots("") == []bksl-nlassert decoupepy-undmots(" ") == []bksl-nlassert decoupepy-undmots("a b c d ") == []bksl-nlassert decoupepy-undmots("a bc def ghij ") == ["ghij"]bksl-nlassert decoupepy-undmots("abcd efg hi j ") == ["abcd"]bksl-nlassert decoupepy-undmots(" abcd abcd ") == ["abcd", "abcd"]bksl-nlbksl-nl 5/5

def decoupepy-undmots(discours):bksl-nl ...bksl-nlbksl-nlbksl-nl# testsbksl-nlbksl-nldiscours = "je peux vous dire aujourd hui mes amis qu en depit des difficultes et des frustrations actuelles j ai quand meme fait un reve c est un reve profondement enracine dans le reve americain "bksl-nlbksl-nlassert decoupepy-undmots(discours) == [bksl-nl "peux",bksl-nl "vous",bksl-nl "dire",bksl-nl "aujourd",bksl-nl "amis",bksl-nl "depit",bksl-nl "difficultes",bksl-nl "frustrations",bksl-nl "actuelles",bksl-nl "quand",bksl-nl "meme",bksl-nl "fait",bksl-nl "reve",bksl-nl "reve",bksl-nl "profondement",bksl-nl "enracine",bksl-nl "dans",bksl-nl "reve",bksl-nl "americain",bksl-nl]bksl-nlbksl-nlbksl-nltestpy-und2 = "abcd azerty xyz azerty "bksl-nlbksl-nlassert decoupepy-undmots(testpy-und2) == ["abcd", "azerty", "azerty"]bksl-nlbksl-nldef decoupepy-undmots(discours):bksl-nl mots = list()bksl-nl mot = ""bksl-nl for caractere in discours:bksl-nl if caractere != " ":bksl-nl mot += caracterebksl-nl else:bksl-nl if len(mot) >= 4:bksl-nl mots.append(mot)bksl-nl mot = ""bksl-nl return motsbksl-nlbksl-nl

A

Version fonctionnelle⚓︎

Dans un style fonctionnel, on utilise split (mais c'était interdit justement pour cet exercice).

🐍 Script Python
def decoupe_mots(discours):
    return [mot for mot in discours.split() if len(mot) >= 4]

Remarque

  • discours.split(" ") coupe discours uniquement aux espaces.
  • discours.split() coupe discours aux espaces, sauts de ligne, tabulations.

Version avec join⚓︎

Ici, la boucle pour construire un mot est courte ; dans le pire des cas on a des mots d'une vingtaine de lettres.

Mais dans d'autres situations, de longues boucles avec ajout de caractères dans une chaine de plus en plus grande, la chaine est recopiée intégralement à chaque tour (c'est un objet immuable). On aimerait éviter la recopie entière du début de la chaine.

Pour cela, on crée une liste vide, dans laquelle on ajoute tous les morceaux à chaque tour de boucle. Il n'y a pas de copie. À la fin, on colle les morceaux avec join.

🐍 Script Python
def decoupe_mots(discours):
    mots = list()
    lettres = list()
    for caractere in discours:
        if caractere != " ":
            lettres.append(caractere)
        else:
            if len(lettres) >= 4:
                mots.append("".join(lettres))
            lettres = list()
    return mots

Cette version est théoriquement meilleure, elle serait très utile dans un autre cadre.

Z