Se choisir un pseudonyme par anagramme à l’aide de Python peut-être amusant quand on souhaite publier un blog ou un roman. C’est quelque fois un peu prise de tête. Je vais donc vous aider…

Vous allez me dire : “mais c’est quoi son problème avec les anagrammes à celui-là ?” C’est vrai que j’aime bien (j’avais déjà fait un article dessus).

Choisir un pseudonyme par anagramme avec Python: les prénoms possibles

Il me faut une base: la liste des prénoms disponibles.

Pas facile de trouver une liste exhaustive, mais il existe une liste sur la page https://www.data.gouv.fr/fr/datasets/liste-de-prenoms/.

Je vais donc télécharger le fichier CSV, puis le renommer Prenoms.csv.

Ce fichier commence ainsi:

01_prenom;02_genre;03_langage;04_fréquence
aaliyah;f;english (modern);0
aapeli;m;finnish;0
aapo;m;finnish;0
aaren;m,f;english;0
aarne;m;finnish;0
aarón;m;spanish;0
aaron;m;english, biblical;1.37

Ainsi, si vous souhaitez trier les prénoms suivant le langage, cela sera possible.

Choisir un pseudonyme par anagramme avec Python: exploitation du fichier

Déterminer les langages

La première chose que j’ai envie de faire est de déterminer tous les langages pris en compte dans ce fichier.

def langages():
    langues = []
    with open('Prenoms.csv' , 'r') as f:
        for line in f.readlines():
            L = line.split(';')
            tmp = L[2].split(', ')
            for l in tmp:
                if l not in langues and l != '03_langage':
                    langues.append( l )
                
    return langues
>>> langages()
['english (modern)', 'finnish', 'english', 'spanish', 'biblical', 'irish', 'arabic', 'jewish', 'hungarian', 'french', 'danish', 'african', 'indian', 'german', 'biblical (variant)', 'ancient greek (latinized)', 'greek mythology (latinized)', 'italian', 'swedish', '', 'ancient germanic', 'portuguese', 'polish', 'russian', 'romanian', 'dutch', 'turkish', 'astronomy', 'history', 'theology', 'greek mythology', 'esperanto', 'anglo-saxon', 'ancient roman', 'roman mythology', 'welsh', 'welsh mythology', 'ancient greek (anglicized)', 'greek', 'ancient greek', 'czech', 'slovene', 'armenian', 'scandinavian', 'latvian', 'celtic mythology', 'chinese', 'near eastern mythology', 'native american', 'japanese', 'scottish', 'irish mythology', 'basque', 'hawaiian', 'norwegian', 'bulgarian', 'macedonian', 'croatian', 'serbian', 'albanian', 'ancient scandinavian', 'iranian', 'norse mythology', 'slovak', 'late roman', 'far eastern mythology', 'egyptian mythology', 'ancient egyptian', 'egyptian mythology (hellenized)', 'provençal', 'catalan', 'near eastern mythology (hellenized)', 'literature', 'maori', 'ukrainian', 'icelandic', 'breton', 'lithuanian', 'hindu mythology', 'judeo-christian legend', 'vietnamese', 'celtic mythology (latinized)', 'anglo-saxon mythology', 'manx', 'cornish', 'ancient celtic (latinized)', 'khmer', 'ancient celtic', 'germanic mythology', 'slavic mythology', 'ancient germanic (latinized)', 'new world mythology', '?', 'frisian', 'anglo-saxon (latinized)', 'greek mythology (anglicized)', 'korean', 'estonian', 'thai', 'medieval english', 'mormon', 'biblical (original)', 'mythology', 'galician']

Voilà, voilà ! Maintenant, on peut se lancer dans notre recherche de pseudonyme…

Déterminer un prénom

Il y a plusieurs techniques pour trouver un prénom parmi les anagrammes… mais nous allons tout de suite écarter celles qui font appel aux permutations! Bien trop longues à mon goût…

Mon idée consiste à parcourir la liste de tous les prénoms du fichier (triés si on le veut en fonction de la langue souhaitée) et de vérifier si toutes les lettres sont dans le nom complet d’origine. Si tel est le cas, le prénom est retenu.

