Anagrammes
Luc Maranget*
Important, il existe une page de
suivi.
Présentation
Comme vous le savez certainement, un anagramme traditionnel est une permutation
d'un mot. Ainsi, orant est un anagramme de raton.
La production de tous les anagrammes d'un mot donné est un exercice
très classique et de nombreuse solutions sont possibles.
Mais ici on s'intéresse à la question généralisée de produire des
anagrammes composés de plusieurs mots.
C'est à dire que, étant donné un stock de lettres (qui peuvent être
répétées) on veut produire une suite de mots formés exactement à l'aide de ces
lettres.
Par exemple, à partir des lettres de ratonlaveur on peut
produire, entre autres, les « anagrammes » loutre varan,
outre narval et rat ou verlan.
Les mots pouvant entrer dans la composition des anagrammes sont donnés
par un dictionnaire. Dans l'exemple du raton-laveur, il s'agit d'un
dictionnaire français.
Le but de ce projet est l'écriture d'un programme Anagramme
qui prend en arguments un nom de fichier-dictionnaire et un stock de lettres et
affiche tous les multi-ensembles de mots du
dictionnaire épuisant le stock de lettres.
Par multi-ensemble on entend qu'un mot donné peut apparaître plus d'une
fois dans un anagramme et que l'ordre des mots n'est pas significatif.
Ainsi, si le dictionnaire est composé des mots
cc, coco, cocu, cou,
coucou, oc et ou, alors les anagrammes de
coucou sont :
cc ou ou,
cocu ou,
cou cou,
coucou
On constate que le premier anagramme comprend deux fois le mot
ou et qu'aucun anagramme n'est répété (afficher l'anagramme
supplémentaire ou ou cc serait une erreur).
Représentation des dictionnaires
Le dictionnaire est fourni sous la forme d'un fichier
texte, à raison d'un mot par ligne. Mais en machine, on le représentera
par un arbre.
Commençons par une description un peu abstraite de cet
arbre. Chaque noeud de l'arbre contient un booléen et possède un nombre
arbitraire de fils étiquetés par des caractères.
Les mots du dictionnaire sont représentés par des chemins dans l'arbre
aboutissant en un noeud dont le booléen vaut true.
Par exemple, soit le petit dictionnaire suivant
cas,
ce,
ces,
ci,
sa,
sac,
sec
Alors on aura l'arbre suivant (un champ booléen égal à true est
représenté par un cercle grisé) :
La représentation en arbre permet un partage maximal des préfixes des
mots du dictionnaire.
L'exemple de ce et de ces,
montre bien la nécessité du champ booléen pour tous les
noeuds et pas seulement pour les feuilles.
Ce codage des dictionnaire est très flexible, dans le sens qu'il
permet la réalisation efficace de nombreuses opérations.
Ainsi, on vérifie très simplement si un mot donné appartient au
dictionnaire en suivant le chemin défini par les lettres du mot.
Il est aussi très facile de lister les mots du dictionnaire dans
l'ordre, ou encore de lister tous les mots compris entre deux mots.
En pratique, la réalisation des arbres n-aires doit être effectuée
selon un compromis adapté entre la taille de la structure et
l'efficacité des opérations. Je vois au moins quatre façons de
réaliser effectivement de tels arbres, à l'aide d'un tableau de fils
de taille le nombre de lettres, à l'aide de listes d'associations,
comme des arbres binaires [2], et à l'aide de
ternary search trees [1]. C'est à vous de faire un
choix.
Anagrammes d'un mot
On peut maintenant trouver tous les anagrammes de, par exemple,
sac, en un parcours incomplet de l'arbre.
Sur ce dessin, les arcs non-parcourus sont pointillés,
chaque noeud parcouru est décoré par le stock de lettres pertinent à
chaque étape, et les noeuds correspondant à des anagrammes sont en
noir (on trouve les anagrammes eux-mêmes en « lisant » les chemins qui
mènent aux noeuds noirs).
Étant donné un noeud et un stock de lettres, le parcours ne suit
que les arcs dont l'étiquette appartient au stock.
Ce caractère est alors consommé comme il apparaît dans le stock du
noeud cible.
Les noeuds noirs sont alors les anciens noeuds gris avec un
stock vide.
Anagrammes formés de plusieurs mots
Il est conceptuellement facile de modifier le parcours décrit
précédemment pour qu'il trouve les anagrammes partiels (n'utilisant
qu'une partie du stock de lettres). Il suffit de noircir tous les
noeuds gris vus lors du parcours. En répétant ce procédé on devrait
réaliser le projet.
Notons
quand même que la contrainte de ne pas afficher deux fois le même
multi-ensemble de mots complique un peu les choses.
Pour ce faire, je vois deux idées (il peut y en avoir d'autres). On
peut soit trouver les anagrammes dans l'ordre croissant des mots qui
les composent, ou encore supprimer un mot du dictionnaire quand tous
les anagrammes qui le contiennent ont étés trouvés. Ici encore il
faut choisir.
Prolongement
On considère un problème un peu différent : sélectionner, parmi
les anagrammes traditionnels d'un mot, ceux qui peuvent se
prononcer facilement, ou encore qui sont des mots qui auraient pu
exister.
Par exemple l'état civil de Marguerite Yourcenar
est Marguerite de Crayencour(t). Marguerite Yourcenar a donc (à
une lettre près) choisi un anagramme de son nom de famille comme
pseudonyme.
Il est demandé un programme qui produit ce style d'anagrammes.
L'idée est cette fois de choisir un entier w ni trop grand ni trop
petit et de décréter qu'un anagramme est vraisemblable quand
tous ses sous-mots de longueur w sont des sous-mots de mots d'un
dictionnaire donné.
Ainsi par exemple, en choisissant w = 4,
on peut dire que yourcenar ressemble bien à un mot français,
puisque l'on a les sous-mots suivants de mots français.
yourte,
sourcil,
pourceau,
percent,
mercenaire,
et renard.
On peut renforcer cette conviction de vraisemblance en considérant le
préfixe et le suffixe de trois lettres you et nar.
En effet, ils sont bien respectivement un préfixe et un suffixe de
mots français, (youyou et
dinar). Cela revient simplement à se donner deux
lettres supplémentaires signifiant début et fin de mot. En outre, on
peut, en considérant le nombre d'apparitions d'un sous-mot donné dans
le dictionnaire français, produire un indice de vraisemblance
permettant de présenter les anagrammes en commençant par les plus
raisonnables et finissant par les plus étranges.
Références
- [1]
- Jon Bentley and Bob Segdgewick, ``Fast Algorithms
for Sorting and Searching'',
Proceedings of the 8th Annual ACM-SIAM Symposium on Discrete
Algorithms, Juanary 1997.
http://www.cs.princeton.edu/~rs/strings/.
- [2]
- Paul Zimmerman, ``Epelle, un logiciel de
détection de fautes d'orthographe'',
rapport de recherche 2030 de l'Inria Rocquencourt, septembre 1993.
- *
- Luc.Maranget@inria.fr
Ce document a été traduit de LATEX par
HEVEA.