JeuWeb - Crée ton jeu par navigateur
Générateur de noms à consonances diverses - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Univers, background (https://jeuweb.org/forumdisplay.php?fid=47)
+--- Sujet : Générateur de noms à consonances diverses (/showthread.php?tid=5746)

Pages : 1 2 3 4 5


RE: Générateur de noms à consonances diverses - jean-baptiste - 21-01-2012

Oups désolé, j'avais compris que c'était l'idée d'une nouveauté !


RE: Générateur de noms à consonances diverses - Aleskweb - 21-01-2012

Un petit truc stupide mais qui peu marcher au pire des cas : Alterner syllabes et consonnes. Tu peu pousser plus loin l'algorithme en rajoutant par exemple un "l" aléatoire après un autre "l" etc..
Sinon pour chaque lettre de l'alphabet tu fais un tableau avec les lettres qui peuvent la suivre (ex pour "q" : {u}) puis tu choisis au pif dans ce tableau a chaque fois et ainsi de suite


RE: Générateur de noms à consonances diverses - Thêta Tau Tau - 03-07-2012

Ptit déterrage.

J'avais promis des sources plus haut mais ayant abandonné mon script je n'ai finalement rien posté Big Grin

J'ai refait mon petit générateur de noms en beaucoup plus simple, mais les résultats sont meilleurs.

Exemple de sortie, en utilisant des noms français comme base :
Citation :MARRIN, NENTERSTANT, LENARD, VIPER, ARON, COUCOSTON, DENDRERT, BARDAL, CLANIN, CAGIER, PRINNIER, RIRBAND, FLONTIN, MALTY, LATAL, BAZET, ARDANC, LENNIER, RICCIX, PHINTARD, LEBRETE, MAGER, BIRCEIL, PIZIN, PELLIER, CHARLAN, LASLE, JAZUE, CHRERY, MANE, LERIT, FOURTOT, CHAMOURIN, DURDIN, VIALLIER

Voilà le script :

#! usr/bin/env python
#-*- encoding: Latin-1 -*-
import re
import random

file_input = open("noms.txt")#Fichier avec des noms déjà existants pour servir de base (un nom par ligne)
file_output = open("nouveaux_noms.txt","w")#Fichier de sortie
nb_names = 2000#Le nombre de noms à générer
vowels = "AEYUIO"
consonants = "ZRTPQSDFGHJKLMWXCVBN"

#On lis les noms
names = []
for name in file_input:
names.append(name[:-1])


#On découppe les noms en trois parties (CHA-RPENT-IER)
#On compte le nombre d'occurence de chaque partie.
affixes = {"preffix" : {}, "middle" : {}, "suffix" : {}}

expr = re.compile("^(?P<preffix>[{c}]*[{v}]+)(?P<middle>[{c}]|[{c}][A-Z]*[{c}])(?P<suffix>[{v}]+[{c}]*)$".format(v = vowels, c = consonants))

nb = 0
for name in names:
match = expr.search(name)
if match:
nb += 1
for type, dict in affixes.items():
if dict.has_key(match.group(type)):
dict[match.group(type)] += 1
else:
dict[match.group(type)] = 1

#On génère des noms en prenant au hazard un preffixe, un milieu et un suffixe,
#Les probabilités de tirer une partie sont pondéré par son nombre d'occurence
names = []

def pondRand(dict,tot):
t = 0
r = random.randint(1,tot)
for k, v in dict.items():
t += v
if t >= r:
return k


k = 0
while k < nb_names:
k += 1
name = pondRand(affixes["preffix"],nb) + pondRand(affixes["middle"],nb) + pondRand(affixes["suffix"],nb)
file_output.write(name + "\n")






RE: Générateur de noms à consonances diverses - Harparine - 05-07-2012

(21-01-2012, 12:33 PM)Thêta Tau Tau a écrit : Bien sur que ça existe déjà, le problème c'est que déjà c'est pas opensource donc pas intégrable dans nos jeux, et ensuite que c'est pas personnalisable (si on veut que nos noms ne soient pas pompés sur Tolkien ou autre). Bref c'est bien pour les rôlistes, ou si on a besoin de quelques dizaines de noms, mais c'est tout.

Par contre leur méthode de "découpage" a l'air plus cohérente que la mienne.

Salut !
Je suis l'auteur de http://www.gunof.net, cité un peu plus haut Wink
Effectivement, il n'y a pas d'appli pour utiliser les noms dans un jeu (c'était prévu mais je n'ai pas le temps de bosser sur ce projet depuis plusieurs années).
Par contre, je peux t'expliquer comment j'ai codé mon truc : comme l'algorithme n'est pas le même selon les nations, il y a un fichier de "règle" pour chaque type de nom et un ou plusieurs fichiers de syllabes associés. Pour ce fichier de règle, j'ai écrit un petit langage propre à la génération des noms qui est interprété par php. Niveau perf c'est pas top mais ça me permet beaucoup de liberté au niveau de la conception des noms... Et je compense par une mise en cache.
Un exemple de règle pour Hobbit :

SimpleMale: first + middle1 + middle2 + termM
SimpleFemale: (fleurs_pierres | first + middle1 + middle2 + termF)
ComplexMale: GUNOF.hobbit.male.simple + ' ' + names1 + names2
ComplexFemale: GUNOF.hobbit.female.simple + ' ' + names1 + names2

Par exemple, pour "SimpleMale", on récupère une syllabe aléatoire du fichier "first.txt" qu'on concatène avec une des fichiers "middle1", "middle2" et "termM".
J'ai complexifié ce langage avec des conditions ( | qui signifie "ou") ou bien l'objet GUNOF qui retourne un nom complet. Les guillemets encadrent des chaînes de caractère que l'on peut utiliser telles quelles.

C'est la raison pour laquelle mon "découpage" est pas mal : comme le langage de règle est simple, je peux avoir des algorithmes de conception très différents et l'ajout ou la modification d'une nation est très facile.

Si j'avais le temps, je proposerais même un éditeur de noms pour que les utilisateurs puissent ajouter leurs propres nations... Mais ce n'est pas pour tout de suite : je dois auparavant boucler un gros projet sur lequel je bosse depuis plusieurs années (pas un jeu).

@+



RE: Générateur de noms à consonances diverses - niahoo - 05-07-2012

Code :
Traceback (most recent call last):
  File "./noms.py", line 51, in <module>
    name = pondRand(affixes["preffix"],nb) + pondRand(affixes["middle"],nb) + pondRand(affixes["suffix"],nb)
  File "./noms.py", line 41, in pondRand
    r = random.randint(1,tot)
  File "/usr/lib/python2.6/random.py", line 228, in randint
    return self.randrange(a, b+1)
  File "/usr/lib/python2.6/random.py", line 204, in randrange
    raise ValueError, "empty range for randrange() (%d,%d, %d)" % (istart, istop, width)
ValueError: empty range for randrange() (1,1, 0)
zsh: exit 1     ./noms.py

est-ce que tu as testé le script que tu donnes ? Mon PC à du mal à reconnaitre « usr/env/python » Big Grin Je me promène rarement à la racine de mon système de fichiers !


RE: Générateur de noms à consonances diverses - Sephi-Chan - 05-07-2012

Je suppose que c'est usr/bin/env python et pas usr/env/python.


RE: Générateur de noms à consonances diverses - Thêta Tau Tau - 05-07-2012

@Niahoo : Sur mon PC (windows) cette ligne ne sert à rien, je l'ai juste bêtement copié/collé d'un script qui fonctionnait sous linux. Sous windows tu peux l'enlever, sous unix essayes "#!/usr/bin/python3.2".

@Harparine : Ton langage il te sert uniquement pour assembler de nouveaux noms ou aussi à découper des noms préexistants?


RE: Générateur de noms à consonances diverses - Harparine - 05-07-2012

(05-07-2012, 06:26 PM)Thêta Tau Tau a écrit : @Harparine : Ton langage il te sert uniquement pour assembler de nouveaux noms ou aussi à découper des noms préexistants?

Juste pour assembler. En général, je me fais mes listes de syllabes sur Excel pour les premiers tests. Je me fais mon "découpage" à la main. C'est la phase la plus longue car il faut beaucoup d'ajustements pour que tout fonctionne bien.
@+




RE: Générateur de noms à consonances diverses - niahoo - 05-07-2012

Mais non les gars c'est juste qu'il manque un slash, c'est un chemin absolu .. je pensais que vous comprendriez quand je parlais de la racine du système Smile (oui je me suis gouré en tapant mon post c'est bien /usr/bin/env python)

je l'ai trouvé facilement, il ne trouve pas

Mais sinon l'exception que j'ai, elle est bien réelle ! peut être que c'est du python 3 ou un lib pas à jour. ça tourne sur quelle version chez vous ?


RE: Générateur de noms à consonances diverses - Maks - 06-07-2012

Même erreur chez moi avec Python 2.7.3 sous Windows