À la découverte de Hunspell et autres spell checkers

Si vous cherchez à construire une application de traduction ou de dictionnaire, votre principal souci sera d’avoir des données de qualité. Ajoutons en contraintes le fait que certaines langues sont à déclinaisons. Les personnes qui auront fait du latin ou de l’allemand reconnaîtront ce terme.

Dans une langue à déclinaisons, les mots changent de forme selon leur rôle grammatical dans la phrase. En albanais, il y a 5 cas grammaticaux : Nominatif (Sujet), Accusatif (COD), Datif (COI), Génitif (Indique la possession, souvent le complément du nom), Ablatif (Souvent utilisé avec des prépositions qui indiquent une origine).

Pourquoi l’albanais ? Parce que je développe justement une application mobile qui doit m’aider à déterminer les déclinaisons d’un mot albanais !

Autre particularité de cette langue : un mot se décline selon son rôle grammatical, mais aussi son nombre (singulier ou pluriel) et son caractère défini ou indéfini (le chien ou un chien). Un même mot a donc 20 déclinaisons possibles.

Pour illustrer, voici les déclinaisons du mot makinë (voiture) :

Table Albanian Grammar
singulier
(numri njёjёs)
pluriel
(numri shumёs)
forme indéfinie
(trajta të pashquara)
forme définie
(trajta të shquara)
forme indéfinie
(trajta të pashquara)
forme définie
(trajta të shquara)
nominatif
(emërore)
(një) makinë makina (disa) makina makinat
accusatif
(kallëzore)
(një) makinë makinën (disa) makina makinat
génitif
(gjinore)(i/e/të/së)
(një) makine makinës (disa) makinave makinavet
datif
(dhanore)
(një) makine makinës (disa) makinave makinavet
ablatif
(rrjedhore) (prej)
(një) makine makinës (disa) makinash makinavet

Ce qui compte pour apprendre les déclinaisons en albanais, c’est de savoir la forme que prend le mot au nominatif pour chaque nombre et pour chaque caractère défini ou indéfini : 

  • nominatif indéfini singulier (Një makinë e kuqe - une voiture rouge)
  • nominatif défini singulier (Makina e kuqe - la voiture rouge)
  • nominatif indéfini pluriel (Disa makina të kuqe - des voitures rouges)
  • nominatif défini pluriel (Makinat e kuqe - les voitures rouges)

En effet, même si les déclinaisons sont en général régulières, il existe des mots qui sont irréguliers. Certains dictionnaires fournissent donc une description des formes au nominatif du mot recherché.

Par exemple, sur fjalorthi.com, voici le résultat obtenu en recherchant makinë :


Définition de makinë sur fjalorthi.com

Ici, makin est le radical du mot, avec successivement :

  • /ë pour le nominatif indéfini singulier, donc makin + ë, makinë
  • -a pour le nominatif défini singulier, donc makin + a, makina
  • -a pour le nominatif indéfini pluriel, donc makin + a, makina
  • (t) pour le nominatif défini pluriel, donc makin + at, makinat

Obtenir un dataset qui fournit toutes les informations nécessaires à construire les déclinaisons

La complexité pour cette langue, qui est finalement assez peu parlée (environ 8 millions de locuteurs dans le monde), est d’avoir de la donnée libre de droit, gratuite et de qualité. C’est donc compliqué de savoir si un mot que vous écrivez est correct. D’ailleurs, comment les logiciels comme LibreOffice font-ils pour vérifier le format de ce qui est écrit ?

Hunspell, MySpell & Ispell, les spell checkers utilisés pour vérifier les mots

Hunspell est un spell checker. Littéralement, il vérifie comment un mot est épelé. C’est justement l’outil utilisé dans LibreOffice et dans nombre d'autres logiciels pour faire le spell checking (Firefox, Thunderbird, macOS, Opera…). Il s’agit de la troisième génération de spell checkers. Hunspell se base sur MySpell, lui-même basé sur ASpell et ISpell.

Installation

Hunspell s’installe facilement avec apt sur Linux ou avec brew pour MacOS. Vous pouvez aussi télécharger et compiler les sources si jamais ces méthodes ne vous conviennent pas. L’exemple sera sur MacOS.

brew install hunspell

Pour vérifier que l’installation s’est bien déroulée. Exécutez la commande suivante :

hunspell -v

Vous devriez avoir un résultat comme celui-ci (notez qu’Ispell et Myspell sont mis en avant) :

