Liste de mots

Récemment, j’ai eu besoin de trouver une liste de mots, une liste exhaustive de mots en français. Une telle liste peut avoir plusieurs usages comme,  par exemple:

  • jouer au scrabble en solitaire
  • solutionner automatiquement des grilles de mots-croisés
  • etc

Ma recherche sur Internet ne m’a pas permis de trouver un fichier suffisamment complet mais j’ai découvert le programme CeWL qui permet de créer des listes en puisant des mots dans des sites WEB. L’idée est bonne.

CeWL est un logiciel libre écrit en Ruby mais je n’ai aucune connaissance de Ruby. J’ai donc décidé d’utiliser le même concept mais de le réaliser en Python. Mon approche initiale est de puiser tous les mots de Wikipédia en français. Pourquoi Wikipédia? La quantité des textes disponibles est impressionnante et la qualité de leurs textes est excellente (peu d’erreurs orthographiques).

La logique d’un tel programme se résume comme suit:

  1. visiter toutes (ou du moins plusieurs) pages de Wikipédia français.
  2. en extraire tous les mots affichés (ne pas tenir compte des mots HTML)
  3. filtrer pour conserver les mots appropriés au besoin
  4. éliminer les duplicata

La 1ère étape se fait facilement avec l’utilitaire wget et les 3 suivantes se font facilement en Python. Le résultat de la 1ère étape prendrait la forme de:

wget [options] fr.wikipedia.org | monFiltre > listeDeMots.txt

Le principe de wget est d’analyser une page WEB et de suivre tous les liens qu’elle contient. Chacune de ces pages contient aussi des liens qui en contiennent d’autres. En explorant tous ces liens, on réussit à explorer un site WEB en ne spécifiant qu’un seul point d’entrée.

wget -E -e robots=off -nd -r -l6 -w1 fr.wikipedia.org

La 2ième étape est plus complexe. Le fichier reçu est en langage HTML. On ne veut pas extraire des mots de la syntaxe HTML. Il faut donc localiser le texte affiché à l’intérieur du HTML. Ce pourrait être complexe car le HTML n’est pas simple.  Heureusement, Python et le module HTMLParser nous simplifieront la tâche. Il suffit d’utiliser le texte qui se trouve à l’intérieur des balises <body … </body> et à l’extérieur des balises <script … </script> et <a … </a>. Une version simplifiée serait:

class htmlParser( HTMLParser):
   def handle_starttag( self, tag, attr):
       enCours.append( tag)

   def handle_endtag( self, tag):
       for i in range( len(enCours), 0, -1):
          if enCours[i-1] == tag: del enCours[i-1]
 
   def handle_data( self, data):
      if ('body' in enCours) and not (('script' in enCours) or ('a' in enCours)):
         for c in ',.;:/(){}[]|?"%@!$&+=_\t\\': txt2 = txt2.replace( c, ' ') # tous sauf "-\'"
         mots = txt2.split()
         for mot in mots:
             # on met ici certaines exclusions ou contraintes:
             if mot.isnumeric(): continue # on ne veut pas de nombres
             mot = mot.lower(): tout en minuscules

             if not (mot in listeMots):
                 listeMots.append(mot)
                 print( mot)

L’étape 3 dépend des besoins spécifiques. Si on veut des mots pour le Scrabble, on remplacera les lettres accentuées par leur version non-accentuée et on convertira tout en majuscules (ou tout en minuscules).

L’étape 4 est facile à réaliser.

Une version plus complète est disponible ici.

Combien de pages faut-il visiter? La section française de Wikipédia contient près de 2 millions de pages. Faut-il toutes les visiter? Non! ce serait un gaspillage d’électrons libres. Plus on visite des pages moins on découvrira de mots nouveaux.  À partir d’un certain point, il n’y aura plus de nouveauté (du moins, c’est ce que je pensais).

