Aller au contenu

Génération de mots

Hors programme

L'algorithme présenté dans ce chapitre est hors programme, il n'est donc pas nécessaire de le connaître.

Les possibilités de création artistique par le bais de l'informatique ont suivi les avancées drastiques de l'intelligence artificielle à partir des années 2020.

Avant 2015, les logiciels artistiques étaient limités à des outils de dessin que l'artiste utilisait en lieu et place d'un pinceau.

Puis, petit à petit, sont apparus des logiciels capables de créer des oeuvres entières à partir de commandes formulées dans une langue naturelle, comme Crayion, Midjourney1 ou DALL-E1.

Un exemple de création artistique, plus simple à mettre en place, est la génération de noms et de mots.

Un problème de noms

Le processus de création de certains types d'oeuvres, comme les histoires ou les jeux vidéos, demandent de nommer :

  • Des villes
  • Des personnages
  • Des objets
  • Des techniques
  • ...

Même si ça peut sembler facile, ça ne l'est pas tant.

Imaginez : vous écrivez un roman narrant l'aventure épique d'une paladin mandatée par le Haut Conseil de la Magie pour retrouver une épée de légende, héritage supposé d'une nation mythique de dragons maintenant disparus. Elle traversera diverses contrées avec de nombreuses espèces autochtones, des marécages goblins aux montagnes des nains, en passant par les forêts des elfes et les landes des centaures.

la paladine

Or, si vous voulez créer un univers cohérent, et facile à aborder par le lecteur, il est préférable de bien distinguer ces espèces en les rendant stéréotypées. Et il y a de grandes chances que ces différences seront perceptibles dans les langages des différentes espèces.

  • Les goblins, qui communiquent beaucoup par des cliquetis et des mimiques, n'utilisent que quelques sons "gou", "ga" "gu" "ki" "ka" "sa" "su". Exemple de noms : "gou ki sa", "ga su".
  • Les nains, qui sont très directs, ont une langue avec des sons majoritairement "secs". Exemple de noms : "Guimli", "Taril", "Olek".
  • Les elfes, qui sont agiles et plus réservés que les nains, ont une langue qui est presque chantée. Exemple de noms "Galadriel", "Enoriel", "Elronde".
  • Les centaures, qui galopent souvent, ont une langue empreinte de dynamisme, comportant beaucoup de sons sifflant ou soufflant, "ze" "se" "sy", ... Exemple de noms : "Zerasah", "Saleros"
  • Les dragons, créatures mythiques et imposantes, ont une langue avec des mots compliqués et comportant beaucoup de sons guturaux et profonds. Exemple de noms : "Grougaloragran", "Chargurufelnur", "Syrmagohar"

A froid comme ça, on arrive à imaginer des noms. Mais en plein milieu de l'écriture d'une scène de cérémonie centaur empreinte d'émotion, vous n'aurez pas forcément envie de vous interrompre pour chercher le nom de chaque conseiller qui prends la parole.

Une solution pourrait-être de mettre des noms provisoires, comme conseiller1 ou Félix 2, mais celà risquerait de "casser l'ambiance" dans votre création, par exemple si vous relisez la scène plusieurs fois dans la progression.

Sinon, vous pourriez simplement utiliser un générateur qui crée des nouveaux mots à partir d'exemples.

Principe

Pour créer des mots similaires à des exemples, on va dans un premier temps enregistrer les successeurs.

  • On lit chaque exemple et on note quels caractères se suivent, à partir des exemples. On peut utiliser un tableau à deux entrées, téléchargeable en cliquant ici. On ajoute un caractère "vide" qui représente le début et la fin des exemples.
  • On compte ensuite le nombre de successeurs possible pour chaque mots, celà va nous simplifier un peu la vie.

Pour générer un mot :

  • On sélectionne au hasard un successeur au caractère vide.
  • On sélectionne au hasard un successeur, et ainsi de suite.
  • On s'arrête quand on retombe sur le caractère vide.

Programme Python

Dans le dépliant ci-dessous se trouve le code d'un générateur Python reprenant le principe présenté dans la section précédente.

Code complet
VIDE = ""

import random

def dico_successeurs(exemples, doublons = False):
    """exemples une list non vide de str non vides. 
    poids un booléen
    retourne un dict associant à chaque caractère la list de ses successeurs autorisés. Si poids est mis à True, les doublons sont préservés.
    """
    succs = {}
    for exemple in exemples : 
        pred = VIDE
        for c in exemple:
            if pred not in succs:
                succs[pred] = []
            if c not in succs[pred]:
                succs[pred].append(c)
            pred = c

        if pred not in succs:
                succs[pred] = []
        if VIDE not in succs[pred]:
            succs[pred].append(VIDE)
    return succs


def selectionner_successeur(successeurs, caractere):
    """successeurs un dictionnaire tel que produit par dico_successeurs
    caractere un caractère, présent dans successeurs, sélectionné aléatoirement
    """
    assert caractere in successeurs
    return random.choice(successeurs[caractere])

def generer_mot(successeurs):
    """successeurs un dictionnaire tel que produit par dico_successeurs
    retourne une str représentant un mot construit aléatoirement à partir de successeurs
    """
    caractere_courant = VIDE
    mot = ""
    while len(mot) == 0 or caractere_courant != VIDE:
        successeur = selectionner_successeur(successeurs, caractere_courant)
        mot += successeur
        caractere_courant = successeur
    return mot

def generer_mots(exemples, n, frequence = False):
    """exemples une list non vide de str non vides.
    n un entier
    poids un booleen
    retourne une list de n mots ressemblants au mots d'exemples. Si poids est mis à True, la ressemblance est plus grande, mais le programme consommera plus de mémoire.
    """
    mots = []
    successeurs = dico_successeurs(exemples, frequence)
    for i in range(0, n):
        mots.append(generer_mot(successeurs))
    return mots

exemples = ["grougaloragran", "chargurufelnur", "syrmagohar"]

print(generer_mots(exemples, 5, True))

Copiez-collez le, puis appelez chaque fonction indépendamment les unes des autres pour bien comprendre comment le générateur marche.

  • Dans le cas où les exemples comportent des doubles lettres, par exemple ll, il se peut que le générateur produise des mots avec plus de lettres successives, par exemple lll. Proposez un protocole expérimental pour vérifier celà. A votre avis (sans implémenter), comment pourrait-on faire pour éviter celà ?
  • Améliorez le générateur, par exemple en chargeant les exemples depuis un fichier, ou en limitant le nombre de caractères qu'un mot générer peut avoir.

  1. ces logiciels ne sont pas libre. 

  2. qui est un très joli prénom, mais qui ne fait pas très "centaure".