@(#) International Ispell Version 3.2.06 (but really Hunspell 1.7.2)

Copyright (C) 2002-2022 László Németh. License: MPL/GPL/LGPL.

Based on OpenOffice.org's Myspell library.
Myspell's copyright (C) Kevin Hendricks, 2001-2002, License: BSD.

This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, 
to the extent permitted by law.

Usage

Pour changer l’encodage de Hunspell, passez -i en argument. Par exemple :

hunspell -d sq_AL -i UTF-8

-d spécifie le dictionnaire à utiliser. Dans l’exemple ci-dessus, nous utilisons l’albanais. SQ est l’abréviation de Shqip, qui veut dire Albanais en Albanais.

Il y a de fortes chances que l’exécution de la commande ci-dessus produise cette erreur :

Can't open affix or dictionary files for dictionary named "sq_AL".

Cela signifie que Hunspell n’a pas le dictionnaire correspondant à l’entrée demandée (sq_AL). Dans ce cas, il faut en télécharger un. Hunspell travaille avec un couple de fichiers .dic et .aff qui ont des rôles bien définis.

Anatomie des fichiers .dic et .aff

Un fichier .dic liste ses mots un par un, avec un saut de ligne entre chaque :

ënjtur/LK
ënjtura/Z
ënjture
*ënjturëtet

Des caractères spéciaux sont aussi insérés. Le slash indique qu’une ou plusieurs règles sont définies dans le fichier .aff et s’appliquent à ce mot.  Pour ënjtur, il s’agit de la règle L et de la règle K. Pour ënjtura, il s’agit de la règle Z. L’astérisque en préfixe indique un mot interdit dans le dictionnaire.

En regardant dans le fichier .aff pour chercher la règle Z, voici ce qu’on observe :

PFX Z Y 1
PFX Z   0    ç'           .

Cela signifie :

  • PFX = règle de préfixe
  • Z = le nom de l’indicateur (c’est à cela que /Z fait référence dans le mot du dictionnaire)
  • Y = ce préfixe peut être combiné avec des règles de suffixe si nécessaire
  • 1 = il n’existe qu’une seule transformation de préfixe pour cet indicateur

Transformation : 0 ç’.

  • 0 signifie « ne rien supprimer du début du mot »
  • ç’ signifie « ajouter ceci au début »
  • . (oui il y a un point à la fin de la deuxième ligne) signifie « appliquer à tous les mots » (aucune restriction de motif)

Donc, /Z indique à Hunspell “Génère une forme supplémentaire du mot précédée de ç’”

Par exemple :

  • Forme de base : ënjtura
  • Avec /Z : ç'ënjtura (qui signifie approximativement « ce qui est gonflé » au sens de « ce qui a gonflé » précédé d’un clitique « ç’ » comme « quoi » ou « lequel » en albanais).

Les règles sont nombreuses et le manpage de hunspell bien fourni. Je vous invite à lire le reste ! Finalement, ce double format plutôt malin de sources permet à partir de fichiers relativement petits de générer beaucoup de mots.

Récupérer et utiliser des fichiers .dic et .aff

Ces fichiers sont disponibles à plusieurs endroits en ligne. Dans mon cas, j’ai choisi de télécharger le dictionnaire MySpell mis à disposition par Shkenca ici. C’est une organisation qui met en ligne de nombreuses ressources sur la langue albanaise, dont un dictionnaire en ligne et ce fichier. Hunspell est bien compatible avec MySpell.

C’est un zip. Décompressez-le dans un répertoire de travail. Commencez par faire attention à l’encodage des fichiers .dic et .aff. Par défaut, Hunspell travaille en UTF-8 mais les fichiers sont régulièrement dans un autre encodage. Dans ce cas, ou vous changez l’encodage des fichiers, ou vous spécifiez en option de Hunspell l’encodage à utiliser.

Attention cependant, le fichier .aff spécifie l’encodage à utiliser en début de fichier via l’instruction SET <encoding>.

Il faut que l’ensemble soit cohérent :

  • encodage des fichiers .dic et .aff
  • SET <encoding>
  • argument -i.

Lorsque c’est fait, spécifiez le chemin des dictionnaires .dic et .aff. Il faut que le nom du fichier soit le même et que seule l’extension change. Pour des fichiers nommés sq_AL.dic et sq_AL.aff, voici la commande correspondante :

hunspell -d <path>/sq_AL -i utf8

Si tout se passe bien, l’interpréteur se lance :

Hunspell 1.7.2

À partir de là, vous pouvez soumettre vos mots albanais et voir ce que Hunspell va vous répondre. Essayez avec makinë : 

makinë
*

L’astérisque signifie que le mot est valide pour Hunspell.

Essayez maintenant une déclinaison du mot qui n’existe pas :

makino
& makino 3 0: makine, makina, makinë

Ici, Hunspell indique qu’il y a une erreur dans la saisie et suggère 3 mots comme correction (d’où le chiffre 3 dans 3 0). Le chiffre 0 spécifie l’index dans la ligne du premier caractère du mot en erreur.

Essayons avec plusieurs mots. Pour tridhjetë e pesë makino (35 voitures)  :

tridhjetë e pesë makino
*
*
*
& makino 3 17: makine, makina, makinë

Nous avons trois astérisques. Ils valident les 3 premiers mots. Le dernier mot est en erreur.

Limitations

Hunspell ne vérifie pas la bonne exécution des règles de grammaire. Il vérifie uniquement que les mots saisis existent en calculant un certain nombre de règles. Par exemple, si on lui soumet un équivalent albanais grammaticalement faux de “Ma voiture”...

makinë ime
*
*

…Hunspell considère que c’est valide, alors que makinë correspond au nominatif indéfini et ime au nominatif défini.

La version correcte serait makina ime :

makina ime
*
*

Attention alors à bien mesurer pour quel travail vous utilisez cet outil. Un correcteur orthographique mot à mot oui, mais il n’y aura pas de vérification de cohérence sur toute une phrase.

Dernier regret : il n’est pas possible de créer un dictionnaire “classique” à partir de dictionnaires construits pour Hunspell. L’open data sur l’albanais manquant un peu, ça aurait pu s’avérer très utile.

Conclusion

Connaître comment fonctionne Hunspell permet de comprendre comment fonctionnent certains correcteurs orthographiques, que ce soit pour leurs avantages et pour leurs limitations. Attention à bien le configurer et à maîtriser les objectifs recherchés. Malgré tout, c’est un super outil du monde opensource, dont le code et les dictionnaires sont maintenus de manière communautaire sur Weblate.

Pour aller plus loin

Il existe des implémentations dans beaucoup de langages de bibliothèques qui utilisent Hunspell. Pensez par exemple à Pyspell en Python !

Sources