Il est parfois utile de disposer d'une liste des mots français, par exemple pour rechercher des rimes si on veut jouer au poète, pour s'exercer aux algorithmes incontournables que sont la recherche d'anagrammes, de palindromes, la construction d'arbres de recherches, ou d'autres joyeusetés, enfin simplement par curiosité ou par jeu.
Une solution est de recourir aux dictionnaires des correcteurs orthographiques. On dispose pour cela de Aspell qui a succédé à Ispell, ainsi que de hunspell qui a lui-même succédé à myspell. Ce dernier était le correcteur de la suite OpenOffice, mais il a évolué comme un projet autonome, tandis que la suite bureautique ne demande plus elle-même que le correcteur soit présent en tant que package indépendant (mais il semble bien qu'elle utilise ses dictionnaires).
Ces dictionnaires se fondent sur une liste de mots sous forme de leur radical accompagnés d'une série de drapeaux spécifiant comment les formes «fléchies» (plurielles, conjuguées) en sont dérivées, ainsi que les fichiers reprenant les «affixes» correspondants. Ces fichiers ne sont donc pas utilisables directement si on souhaite disposer de toutes les variantes des mots.
Pour Ispell, on avait le choix pour le français entre le dictionnaire GUTenberg et celui dit «ireq» (Hydro-Québec). Les sources de GUTenberg comprennent un petit script qui effectue l'expansion des formes fléchies:
#! /bin/sh # Ce petit programme produit la liste de tous les mots présents dans # le dictionnaire à raison d'un mot par ligne # !!!!! ATTENTION : LE FICHIER OBTENU FERA PLUS DE 6 MÉGAOCTETS !!!!! echo "Création de la liste de mots de votre dictionnaire en cours..." cat ../francais.dico | ispell -e -d ../francais | tr ' ' '\n' > francais.mots echo "Opération terminée ! Résultat dans 'francais.mots'"
Si on ne souhaite pas installer Ispell, la liste résultante est disponible sur le site http://www.pallier.org où l'on trouve d'autres ressources intéressantes:
http://www.pallier.org/ressources/dicofr/liste.de.mots.francais.frgut.txt
Aspell est accompagné d'un dictionnaire français qui combine les deux précités. La recette est alors:
$ aspell -l fr dump master | aspell -l fr expand | tr ' ' '\n' | sort > liste_aspell.txt
Pour se faire une idée du contenu de ces listes, on peut recourir à l'utilitaire comm qui liste en trois colonnes le contenu de fichiers triés:
Avec l'option -23, on supprime l'affichage des colonnes correspondantes, ce qui revient à ne conserver que ce qui est propre au premier fichier.
À partir de la liste d'Aspell et de GUTenberg, on peut ainsi retrouver ceux qui étaient propre à l'ireq:
$ comm -13 liste.de.mots.francais.frgut.txt liste_aspell.txt | wc -l 293038 $ comm -13 liste.de.mots.francais.frgut.txt liste_aspell.txt > liste_nonGUT.txt
On peut ainsi constater que les mots de GUTenberg débutant par une majuscule sont peu nombreux:
$ grep -e "^[A-Z]" liste.de.mots.francais.frgut.txt | wc -l 76
et correspondent pour beaucoup à des marques passées dans le langage courant, mais qui ont conservé leur individualité en tant que produit:
Dans les mots provenant de l'IREQ, on trouve plus de prénoms, de noms de marque, des acronymes, etc. Rien que les mots débutant par une majuscule sont au nombre de 418 et comprennent des prénoms, des sigles informatiques, des noms de ville, de logiciels:
Il me semble qu'elle reflète plus le milieu technicien dont elle est issue, alors que GUTenberg serait (?) plus littéraire.
Hunspell ne semble pas disposer d'une option permettant de «dumper» la liste de mots, mais son dictionnaire français provient du site communautaire Dicollecte où l'on trouve les mots rassemblés sous leur forme fléchie dans une archive comprenant un fichier texte de 547673 entrées (version 4.5 du 13 mai 2012).
C'est un fichier qui comprend pour chaque entrée (chaque ligne) la forme fléchie et le lemme, des données statistiques, un drapeau spécifiant la forme grammaticale, etc.
Pour en extraire les formes fléchies, j'ai utilisé la commande
$ cat lexique-dicollecte-fr-v4.5.txt | cut -f 2 | sort | uniq > liste_dicollecte.txt
Pour me limiter aux formes fléchies sans les noms géographiques, ni les prénoms, ni les patronymes, je me suis servi de grep pour exclure les entrées correspondant aux drapeaux concernés:
$ grep -v "\s\(geo\|patr\|prn\)\s" lexique-dicollecte-fr-v4.5.txt | cut -f 2 | sort | uniq > liste_dicollecte2.txt
Ces trois sources constituent de bons points de départ. Il en existe d'autres comme le lexique Morphalou du Centre National de Ressources Textuelles et Lexicales, ou les listes de mots du Scrabble (je reviendrai sur celles-ci à une autre occasion). Pour info, voici le nombre d'entrées que j'y ai comptées:
Aspell 629569 Dicollecte 422970 Dicollecte 418618 (sans les prénoms, patronymes, lieux géographiques) Morphalou 410939 ODS5 378974 (ASCII) GUTenberg 336532
Il peut être utile d'en éliminer toutes les variantes accentuées des caractères - et non 7-bits, comme l'e dans l'o de cœur, ou les cédilles. C'est ce qui convient lorsqu'on recherche des anagrammes, et c'est ainsi que se présentent les listes de mots du Scrabble.
Pour effectuer cette conversion, on utilisera recode. Soit à titre d'exemple un fichier comprenant divers caractères non-ascii:
$ cat utf8.txt éèêë ÉÈÊË àùüîï ÀÙÜÎÏ ñç ÑÇ œæ ŒÆ «abc» $ recode -f utf8..flat < utf8.txt > ascii.txt $ cat ascii.txt eeee EEEE auuii AUUII nc NC oe OE <abc>
On remarque que malheureusement l'e dans l'a est passé à la trappe... Certains dictionnaires en font usage (Dicollecte, Morphalou: æpyornis, æschne...), il faudra donc les convertir au préalable avec tr.
À la suite d'une telle conversion, on peut éliminer les doublons qui en résulteraient:
$ cat liste.txt | sort | uniq > liste2.txt
Pour convertir de minuscules en majuscules:
$ cat lowcase.txt | tr '[:lower:]' '[:upper:]' > UPCASE.txt
Il faut aussi régler le cas des mots comportant des tirets, des apostrophes...
Cela étant dit, il est assez jubilatoire de constater comme l'amateur de jeux de mots dispose d'outils multiples et libres pour effectuer des recherches une fois qu'il dispose de telles listes:
$ grep -e "ù" liste_morphalou.txt où
...eh oui, nous disposons d'une touche ù sur nos claviers pour cet unique usage !
Les mots conprenant plus de 6 consonnes consécutives:
$ grep -iE "[^aeiouy]{6,}" ODS5.txt BORCHTCH BORCHTCHS BORTSCHS ESCHSCHOLTZIA ESCHSCHOLTZIAS
Ceux comprenant plus de n fois une lettre rare:
$ grep -iE "k.*k.*k" liste_morphalou.txt kakochnik kakochniks knickerbockers
On peut utiliser pour le même usage la référence arrière:
$ grep -iE "(k).*\1.*\1" liste_morphalou.txt
et en généralisant, chercher les mots qui comprennent le plus de lettres semblables, sans distinction:
$ grep -E "(.).*\1.*\1.*\1.*\1.*\1.*\1" ODS5.txt ASSASSINASSES ASSASSINASSIONS RESSASSASSES RESSASSASSIONS
Les mots «bègues»:
$ grep -E "^(.*)(\1){1,}$" liste_dicollecte.txt | tr '\n' ' ' baba bébé béribéri bibi blabla blablabla bobo bonbon boubou bouiboui byebye caca cachecache cancan chachacha chercher chichi chouchou chowchow coco coincoin coucou coupecoupe couscous cracra cricri cuicui dada daredare dodo dondon doudou dumdum entent fiftyfifty flafla flonflon foufou froufrou gaga galgal GG glouglou gnangnan gogo gouzigouzi grigri guiliguili II III joujou kifkif kiki lolo loulou lulu mémé miammiam mimi mm MM motamota nana néné neuneu nono nounou papa passepasse pépé pioupiou pipi poussepousse pp ppp rairai rentrent ronron sassas SS tamtam tata tchatcha tchintchin testes tété teufteuf tintin titi tonton toto toutou traintrain trantran troutrou tsétsé tsointsoin TT tutu vévé XX XXX yéyé youyou yoyo zinzin zizi zozo
Existe-t-il des mots où q n'est pas suivi de u ?
$ grep -iE "q[^u]" liste.de.mots.francais.frgut.txt coqs iraqien iraqienne iraqiennes iraqiens piqûre piqûres surpiqûre surpiqûres
Dans le Morphalou, j'ai aussi trouvé Qoppa...
Je me coucherai moins bête.