def possible_prenoms(name , lang = None):
    prenoms = []
    prenom_origin = unidecode(name.lower()).split(' ')[0]

    with open('Prenoms.csv' , 'r') as f:
        for line in f.readlines():
            L = line.split(';')
            if lang != None and L[2] == lang:
                prenoms.append( L[0].replace(' (1)','').replace(' (2)','').lower() )
            else:
                prenoms.append( L[0].replace(' (1)','').replace(' (2)','').lower() )

    name = unidecode( name ).replace(' ','').replace('-','')

    list_of_prenoms = []

    for p in prenoms:
        prenom = list( unidecode(p).replace('-','') )
        tmp = list( unidecode(p).replace('-','') )
        name_list = list( name.lower() )
        for lettre in prenom:
            if lettre not in name_list:
                presence = False
                break
            else:
                tmp.remove(lettre)
                name_list.remove(lettre)
        if len(tmp) == 0 and ''.join(prenom) != prenom_origin:
            list_of_prenoms.append(''.join(prenom))
            
    return list_of_prenoms
>>> name = 'Stéphane Pasquet'
>>> possible_prenoms(name)
['aatu', 'aeneas', 'ah', 'an', 'ana', 'anas', 'anass', 'anat', 'anath', 'anath', 'anatu', 'ane', 'ante', 'anthea', 'asa', 'asa', 'asaph', 'asenath', 'ash', 'asha', 'aspen', 'assunta', 'asta', 'ata', 'athena', 'aune', 'austen', 'ean', 'eetu', 'ena', 'eneas', 'enu', 'esa', 'esau', 'eshe', 'essa', 'esta', 'estee', 'ethan', 'ethna', 'ethne', 'etna', 'etta', 'euan', 'hana', 'hans', 'hasan', 'hassan', 'hena', 'huan', 'nat', 'nea', 'neasa', 'neassa', 'nessa', 'nessa', 'nesta', 'netta', 'neus', 'nuha', 'pasha', 'pat', 'pau', 'pen', 'pene', 'pepe', 'peta', 'pete', 'ptah', 'pushpa', 'quan', 'quanah', 'queen', 'san', 'sana', 'sans', 'santa', 'sasha', 'satu', 'sean', 'seeta', 'seetha', 'sens', 'sepp', 'set', 'seth', 'seth', 'shae', 'shan', 'shana', 'shane', 'shanta', 'shantae', 'shaun', 'shauna', 'shea', 'sheena', 'shena', 'shun', 'stan', 'steaphan', 'steen', 'sten', 'stepan', 'steph', 'stephan', 'stephen', 'stu', 'su', 'sue', 'suha', 'susan', 'susana', 'suse', 'tahnee', 'tanesha', 'tasha', 'tate', 'tatu', 'tau', 'tess', 'tessa', 'than', 'thane', 'thea', 'theseus', 'thu', 'thuan', 'tu', 'tu', 'tuan', 'tue', 'una', 'usha', 'ute']

Ça en fait du choix !

Choix du pseudonyme

Une fois notre prénom choisi, il faut déterminer le nom avec les lettres qu’il reste.

Bien sûr, on pourrait écrire une fonction donnant toutes les anagrammes des lettres restantes, mais selon le nom complet d’origine, ça risque de faire pas mal d’affichages et difficile de choisir s’il on a énormément de propositions.

Le mieux, à mon avis, est d’écrire une fonction qui renvoie les lettres restantes.

def rest(name,prenom):
    name = list ( unidecode( name ).replace(' ','').replace('-','').lower() )
    
    for lettre in prenom.lower():
        name.remove( lettre )
        
    return ''.join(name)
>>> name = "Stéphane Pasquet"
>>> prenom = "Theseus"
>>> rest(name,prenom)
panpaqet        

Il n’y a plus qu’a ordonner les lettres restantes pour former le nom qui nous plaît le plus…

Si j’avais dû choisir parmi toutes les permutations des lettres restantes, j’aurais dû me farcir 8!, soit 40320 choix… ce qui est humainement impossible ! Et je suis un être humain !

Voilà ! Si dans quelques années vous entendez parler d’un certain Théseus Tanqapep, ou Théseus Pantagep (j’hésite encore…), vous saurez que c’est moi… 🙂

Catégories : Python

0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
1 Commentaire
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Philippe Rackette

Le fichier du site http://www.data.gouv.fr n’est pas encodé en UTF-8. On peut le convertir, par exemple en utilisant TexShop. Aussi, il faut importer le module unidecode avec par exemple en début de programme :
from unidecode import unidecode
Ensuite cela fonctionne 🙂
Cherette Kappilpi

1
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x