Anagrammes

avril 2017 mots

Anagrammes

Un écrit ou un récit ? un vélo volé... acheter un hectare, suivre la trace sur la carte... avec l'esprit ou les tripes ?

Ceci est un programme permettant de lister (presque tout) les anagrammes du Français à partir d'un dictionnaire donné (c'est-à-dire une liste de mots)...

Chargement et dépoussiérage du dictionnaire

In [2]:
#fichier = 'liste_mots_mix.txt' #295088 mots - http://www.lexique.org/listes/liste_mots.php
fichier = 'liste_francais.txt' # 22740 mots
In [3]:
with open(fichier, encoding="ISO-8859-1") as f:
    dictionnaire = f.readlines()
    
len(dictionnaire)
Out[3]:
22740

Sont retirés, entre autre, les noms propres (majuscule), les mots avec une apostrophe ou un tiret...

In [4]:
import re
In [6]:
sacdemots = set()
for ligne in dictionnaire:
    if not re.search( r"[#()'0-9\.\-A-Z!]", ligne) :
        mot = ligne.strip(' \r\n')
        if len(mot)>2 :
            sacdemots.add( mot )
            
liste_mots = list( sacdemots )
In [7]:
print( len( liste_mots ) )
print( ', '.join( liste_mots[:10] ) + ', ...etc' )
21039
dispositifs, organe, frugalité, attiré, humaniste, néon, démerder, améliorations, défavorisés, gastronomique, ...etc

Recheche des anagrammes

La liste des anagrammes est créée en triant, pour chaque mot, ses lettres par ordre alphabétique.

In [17]:
liste_anagrammes = [  ''.join( sorted( mot ) ).strip() for mot in liste_mots  ]
print( ', '.join( liste_anagrammes[:10] ) + ', ...etc' )
dfiiiopssst, aegnor, afgilrtué, airtté, aehimnstu, nnoé, ddeemrré, aaiilmnoorsté, adfiorssvéé, aegimnooqrstu, ...etc

Les anagrammes sont ensuite triés, en conservant le mot correspondant attaché avec (zip).

In [9]:
Z = sorted( zip(liste_anagrammes, liste_mots ), key=lambda x:x[0] )
print( Z[:10] )
[('aaaaabbcdnrrt', 'abracadabrant'), ('aaaabcclrtué', 'baccalauréat'), ('aaaabdeeijnrszï', 'azerbaïdjanaise'), ('aaaabdeijnrszï', 'azerbaïdjanais'), ('aaaabkllï', 'balalaïka'), ('aaaacilnrrsvé', 'caravansérail'), ('aaaagilmmnot', 'amalgamation'), ('aaaaiipprsst', 'apparaissait'), ('aaaailmnrsst', 'marais salant'), ('aaaanprtuv', 'auparavant')]

et enfin le coeur du problème, les mots ayant le même anagramme sont cherchés de proche en proche:

In [11]:
multi = []
A = Z[0]
same = False
for B in Z[1:]:
    if A[0] == B[0] and same == False:
        same = True
        famille = [A[1], B[1]] 
    elif A[0] == B[0] and same == True:
        famille.append( B[1] )        
    elif A[0] != B[0] and same == True:
        multi.append(famille)
        same = False

    A = B
In [12]:
len( multi )
Out[12]:
768
In [13]:
print( sorted( multi, key=lambda x:len(x[0]) )[:10] )
[['abc', 'bac'], ['cal', 'lac'], ['arc', 'car'], ['sac', 'cas'], ['agi', 'gai'], ['ami', 'mai'], ['rai', 'ira', 'air'], ['sec', 'ces'], ['cor', 'roc'], ['dru', 'dur']]

Résultats

Les mots ayant le plus d'anagrammes possible :

