2012-07-17 Jouer avec des listes de mots

Dernière modification

Résumé : Où trouver des listes de mots, et quelques lignes de commande pour jouer avec celles-ci

Modifié(e) :

< Dans le Morphalou, j'ai aussi trouvé '''[http://en.wikipedia.org/wiki/Koppa_(letter) Qoppa]'''... Je me coucherai moins bête.

à

> Dans le Morphalou, j'ai aussi trouvé '''[http://en.wikipedia.org/wiki/Koppa_(letter) Qoppa]'''...
> Je me coucherai moins bête.


http://www.k1ka.be/pics/Lexicon.jpg

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:

Escalator, Hygiaphone, Martini, Melba, Orlon, Rimmel, Téflon, Tergal

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:

AutoCAD, Bescherelle, BSD, GNU, Goodwin, IEEE, INRIA, LISP, Mathematica

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.