Après 20 000 pages (plus de 3Go de trafic), ma liste s’allonge encore (elle est actuellement de plus de 700 000 mots. Malheureusement, j’avais sous-estimé le nombre de noms propres et de noms scientifiques dans les pages Wikipédia. Ma liste contient donc des milliers de noms de fleurs (en français et en latin), des dizaines de milliers de noms d’individus (tel « Éric » « Lapointe »), des centaines de milliers de noms de lieux (tel « Saint-Jean » « Matha ») et des fautes (telle ciconscriptions). Ma 1ère conclusion est que Wikipédia fournit un contenu trop encyclopédique pour mon besoin. Je referai donc le même exercice avec le contenu d’un ensemble de romans. C’est à suivre.

2ième conclusion: ce qui est simple n’est pas nécessairement performant. Le programme présenté plus haut est simple et même trop simple. Un énoncé du genre « if mot in listeMots » semble inoffensif mais lorsque la liste contient plusieurs centaines de milliers de mots, le temps d’exécution de l’énoncé est non-négligeable et devient un goulot d’étranglement. Il existe des techniques plus performantes et ce fera l’objet d’un article futur.

Sauvegarder vos mots-de-passe dans vim

Il est fortement recommandé de ne jamais réutiliser le même mot de passe sur deux sites différents. Suite au vol d’un fichier contenants 160 millions de mots de passe du site LinkedIn en 2012, plusieurs personnes ont connu des problèmes liés à de la fraude ou de l’usurpation d’identité. En effet, si le mot de passe utilisé sur LinkedIn était aussi utilisé sur Paypal, eBay ou une banque alors le fraudeur pouvait facilement puiser dans votre compte. Mais si on utilise un mot de passe différent pour chaque site, notre liste deviendra longue très rapidement.

Une longue liste de mots de passe crée des problèmes:

  • on n’arrive pas à tous les mémoriser
  • il n’y a pas assez de place sur l’écran pour y coller tous les post-it  🙂

D’où l’apparition de logiciels de stockage de mots de passe. Ils sont bien commodes mais ils ne sont pas parfaits. Leur principal défaut est qu’ils sont graphiques et, par conséquent, ils sont plus lourds que nécessaire. En effet, la couleur, les icônes et la décoration n ont aucune utilité pour gérer une liste de mots de passe.

Alors pourquoi ne pas utiliser un éditeur de texte?

J’utilise vim pour stocker mes mots de passe. Il est facile à utiliser,  rapide au démarrage et il permet le chiffrage de son contenu. En plus, il est installé par défaut, peu importe votre distribution. Voyons comment l’utiliser:

Étape 1: création du fichier:

vi -x nom_du_fichier

Un mot de passe vous sera demandé. À vous d’en choisir un qui n’est pas trop facile mais que pourrez mémoriser toute votre vie.

Étape 2: renforcer l’algorithme de chiffrage

Par défaut, l’algorithme de chiffrage est zip et ce chiffrage peut être craqué. Il est très simple de choisir une meilleure méthode de chiffrage:

:set cryptmethod=blowfish2

Vous pouvez alors entrer vos sites et leur mots de passe.

Étape3: sauvegarder

:wq

Par la suite, on accède au fichier avec:

vi nom_du_fichier      # notez que le -x n'est pas requis

et si vous êtes amateur de performance, pourquoi ne pas créer un alias

alias mdp='vi ~/chemin/nom_du_fichier'

que vous déposerez dans le fichier .bash_profile de votre répertoire.

Si vous êtes du genre parano, 2 options supplémentaires peuvent être ajoutées à l’étape2:

:set nobackup
:set nowritebackup

Ces commandes indiquent à vim de ne pas créer des copies de sauvegarde ou temporaire.

Essayez, vous verrez que c’est simple et efficace. Et nul besoin  d’apprendre les commandes de vim.

Note1: les mots de passe LinkedIn ne sont pas les seuls à avoir été divulgués. En 2009, il y a eu intrusion dans le site RockYou.com. Un fichier contenant 32 millions de mots de passe a été dérobé et il est assez facile de consulter ce fichier sur Internet. Vous pouvez même trouver des études sur le contenu de ce fichier; on peut y voir que certains mots de passes sont beaucoup plus populaires que d’autres.

Note2: le chiffrage est une option dans vim. L’option est incluse avec toutes les distributions récentes. Pour s’en assurer, il suffit de faire:

vim  --version | grep cryptv

Si le mot cryptv est précédé d’un +, alors l’option est incluse. Sinon, vous ne l’avez pas.

Note3: si vous aviez un compte LinkedIn en 2012, vous pouvez vérifier si votre mot-de-passe a été volé en consultant le site https://haveibeenpwned.com/