In [14]:
print( sorted( multi, key=lambda x:len(x), reverse=True)[:20] )
[['arme', 'mare', 'amer', 'rame'], ['rats', 'tsar', 'star', 'arts'], ['eurent', 'retenu', 'neutre', 'teneur'], ['spore', 'prose', 'poser', 'repos'], ['repu', 'pure', 'puer', 'peur'], ['user', 'ruse', 'suer', 'rues'], ['aplatir', 'partial', 'parlait'], ['baltes', 'stable', 'tables'], ['chanter', 'chantre', 'tranche'], ['tacher', 'archet', 'charte'], ['calmer', 'carmel', 'clamer'], ['créature', 'créateur', 'réacteur'], ['sceau', 'sauce', 'cause'], ['aider', 'raide', 'aride'], ['égards', 'gradés', 'gardés'], ['regain', 'ignare', 'graine'], ['pareil', 'palier', 'plaire'], ['animer', 'manier', 'marine'], ['ranimer', 'merrain', 'mariner'], ['marie', 'maire', 'aimer']]

Les anagrammes des mots les plus longs:

In [15]:
print( sorted( multi, key=lambda x:len(x[0]), reverse=True )[:20] )
[['rectification', 'certification'], ['ratification', 'tarification'], ['conversation', 'conservation'], ['représentait', 'présenterait'], ['agriculteur', 'agriculture'], ['législature', 'législateur'], ['resquillant', 'tranquilles'], ['transfusion', 'fournissant'], ['viticulteur', 'viticulture'], ['saturation', 'autorisant'], ['chauffeurs', 'surchauffe'], ['importance', 'comprenait'], ['nonciature', 'continuera'], ['scénariste', 'résistance'], ['légalement', 'allégement'], ['trouverait', 'retrouvait'], ['consterner', 'rencontres'], ['constituer', 'construite'], ['inventeurs', 'intervenus'], ['impression', 'permission']]

Et la liste de tous les anagrammes:

In [16]:
S = sorted( multi, key=lambda x:len(x[0]) )
Sa = [ '/'.join(u) for u in S ]
print( '; '.join( Sa ) )
abc/bac; cal/lac; arc/car; sac/cas; agi/gai; ami/mai; rai/ira/air; sec/ces; cor/roc; dru/dur; sud/dus; les/sel; une/nue; est/tes; use/eus; tue/eut; ouf/fou; ils/lis; tri/rit/tir; mon/nom; mot/tom; son/nos; not/ton/ont; top/pot; aube/beau; abri/brai; bars/bras; cave/avec; cash/chas; acmé/camé; made/dame; dira/raid; dais/sida; ange/nage; rage/gare; aime/amie; raie/aire; arme/mare/amer/rame; nase/anse; tape/apte; sera/rase; tare/rate; saxe/axes; veau/aveu; fait/fiat; gars/gras; mali/lima; mais/amis; anis/sain; pair/ripa/pari; rais/airs; vrai/ravi; vais/visa/avis; rapt/part; rats/tsar/star/arts; taré/raté; snob/bons; lice/ciel; crie/cire; noce/once; cols/clos; coté/écot; turc/truc; ride/dire; tend/dent; dure/rude; life/fiel/file; fers/serf; orge/ogre; miel/lime; line/lien; lier/lire; mien/mine; mise/semi; rein/nier/rien; sein/sien/sine; prie/pire; tire/rite; rive/ivre; vies/vise; lest/tels; zone/onze; sent/nets; nues/unes; rose/ores/oser; veto/vote; repu/pure/puer/peur; pute/peut; rets/sert; user/ruse/suer/rues; foin/info; soif/fois; loin/lion; poli/poil; plis/slip; omis/mois; insu/unis; unit/nuit; rois/soir; péri/prié; suis/issu; vélo/volé; sont/tons; port/trop; pour/prou; post/spot/pots; tour/trou; bacon/banco; balle/label; balte/table; arbre/barre; sabre/baser; brave/baver; bases/basse; blair/baril; tabou/about; craie/acier; clame/calme; parce/carpe; caser/races; carte/trace; cases/casse; sceau/sauce/cause; éclat/lacté; sacré/césar; tracé/écart; garde/grade; aider/raide/aride; tarde/dater; stade/dates; égard/gardé; idéal/délai; radis/raids; fagne/fange; agile/aigle; image/magie; lange/angle; range/nager; ganse/anges; gaver/grave; sauge/usage; phare/harpe; ailes/asile; anime/manie; marie/maire/aimer; serai/aires; taire/tiare; varie/vraie; palme/ample/lampe; saler/laser; lasse/sales; salue/saule; taule/autel; amené/émane; armer/marre; armes/rames; trame/mater; armée/marée; natte/tante/tenta; saper/repas; passe/sapes; rares/serra/raser; astre/resta; taxer/extra; suave/sauve; étang/géant; ragot/argot; ainsi/niais; milan/malin; alpin/lapin; liant/latin; rails/salir; rival/avril; niant/tanin; train/intra/tarin; saint/satin; pairs/paris; quais/quasi; ravis/vrais; talus/salut; avons/savon; sénat/santé; câblé/bâclé; berge/gerbe; biler/libre; blues/bleus; sobre/robes; rebut/buter/brute; tribu/bruit; béton/bonté; turbo/butor; obtus/bouts; credo/corde; coude/douce; celer/recel; cerne/encre; chien/chine; riche/chier; lâche/châle; poche/chope; merci/crime; crise/scier; cuire/curie; iceux/cieux; socle/close; cruel/recul; nonce/conne; pouce/coupe; corse/score; sucre/sucer; écrit/récit; digue/guide; vides/devis; séide/idées; diète/tiède; ondes/sonde; dorer/ordre; duper/perdu; rudes/dures; green/genre; veine/envie; enjeu/jeune; jeter/rejet; elles/selle; perle/peler; terme/remet; rente/entre/terne; tente/nette; venue/neveu/neuve; serve/verse; frime/firme; floue/foule; ligne/linge; signe/seing/singe; grive/givre; loges/glose; nègre/règne; rouge/orgue; rhume/humer; voile/olive; plier/repli; relié/élire; utile/tuile; miens/mines; imper/prime; miser/remis; mises/semis; pinte/peint; peiné/épine; inter/tenir; urine/nuire/ruine; nervi/venir/verni; seins/siens; tiens/senti; unies/usine; teint/tient; poire/proie; riper/prier; pires/prise; tirer/trier; rites/tiers; servi/viser/rives; série/risée; suite/situe; sujet/juste; louer/roule; léser/réels; norme/renom/morne; muret/meurt; noter/notre; notes/osent; nurse/urnes; nôtre/trône; spore/prose/poser/repos; porte/prote; poste/potes; roses/essor; torse/sorte; roues/ourse; touer/outre/route; votre/voter; ouvre/vouer; soute/ouest; super/pures; sueur/usure; trêve/revêt; régis/gésir; logés/glosé; horst/short; pilon/lopin; nolis/lions; point/potin; rupin/purin/punir; trois/sorti; épris/priés; répit/pétri; pouls/loups; promu/rompu; ténor/étron; ports/sport; trous/tours; cadeau/audace; canard/cadran; fiable/faible; braise/baiser; baltes/stable/tables; arbres/barres; établi/bétail; cahier/chaire; charme/marche; tacher/archet/charte; sachet/chaste; calmer/carmel/clamer; lancée/calé en; carnet/tancer; carter/tracer; acérer/carrée; casser/crasse; traces/cartes; lascif/fiscal; craint/criant; intact/citant; grande/danger; garder/regard; avides/devais; renard/rendra; datent/attend; retard/tarder; durera/ardeur; gradin/grandi; égards/gradés/gardés; détail/dilaté; adonis/danois; disant/tandis; truand/durant; ferait/refait; grange/gagner; gagnée/engagé; maigre/mirage; regain/ignare/graine; tirage/agiter; rivage/virage; gaieté/agitée; sangle/langes; langue/lagune; organe/orange; égarer/agréer; phrase/phares; pareil/palier/plaire; liasse/laisse; salive/valise; animer/manier/marine; menait/aiment; anémie/animée; panier/rapine; paient/inapte; navire/avenir; paires/aspire; patrie/partie; arrive/varier; satire/serait; vraies/aviser; traite/attire; essais/assise; levant/valent; palper/rappel; étaler/alerté; émaner/ramené; masque/squame; masure/amuser; armées/marées; naître/traîne; pauvre/vapeur; quatre/traque; sauter/autres; sauver/saveur; inégal/aligné/génial; gratin/ingrat/granit; latino/laiton; maints/matins; taquin/naquit; trains/transi/instar; patois/posait; attiré/traité; bribes/brebis; broder/rebord; bouder/bourde; berger/gerber; boiter/orbite; blouse/boules; sombre/ombres; trombe/tomber; snober/bornes; brosse/bosser; bruits/tribus; dicter/direct; décrit/crédit; secret/certes; office/coiffe; forcée/féroce; cognée/négoce; choper/proche; prêche/pêcher; prince/pincer; cintre/crient; cirque/crique; clouer/couler; créole/éclore; conter/contre; créent/récent; croupe/couper; scores/corses; source/course; coûter/croûte; couver/couvre; creusé/récuse; récits/écrits; dédier/dédire; tendue/tenu de; vendue/devenu; fonder/fondre/fronde; dirige/rigide; design/dignes; délire/délier; disent/destin; désire/réside; dérive/dévier; rondes/sonder; étendu/détenu; ordure/dorure; odeurs/sourde/souder; désuet/études; désiré/sidéré; réduit/érudit; fiente/feinte; relier/relire; ennemi/mienne; inerte/entier; lequel/quelle; pleure/pelure; élever/relevé; permet/trempe; mestre/termes; entrer/rentre; envers/vernes; trente/tenter; eurent/retenu/neutre/teneur; ventre/venter; venues/neuves; pester/pertes; terres/rester; verser/revers; offert/effort; rigole/gloire; signes/singes; voirie/ivoire; rempli/emplir; violer/voiler; voiles/solive; livrée/réveil; primes/permis; trémie/mérite/métier; séisme/émises; niquer/requin; ruiner/uriner; ruines/usiner/sinuer; tinter/tirent; pisser/prises; esprit/tripes; requis/risque; étrier/retiré/étirer; servis/visser; titres/triste; survie/suivre; issues/suisse; justes/sujets; pleurs/pulser; normes/sermon; monter/montre; trompe/promet; résume/mesuré; porter/report; poster/portes; poutre/troupe; sortes/stores; ouvert/trouve; tueurs/suture; ignoré/région; vision/voisin; promus/rompus; bagarre/barrage; amiable/aimable; marteau/amateur; aplatir/partial/parlait; faibles/fiables; blaguer/bulgare; arbitre/abriter; rétabli/établir; accrues/accuser; hectare/acheter; relance/enlacer; fiscale/faciles; facture/facteur; chauler/chaleur; charmer/marcher; marches/charmes; chanter/chantre/tranche; racines/arsenic; crainte/certain; chariot/haricot; leaders/dealers; gardien/daigner; grandes/dangers; admirer/madrier; tiendra/rendait; viendra/veinard; tardive/devrait; ringard/grandir; dormant/mordant; alerter/relater; taverne/entrave; leasing/signale; engrais/saigner; aigreur/aguerri; étrange/renégat; amphore/amorphe; railler/rallier; plainte/patelin; ralenti/reliant; spirale/pareils; ranimer/merrain/mariner; animées/amnésie; prenait/patiner; tentait/atteint; parties/pirates; traiter/attirer/retrait; verrait/avertir; artiste/restait/attiser; servait/avertis; parlent/planter; marques/masquer; tenants/sentant; versant/servant; apporte/papoter; assurer/rassure; stature/statuer; offrait/forfait; offrant/affront; languir/galurin; alignés/signalé; attirés/traités; incombe/combine/combien; obscure/courbes; ignoble/gobelin; obtenir/robinet; bourses/brousse; concret/concert; décrier/décrire; directs/discret; lecteur/lecture; récente/centrée; respect/spectre; recrues/creuser; recrute/recteur; foncier/confier; cingler/cligner; tricher/richter; sorcier/croiser; énoncer/renoncé; secours/sources/courses; coussin/cousins; teindre/dentier; devenir/deviner; dessein/dessine; prendre/reprend; devenus/vendues; détenue/étendue; endormi/dominer/moindre; destiné/densité; dispute/stupide; désirer/résider; étudier/éditeur/réduite; dénoter/détoner; ordures/sourdre; déroute/redouté; surdité/réduits; refluer/fleurer; remplie/empiler; reluire/reliure; ennemis/miennes; premier/empirer; empires/emprise; intense/tiennes; terrien/retenir/terrine; entiers/sentier; teinter/retient; reprise/respire/pierres; terrier/retirer; meurent/menteur; enterré/rentrée; retenus/senteur; erreurs/serrure; offerts/efforts; flirter/filtrer; enfouir/fouiner/fournie; forment/froment; réfuter/fréteur; génisse/signées; militer/limiter; voilier/olivier; vitrine/inviter; promise/imposer; mérites/métiers; potiner/pointer; intruse/suinter; soupire/roupies; voleurs/velours; monteur/monture; remonté/montrée; entouré/tournée; opposer/propose; posture/troupes; épouses/poussée; tousser/rousset; profits/sportif; voisins/visions; portion/potiron; bagarres/barrages; archange/changera; canaille/alliance; calvaire/cavalier; sarcasme/massacre; marocain/macaroni; patauger/tapageur; salaires/laissera; armature/armateur; matériau/amirauté; partisan/aspirant; attirant/traitant; baver de/adverbe; fracture/facturer; factures/facteurs; étancher/tranchée; approche/achopper; chausser/chasseur; certains/craintes; rapiécer/précaire; créature/créateur/réacteur; réaction/création; associés/écossais; devaient/devenait; limonade/mondiale; latitude/altitude; soudaine/saoudien; résidant/désirant; relative/relevait; servante/entraves; repasser/paresser; affermir/affirmer; sanglier/signaler; algérien/régalien; organise/agoniser; rallonge/allonger; mainmise/animisme; aspirine/parisien; relation/oriental; voltaire/traviole; traitent/attirent; paroisse/passoire; artistes/tsariste; apporter/rapporte; sanglots/glasnost; militant/limitant; islamisé/assimilé; salisson/laissons; insaturé/instauré; concerts/concrets; féconder/défoncer; déconner/dénoncer; cupidité/pudicité; crémerie/remercié; lectures/lecteurs; coiffure/coiffeur; foncière/conifère; renforcé/conférer; consiste/sections; recourir/courrier; coursier/secourir; conjoint/jonction; détenues/étendues; résident/désirent; éditeurs/réduites; démonter/démontre; répondre/pondérer; sédition/éditions; détritus/détruits; gisement/meetings; seigneur/seringue; réveille/éveiller; retentir/retirent; respirer/repriser; purement/emprunte; entourer/retourne; repousse/soupeser; religion/originel; sinistre/insister; vitrines/investir; opprimer/impropre; routiers/soutirer; voitures/virtuose; espérons/réponses; cassation/associant; fantaisie/faisaient; rassemble/assembler; dictature/dictateur; chargeurs/surcharge; pasticher/chapitres; approcher/rapproche; instances/incessant; reconnaît/connaître; contraste/constater; réacteurs/créateurs; fiscalité/facilités; callosité/localités; réactions/créations; présidait/disparité; garnement/rangement; terminale/alimenter; versatile/relatives; tentative/attentive; resterait/retraites; intégrale/églantier; agression/angoisser; tentation/attention; indiscret/indirects; rectifier/certifier; conserver/converser; conifères/foncières; élections/sélection; continuer/ceinturon; sculpteur/sculpture; redresser/desserrer; déliement/démentiel; intervenu/inventeur; instiguer/intrigues; péroniste/protéines; saturation/autorisant; chauffeurs/surchauffe; importance/comprenait; nonciature/continuera; scénariste/résistance; légalement/allégement; trouverait/retrouvait; consterner/rencontres; constituer/construite; inventeurs/intervenus; impression/permission; importuner/interrompu; propriétés/prospérité; agriculteur/agriculture; législature/législateur; resquillant/tranquilles; transfusion/fournissant; viticulteur/viticulture; ratification/tarification; conversation/conservation; représentait/présenterait; rectification/certification

Remarques:

  • le résultat dépend beaucoup du dictionnaire utilisé. Il existe beaucoup de mots non courant, permettant de former beaucoup plus d'anagrammes... plutôt incomprehensibles.
  • Comment faire pour autoriser une ou deux lettres de différence ? Ou en travaillant sur la phonétique plutôt que l'orthographe exacte ?
In [ ]: