URL: https://linuxfr.org/news/grammalecte-correcteur-grammatical-2 Title: Grammalecte, correcteur grammatical [2] Authors: Olivier Davy Defaud, ZeroHeure, BenoĂźt Sibaud, bubarđŠ„, Pierre Jarillon, claudex et Nils Ratusznik Date: 2017ćčŽ06æ07æ„T12:27:07+02:00 License: CC By-SA Tags: grammalecte, correcteur, grammaire, orthographe, français, libreoffice et firefox Score: 150 Grammalecte est un correcteur grammatical Ă©crit en Python et en JavaScript, dĂ©diĂ© Ă la langue française, disponible pour LibreOffice, Firefox, Thunderbird, ainsi que comme programme autonome, via une interface en ligne de commande ou un serveur. Par ailleurs, dâaimables contributeurs ont apportĂ© leur pierre Ă lâĂ©difice en concevant des greffons pour Vim et Emacs. Grammalecte lance [une deuxiĂšme campagne de financement](https://fr.ulule.com/grammalecte-2/) pour amĂ©liorer la correction grammaticale et faire Ă©voluer les intĂ©grations aux navigateurs Web.  **NdM. :** la campagne a Ă©tĂ© financĂ©e Ă 103 % (soit 15 538 âŹ). Le premier palier _AmĂ©liorer la correction grammaticale_ a donc Ă©tĂ© dĂ©bloquĂ©, mais les paliers _CrĂ©er une extension pour Chrome_ et _Concevoir et amĂ©liorer des outils annexes_. Cet article est trĂšs long. PlutĂŽt que rĂ©pĂ©ter ce qui a dĂ©jĂ Ă©tĂ© dit, je vais prĂ©sumer que vous avez un souvenir Ă peu prĂšs clair du [billet prĂ©cĂ©dent sur ce sujet](http://linuxfr.org/news/grammalecte-correcteur-grammatical). Cela dit, mĂȘme sans ça, ce que je vais dire devrait ĂȘtre intelligible. ---- [Site officiel](http://grammalecte.net) [Campagne de financement participatif](https://fr.ulule.com/grammalecte-2/) ---- # Ce qui a Ă©tĂ© fait ## SĂ©paration du correcteur dâavec Hunspell et LibreOffice CâĂ©tait le prĂ©requis Ă lâindĂ©pendance du logiciel, et câest la premiĂšre chose qui a Ă©tĂ© faite. Au lieu de consulter Hunspell, le correcteur orthographique, pour connaĂźtre lâĂ©tiquetage grammatical des mots, Grammalecte interroge dorĂ©navant son propre dictionnaire indexable. Il sâagit dâun graphe de mots contenant toutes les formes graphiques que peuvent avoir les mots français : les pluriels, les formes fĂ©minines et masculines, et les conjugaisons.  Le graphe contient 500 966 entrĂ©es, avec 140 caractĂšres diffĂ©rents, 901 codes de suffixation, 6 066 Ă©tiquettes grammaticales, et est composĂ© de 110 796 nĆuds et 236 744 arcs (liens qui vont dâun nĆud Ă un autre). Tout ça est compressĂ© sous forme dâun dictionnaire binaire indexable pesant environ 1,25 Mio (le fichier texte non compressĂ© pĂšse environ 18,6 Mio). Mais le principal avantage de ce dernier nâest pas sa petite taille, câest quâon peut le parcourir trĂšs rapidement et lâinterroger sans avoir Ă le dĂ©compresser. Il peut fournir deux sortes dâinformations : un mot estâil prĂ©sent dans le dictionnaire et, si oui, quelle est sa nature grammaticale. GrĂące Ă cela, Grammalecte peut fonctionner de maniĂšre autonome. ## Extension pour Firefox & Thunderbird Le correcteur a Ă©tĂ© entiĂšrement réécrit en JavaScript avec une interface pour Firefox, qui sâappuie principalement sur lâAPI SDK de haut niveau et quelques fonctionnalitĂ©s de bas niveau. Lâinterface est faite en HTML/CSS. LâAPI de Thunderbird Ă©tant complĂštement diffĂ©rente de celle de Firefox, cette extension est une autre réécriture en JavaScript de lâextension, hormis le cĆur du moteur grammatical, bien sĂ»r. Lâinterface est bĂątie avec lâancienne technologie XUL encore en vigueur sur Thunderbird. La documentation concernant Thunderbird Ă©tant en partie tombĂ©e en dĂ©shĂ©rence (liens cassĂ©s, pages manquantes, sections disparues, sites Web Ă lâabandon ou Ă©vaporĂ©s), jâai parfois fait emploi de techniques trouvĂ©es dans dâautres extensions, mais ça ne concerne quâune minoritĂ© de problĂšmes, et je me suis contentĂ© autant que possible de suivre ce qui Ă©tait documentĂ©. Le fonctionnement de lâextension est assez similaire Ă celle pour Firefox. Votre texte est analysĂ© dans un panneau annexe. En revanche, contrairement Ă Firefox, les erreurs sont listĂ©es en dessous du paragraphe analysĂ©. Hormis cela, tout est relativement semblable, sauf lâallure gĂ©nĂ©rale de lâextension, qui fait plus vieux jeu, parce que XUL est dâune conception plus ancienne. La mauvaise nouvelle, pour Firefox, câest quâil faudrait dĂ©jĂ refaire lâinterface. Quand jâai commencĂ© le codage de lâextension, Mozilla prĂ©parait une nouvelle API pour les extensions, appelĂ©e WebExtension, qui Ă©tait alors en version alpha. Câest la quatriĂšme API pour Firefox, les trois autres Ă©tant XUL, Bootstrapped et le SDK (haut niveau et bas niveau). Il Ă©tait dit que ces trois API deviendraient obsolĂštes dâici quelques annĂ©es, sauf le SDK de haut niveau, et quâil fallait utiliser ça en attendant que lâAPI WebExtension fĂ»t finalisĂ©e. Câest donc ce que jâai fait. Grammalecte pour Firefox est sorti Ă peu prĂšs au mĂȘme moment que WebExtension. Quelques mois plus tard, les trois autres API ont Ă©tĂ© dĂ©clarĂ©es obsolĂštes, y compris le SDK de haut niveau, contrairement Ă ce qui avait Ă©tĂ© annoncĂ©, et toutes les trois seront supprimĂ©es en novembre prochain avec Firefox 57.  Câest vraiment trĂšs irritant, mais lâon nây peut pas grandâchose. Ceci dĂ©coule probablement de la volontĂ© de Mozilla de réécrire tout le cĆur de Firefox. Ce qui nâapporte pas que de mauvaises choses, puisque, par exemple, jâai constatĂ© que le correcteur grammatical fonctionnait plus de deux fois plus vite Ă partir de Firefox 55... Le cĆur de lâextension, le moteur grammatical, nâest pas Ă reprogrammer, il ne sâagit « que » de lâenrobage, lâinterfaçage... Jâignore si ça rĂ©clamera beaucoup de travail, je ne mây suis pas encore intĂ©ressĂ©. Lâun des autres soucis, câest que mĂȘme si WebExtension est dorĂ©navant le modĂšle dâextensions conseillĂ©, il semble quâil ne permette pas encore autant de choses que les API prĂ©cĂ©dentes. Cette API est toujours en dĂ©veloppement, Mozilla travaillant encore Ă Ă©tendre les possibilitĂ©s offertes. En ce qui concerne Thunderbird, je nâai rien vu passer... et jâignore si nous sommes Ă la veille dâune rĂ©volution surprise qui va tout casser. Mozilla nâa pas encore vĂ©rifiĂ© le code de lâextension pour Thunderbird : la liste dâattente est trĂšs longue. Heureusement, contrairement Ă Firefox il est possible dâinstaller une extension non vĂ©rifiĂ©e et non signĂ©e. Il nây a aucun risque de confidentialitĂ©. Le correcteur nâenvoie aucune donnĂ©e en ligne, absolument rien. Ce que vous Ă©crivez nâest pas transmis, tout se passe sur votre ordinateur. Pour ceux que ça intĂ©resse de tester, je viens de publier la [version 0.5.17](http://grammalecte.net/telechargement.php) : - [pour Firefox](http://www.dicollecte.org/grammalecte/oxt/French-GC%40grammalecte.net-v0.5.17.xpi) (il faut un Firefox capable dâinstaller les extensions non signĂ©es) ; - [pour Thunderbird](http://www.dicollecte.org/grammalecte/oxt/French-GC-TB%40grammalecte.net-v0.5.17.xpi) (Thunderbird peut installer les extensions non signĂ©es). ## Captures dâĂ©cran BoĂźtes de dialogue « Ă propos » :  Correcteur grammatical :  Conjugueur :  Formateur de texte :  Options grammaticales et orthographiques :   Interface en ligne de commande :  ## RĂ©vision du moteur interne du correcteur ### DĂ©sambiguĂŻsation Dans la prĂ©cĂ©dente dĂ©pĂȘche, je vous avais expliquĂ© que Grammalecte ne possĂ©dait pas de processus de dĂ©sambiguĂŻsation permettant dâĂ©tiqueter les mots en fonction du contexte. Par exemple, un mot comme « porte » peut ĂȘtre un verbe ou un nom fĂ©minin, et il est utile, lors de lâanalyse dâune phrase, dâavoir procĂ©dĂ© si possible Ă la dĂ©sambiguĂŻsation de sa nature grammaticale, afin que les rĂšgles de contrĂŽle nâaient pas Ă se poser la question Ă chaque fois. Comme expliquĂ© lors de la campagne de financement prĂ©cĂ©dente, Grammalecte intĂšgre dĂ©sormais des fonctions de dĂ©sambiguĂŻsation capables dâĂ©tiqueter et baliser le texte. Ce dĂ©sambiguĂŻsateur fonctionne dâune maniĂšre similaire aux rĂšgles de contrĂŽle et au processeur de texte. Une [[expression rationnelle]] dĂ©clenche une action de dĂ©sambiguĂŻsation si elle remplit la condition requise, de sorte que toutes les rĂšgles suivantes bĂ©nĂ©ficient dâun Ă©tiquetage plus prĂ©cis. Il y a trois types dâactions de dĂ©sambiguĂŻsation : la sĂ©lection (qui ne retient que les Ă©tiquettes conformes Ă une expression rationnelle), le filtre (qui supprime les Ă©tiquettes grammaticales non conformes), lâĂ©tiquetage (qui impose une ou plusieurs Ă©tiquettes, quelles que soient celles que le mot possĂšde alors). ### RĂšgles multiâactions Dans [le prĂ©cĂ©dent billet](http://linuxfr.org/news/grammalecte-correcteur-grammatical#principes-de-fonctionnement), je vous avais expliquĂ© que Grammalecte fonctionnait selon une succession de passes, dont chacune Ă©tait prĂ©cĂ©dĂ©e dâune transformation du texte par ce que jâappelais le « prĂ©processeur de texte ». Ce qui permettait de simplifier peu Ă peu le texte pour faciliter le contrĂŽle des rĂšgles grammaticales qui suivaient. Pour simplifier, cela fonctionnait ainsi : 1. Passe 1 (paragraphe par paragraphe) : - rĂšgles du prĂ©processeur de texte ; - rĂšgles de contrĂŽle. 1. Passe 2 (phrase par phrase) : - rĂšgles du prĂ©processeur de texte ; - rĂšgles de contrĂŽle. 1. Passe 3 (phrase par phrase) : - rĂšgles du prĂ©processeur de texte ; - rĂšgles de contrĂŽle. 1. etc. Dans ce systĂšme, chaque rĂšgle ne pouvait faire quâune seule chose (comme dans LanguageTool), et seulement si la condition qui contrĂŽlait sa mise en Ćuvre Ă©tait remplie. Peu de temps aprĂšs le dĂ©but de la campagne de financement, il mâest apparu quâil serait souhaitable de rendre plus souple ce fonctionnement. Il nâĂ©tait pas prĂ©vu au programme de toucher Ă cela, mais jâai prĂ©fĂ©rĂ© mâatteler tout de suite Ă cette tĂąche plutĂŽt que de regretter plus tard de ne pas lâavoir fait. Donc, Ă prĂ©sent, au lieu dâune succession de passes alternant transformation du texte et contrĂŽle de la grammaire, nous sommes revenus Ă simplement deux passes (une pour le contrĂŽle du paragraphe, une pour le contrĂŽle des phrases), mais chaque rĂšgle peut dorĂ©navant tout faire et peut accomplir autant dâactions quâon le souhaite, chaque action se dĂ©clenchant si la condition qui y est attachĂ©e est remplie. Donc, une rĂšgle peut dorĂ©navant opĂ©rer plusieurs actions de contrĂŽle, plusieurs actions de réécriture et plusieurs actions de dĂ©sambiguĂŻsation. Au commencement, je pensais que cette modification du fonctionnement nâaurait que peu de consĂ©quences, car elle nâĂ©tait pensĂ©e que pour me faciliter la tĂąche dans certains cas Ă©pineux, puis il mâest apparu que ça changeait en fait de si nombreuses choses que la transition de lâancien modĂšle vers le nouveau nâest toujours pas achevĂ©e Ă ce jour. Ăa nâa pas dâimportance puisque ça fonctionne aussi bien quâauparavant, mais la souplesse de ce fonctionnement apporte tellement dâavantages que je suis loin dâen avoir profitĂ© encore pleinement. Cela dit, depuis que Grammalecte fonctionne ainsi, des dizaines de rĂšgles complexes ont dĂ©jĂ Ă©tĂ© fusionnĂ©es, et cela a simplifiĂ© grandement le dĂ©roulement de nombreuses opĂ©rations. Prenons un exemple simple. Auparavant, si vous Ă©criviez « les ordinateur », il fallait deux rĂšgles de contrĂŽle pour souligner « les » et suggĂ©rer « le », et souligner « ordinateur » et suggĂ©rer « ordinateurs ». Ă prĂ©sent, une seule rĂšgle permet de faire les deux choses dâun coup. Autre exemple. Mettons que nous rencontrons la graphie « militant(e)s ». Une mĂȘme rĂšgle va permettre de faire trois choses : * suggĂ©rer dâĂ©crire ceci autrement (« militants et militantes », « militantes et militants », « militant·e·s ») ; * Ă©tiqueter ce mot inexistant dans le dictionnaire comme « nom ou adjectif Ă©picĂšne pluriel » ; * réécrire le mot en interne pour ĂŽter les parenthĂšses gĂȘnantes. ### DĂ©tection des erreurs De nombreuses rĂšgles de contrĂŽle ont Ă©tĂ© ajoutĂ©es... notamment concernant la dĂ©tection de confusions concernant les mots grammaticaux. La derniĂšre version du correcteur (v0.5.17) contient 21 actions de dĂ©sambiguĂŻsation, 687 actions du processeur de texte, 1 437 actions de contrĂŽle ; ces actions sont rĂ©parties dans 1 939 rĂšgles. Ă titre de comparatif, la version 0.4.10, qui suivait lâancienne logique, contenait 540 rĂšgles de transformation de texte et 933 rĂšgles de contrĂŽle, chacune nâeffectuant quâune seule action. Ces chiffres ne sont pas nĂ©cessairement trĂšs Ă©vocateurs, parce que rien ne comptabilise les modifications du fonctionnement des rĂšgles qui sont les plus nombreuses, ne seraitâce, par exemple, que sur les mĂ©thodes pour faire des suggestions. En fait, le potentiel du correcteur est encore sousâexploitĂ©, malgrĂ© les innombrables amĂ©liorations apportĂ©es ici et lĂ . Je nâavais pas assez insistĂ© sur ce point lors du dernier journal, alors je vais le rĂ©pĂ©ter encore une fois : les dĂ©tails sont ce qui rĂ©clame le plus de temps, car il faut songer que les possibilitĂ©s dâerreurs avoisinent lâinfini et que les possibilitĂ©s de faire des faux positifs sont aussi nombreuses. Dans les faits, amĂ©liorer le correcteur grammatical, câest sâoccuper sans cesse de microâproblĂ©matiques. Je réécris ici ce que jâai dit la derniĂšre fois : « Ăcrire des rĂšgles, câest assez rapide ; dĂ©tecter les faux positifs, câest beaucoup plus long ; ceuxâci ont tendance Ă survenir lĂ oĂč lâon sây attend le moins. Câest ce qui est le plus exigeant : maintenir un ensemble de rĂšgles, amĂ©liorer lâexistant, tester, trouver de nouvelles possibilitĂ©s. Lorsquâon sâoccupe dâun correcteur grammatical, on passe surtout son temps Ă peaufiner des dĂ©tails, Ă ajuster le fonctionnement de lâexistant, Ă arrondir les angles. Oubliez lâidĂ©e de concevoir lâalgorithme ultime qui saura gĂ©rer tous les cas. MĂȘme quand on est Ă peu prĂšs sĂ»r dâĂ©crire une petite rĂšgle tranquille qui ne gĂ©nĂ©rera aucun faux positif, la rĂ©alitĂ© va trĂšs probablement nous rappeler Ă lâordre et nous obliger Ă slalomer sur ce qui paraissait au commencement comme une belle ligne droite. Sâoccuper de correction grammaticale, câest marcher sur un chemin pavĂ© dâembĂ»ches subtiles. » Câest pourquoi lâĂ©volution du correcteur se fait pas Ă pas, en Ă©vitant autant que possible les modifications radicales. Le correcteur fonctionne beaucoup mieux depuis que toutes ces amĂ©liorations ont Ă©tĂ© faites, et jâespĂšre que câest sensible pour vous, car il mâest difficile de juger si ces amĂ©liorations sont visibles pour les utilisateurs. Parmi toutes les nouveautĂ©s apportĂ©es, il y a notamment : * beaucoup de rĂšgles pour dĂ©tecter des confusions entre les mots homonymes (comme ce, se et ceux) ; * beaucoup dâamĂ©liorations pour gĂ©rer les cas particuliers, clarifier le texte interne et augmenter le taux de dĂ©tection ; * toujours moins de faux positifs ; * une option pour dĂ©tecter les erreurs de [[reconnaissance optique de caractĂšres]] bien plus dĂ©veloppĂ©e (dĂ©sactivĂ©e par dĂ©faut) ; * beaucoup de rĂšgles de contrĂŽle ont Ă©tĂ© amĂ©liorĂ©es. ### Le moteur de suggestions LâamĂ©lioration des suggestions est lâun des points qui ont le plus progressĂ© depuis le prĂ©cĂ©dent journal, grĂące aux rĂšgles multiâactions qui ont permis de rendre plus systĂ©matiques la possibilitĂ© de faire deux suggestions diffĂ©rentes lors de la constatation dâun dĂ©saccord de genre, de nombre ou de conjugaison ; mais aussi surtout grĂące Ă la crĂ©ation dâune table de correspondance phonĂ©tique Ă partir de laquelle Grammalecte peut choisir des mots Ă suggĂ©rer en fonction de leur nature grammaticale. La table de correspondance phonĂ©tique est un simple fichier quâil est facile de complĂ©ter, câest une succession de mots homonymes, comme : * appareil, appareils, appareille, appareilles, appareillent ; * mec, mecs, Mecque ; * pouce, pouces, pousse, pousses, poussent ; * tĂȘte, tĂȘtes, tĂšte, tĂštes, tĂštent. Ă partir de cette liste, Grammalecte construit un miniâdictionnaire avec toutes les natures grammaticales possibles de chaque mot. Puis, au besoin, on peut demander, par exemple, de trouver un mot semblable à « tĂšte » en spĂ©cifiant les natures grammaticales acceptables (via une expression rationnelle). Il y a aussi quelques propositions de substitutions automatisĂ©es, pas toujours opportunes, ce point reste Ă amĂ©liorer. Si ça vous intĂ©resse, cette table est [consultable _ici_](http://code.grammalecte.net/artifact/049b9b49d362389e). Cette table phonĂ©tique ne rĂ©sout pas tous les problĂšmes, mais permet dans bien des cas de faire des suggestions de mots sans rapport grammatical avec le terme erronĂ©. Avant cela, le correcteur se contentait de signaler lâerreur, mais ne pouvait rien suggĂ©rer. Quelques exemples : * « Il **appareil** demain. » â appareille ; * « **La** **mec**. » â Le | Mecque ; * « **Une** **goulet** » â Un | goulĂ©e ; * « Il **pouce** le bouchon trop loin. » â pousse ; * « Jâen ai marre de ces **tĂštes** de nĆud. â tĂȘtes ; * « Ils ne **son** pas idiot. » â sont. Notez que le moteur de suggestions ne propose des mots ayant une autre racine que lorsquâil constate une anomalie (si un verbe prend la place de ce qui devrait ĂȘtre un nom, par exemple) ou sâil constate une erreur de genre. Sâil y a seulement une erreur de pluriel, il se contente de faire une correction de nombre. Mais il serait aussi possible dans ces casâlĂ de suggĂ©rer des mots diffĂ©rents. Par exemple « Des **homme** » â hommes | ohms | heaumes. Ăa mâa semblĂ© superflu de proposer de telles corrections, mais si vous jugez ça utile, ditesâleâmoi. ### Modifications diverses * lâĂ©criture des rĂšgles a Ă©tĂ© modifiĂ©e, il est plus aisĂ© de gĂ©rer la casse et les marges des motifs des expressions rationnelles ; * les rĂšgles sont regroupĂ©es par option, afin de pouvoir ajouter des rĂšgles optionnelles sans grĂ©ver les performances (lâoption de reconnaissance optique de caractĂšres, par exemple) ; * il est possible dâutiliser pour chaque action des opĂ©rateurs logiques (`__also__` et `__else__`) pour Ă©crire des conditions tenant compte du rĂ©sultat de la condition de lâaction prĂ©cĂ©dente ; * toutes les rĂšgles ont Ă©tĂ© nommĂ©es, afin de satisfaire aux nĂ©cessitĂ©s du greffon pour Vim (dĂ©sactivation paramĂ©trable de rĂšgles spĂ©cifiques) ; * tout le processus de construction a Ă©tĂ© revu et des tests ont Ă©tĂ© intĂ©grĂ©s pour Ă©viter certaines erreurs dâĂ©criture des rĂšgles ; * des marqueâpages pour sây retrouver dans la liste des rĂšgles, qui commence Ă devenir trĂšs, trĂšs longue (fonctionnalitĂ© ajoutĂ©e hier). ### Capture dâĂ©cran Voici Ă quoi ressemble le fichier des rĂšgles (sous SublimeText) :  ## Tests unitaires Auparavant, la situation sur ce point Ă©tait trĂšs mauvaise, puisquâil nây avait aucun test unitaire sur le correcteur, seulement des tests « manuels », câestâĂ âdire un fichier texte que jâouvrais de temps en temps avec Writer pour vĂ©rifier que le moteur fonctionnait comme prĂ©vu. Mais câĂ©tait loin dâĂȘtre exhaustif et facile Ă mettre en Ćuvre, puisque je vĂ©rifiais « Ă lâĆil » si Ă chaque ligne le correcteur trouvait bien lâerreur quâil Ă©tait censĂ© trouver. PĂ©nible et lent au possible. Ă prĂ©sent, Ă chaque modification, il est possible lors de la construction de tester si rien nâest cassĂ©. Plus de 6 200 tests sont lancĂ©s (dont 2 000 repris chez LanguageTool), et chaque rĂšgle de dĂ©tection doit ĂȘtre testĂ©e au moins une fois. MalgrĂ© cela, les tests ne sont pas encore exhaustifs (Ă bien y songer, il nâest sans doute pas possible dâĂȘtre exhaustif), mais la situation sâamĂ©liore indubitablement, et peu Ă peu le socle du correcteur devient de plus en plus solide. GrĂące Ă cela, de nombreuses erreurs dans le fonctionnement du correcteur ont Ă©tĂ© dĂ©tectĂ©es et corrigĂ©es. Beaucoup de ces tests sont lĂ pour vĂ©rifier quâune rĂšgle fonctionne correctement, mais une grande partie dâentre eux existent pour Ă©viter les faux positifs constatĂ©s lors des versions prĂ©cĂ©dentes. Ce sont les tests les plus nombreux, parce que les faux positifs sont lĂ©gion et quâil est trĂšs frĂ©quent dâen provoquer de nouveaux, quelle que soit la prudence avec laquelle on Ă©crit les rĂšgles. Pour les Ă©viter autant que possible, quelques textes courts ont Ă©tĂ© inclus dans les tests de Grammalecte : * *Le Horla*, de Guy de Maupassant ; * *Le double assassinat dans la rue Morgue*, dâEdgar Poe ; * *Les vers dorĂ©s*, de Pythagore ; * *LâĂ©pĂźtre du feu philosophique*, de Jean Pontanus. Avoir Ă©crit lâextension pour Firefox prĂ©sente par ailleurs un avantage considĂ©rable pour consolider la correction grammaticale : câest beaucoup plus facile de mettre le correcteur Ă lâĂ©preuve. Presque tous les jours, je lance des analyses grammaticales sur de nombreux articles de journaux et de blogs divers ; ça me permet de repĂ©rer et corriger des faux positifs, ainsi que de nouveaux mots Ă ajouter au dictionnaire. Auparavant, je faisais des copierâcoller dans Writer, ce qui Ă©tait bien moins commode et bien plus long. Ces tests sont faits en Python et en JavaScript. Les deux moteurs les passent tous et fonctionnent de la mĂȘme maniĂšre. Cela dit, il nâest pas malgrĂ© cela pas possible de garantir (pour lâinstant) que le moteur en JavaScript fonctionne aussi bien quâen Python. ## JavaScript, mon ~~amour~~ Hiroshima  Passer de Python Ă JavaScript nâa pas Ă©tĂ© de tout repos. Et si le projet a pris du retard, ce nâest pas tellement, comme je le craignais, Ă cause de la difficultĂ© de concevoir une extension pour Firefox et Thunderbird. Ce point fut plus facile que je ne le pensais, tout simplement parce que la documentation de Firefox et celle Thunderbird, quoique cette derniĂšre soit en dĂ©shĂ©rence, sont mieux tenues et plus complĂštes que celle pour LibreOffice... et surtout lâAPI est plus simple Ă utiliser... Quoique... lâAPI de bas niveau est tout aussi compliquĂ©e, de mon point de vue... Mais comme on peut sâen passer... Bref. La syntaxe de JavaScript ne mâa pas posĂ© de problĂšme. Jâai utilisĂ© toutes les nouvelles possibilitĂ©s offertes par la norme ES6 : `for ... of`, les gĂ©nĂ©rateurs, les paramĂštres par dĂ©faut, les paramĂštres du reste, la dĂ©composition, les fonctions flĂ©chĂ©es, `Map`, `Set`, les classes, `let` et `const`, et mĂȘme depuis peu les nouvelles commandes `async` et `await`. Avec tout ça, JavaScript est un langage pas aussi horrible que je lâavais craint, mĂȘme assez agrĂ©able parfois... En mĂȘme temps, comme je dĂ©marrais un projet Ă zĂ©ro, je nâai pas eu Ă me coltiner toutes les bizarreries possibles de ce langage. Jâai Ă©vitĂ© toute forme de syntaxe tordâneurones. Ce qui mâa compliquĂ© la vie, câest plutĂŽt lâĂ©cosystĂšme de JavaScript, sa difficultĂ© Ă dĂ©boguer, son comportement Ă©trange, les incohĂ©rences et sa bibliothĂšque standard pauvre. ###DifficultĂ© Ă dĂ©boguer Ni Firefox, ni Thunderbird (ni LibreOffice dâailleurs) ne signalent quoi que ce soit sâil y a une erreur de syntaxe dans le code. Ăa ne fonctionne tout simplement pas, et câest tout. Câest assez pĂ©nible en Python, mais câest bien pire en JavaScript oĂč il est frĂ©quent dâoublier une virgule ou un point-virgule quelque part. En outre, les messages dâerreur de JavaScript sont longs et souvent abscons, sans compter que selon le contexte dâexĂ©cution dans Firefox/Thunderbird, les messages dâerreur sont parfois encore plus imprĂ©cis, voire inexistants (le module XYZ plante, mais dĂ©brouillez-vous pour le reste, car aucune info ne sera fournie, comme oĂč et pourquoi). Je ne vais pas rentrer dans les dĂ©tails, parce que jâai maintenant oubliĂ© la plupart dâentre eux... mais Ă mon avis, Mozilla ferait des heureux en amĂ©liorant les rapports dâerreur. Inutile de sâĂ©tendre sur le comportement erratique de JavaScript et son typage faible, cela a dĂ©jĂ Ă©tĂ© fait par tellement de monde... Quand on vient de Python, il est facile de tomber dans tous les piĂšges que ce langage tend, dans lesquels mĂȘme les plus experts chutent encore de temps en temps, jâimagine. La traque aux "undefined" semblant sortir de nulle part mâa particuliĂšrement marquĂ©. ###La bibliothĂšque standard La bibliothĂšque standard est, en restant poli, trĂšs mauvaise, notamment parce quâelle est trĂšs incomplĂšte, mais aussi assez peu cohĂ©rente, me sembleâtâil. Dans beaucoup de cas, ce nâest pas bien grave, il suffit dâajouter les fonctions dont on a besoin et câest ce que jâai fait, mais on se demande quand mĂȘme pourquoi cette bibliothĂšque standard est si pauvre ou si mal foutue. Avec toute la _hype_ autour de ce langage, câest vraiment trĂšs Ă©tonnant. Prenons le cas des expressions rationnelles, parce que la nullitĂ© de lâobjet `Regexp` est navrante... et parce que câest ce qui est le plus utile Ă Grammalecte : #### problĂšme 1 : pas de lookbehind assertions Les *lookbehind assertions* permettent de regarder ce qui prĂ©cĂšde un motif. OK, câest pĂ©nible, mais on peut compenser avec quelques efforts. #### problĂšme 2 : les classes de mĂ©tacaractĂšres ne comprennent que lâASCII. Les classes de mĂ©tacaractĂšres comme `\w` et `\b`, ne comprennent que lâASCII. Oui, lâASCII ! Ce qui donne (vous pouvez essayer dans lâardoise de Firefox) : ```javascript /^\w+$/.test("Ă©tonnant") ==> false /\bvite\b/.test("Ă©vite") ==> true ``` Inutile de vous prĂ©cipiter sur votre calendrier, nous sommes bien en 2017, et non en 1997. JavaScript est, paraĂźtâil, un langage moderne, mais seulement quand on nây regarde pas de trop prĂšs. Heureusement, il est facile de compenser lâabsence dâun `\w` fonctionnel par `[a-zA-ZĂ -öĂ-Ă0-9_Ăž-ĂżĂ-ĂÄ-ÊŻ]` (du moins, ce sont les plages de caractĂšres que jâai retenues, on pourrait en ajouter bien dâautres). Ce qui rend les expressions rationnelles un peu plus piquantes Ă lire... Quant Ă `\b`, eh bien, on peut essayer de compenser avec des *lookahead assertions* et des *lookbehind assertions*. Seulement, voilĂ , ces derniĂšres nâexistent pas en JavaScript. Mais en magouillant, on peut simuler ça. Du moins dans presque tous les cas utiles. Tant pis pour les autres... on priera de ne pas tomber sur un caractĂšre non ASCII. ####ProblĂšme 3 : pas de position des groupes capturĂ©s Les groupes capturĂ©s nâindiquent pas leur position. Ăa, câĂ©tait vraiment la mauvaise surprise. Avant de proposer la campagne de financement, jâavais vĂ©rifiĂ© ce que JavaScript pouvait faire avec les expressions rationnelles, mais je nâavais pas vu que ce point manquait Ă lâappel, tout simplement parce que je nâavais pas imaginĂ© que JavaScript serait incapable de fournir cette indication. De quoi sâagitâil au juste ? Câest trĂšs simple. Quand vous Ă©crivez une expression rationnelle avec des groupes de capture, comme `(\w+) (\w+) (\w+)`, Python vous renvoie les groupes capturĂ©s (ce qui est entre parenthĂšses) avec leur position dans le motif global. JavaScript ne renvoie que le contenu des groupes capturĂ©s, mais pas leur position. DĂ©brouillezâvous pour savoir oĂč ça se trouve, et câest bien plus Ă©pineux que vous pourriez le supposer, si, par exemple, vous capturez des mots comme « a », « le » ou « la », ou si vous capturez des groupes qui ne sont pas des mots entiers. Ce point seul mâa fait perdre beaucoup de temps, sans compter que ce fut un cauchemar Ă dĂ©boguer. Jâai mĂȘme cru pendant quelques jours que tout le projet allait tomber Ă lâeau Ă cause de ça. Car, Ă ce moment du dĂ©veloppement, alors mĂȘme que je bataillais pour rendre le moteur fonctionnel, jâai pris conscience que lâexĂ©cution du code en JavaScript Ă©tait environ douze fois plus lente quâen Python, au point que lorsquâon lançait la correction grammaticale, Firefox se figeait pendant de longues secondes... CâĂ©tait Ă©videmment inacceptable. Il Ă©tait donc hors de question de ralentir encore lâexĂ©cution du code en essayant de calculer la bonne position des erreurs dans les motifs dĂ©tectĂ©s (pour rappel, il y a des milliers dâexpressions rationnelles dans Grammalecte). Du coup, jâai oubliĂ© cette idĂ©e et procĂ©dĂ© autrement : la position des groupes capturĂ©s est signalĂ©e dans le fichier des rĂšgles de grammaire. Cela rend le processus dâĂ©criture des rĂšgles un peu plus brouillon, mais câest assez simple pour ĂȘtre acceptable. Et ça ne ralentit pas le moteur outre mesure. Ensuite, pour Ă©viter que Firefox ne se fige, le cĆur du correcteur grammatical, câestâĂ âdire la vĂ©rification du texte, sâexĂ©cute dans un processus sĂ©parĂ©... Et, bonne surprise, il sâavĂšre que dans ce processus â inexplicablement, sans rien changer au code â le correcteur fonctionne vingt fois plus rapidement que dans le processus principal de Firefox, mĂȘme quand ce dernier ne fait rien du tout !... ####Un Ă©cosystĂšme incohĂ©rent Selon les contextes et lâapplication, les choses fonctionnent diffĂ©remment et ça donne la dĂ©sagrĂ©able impression de bĂątir sur du sable. On ne sait pas toujours bien ce qui prĂ©existe aux scripts quâon conçoit. Notamment, il nây a toujours pas de moyen conventionnel simple pour importer un module (ES6 en parle, mais aucun navigateur nâa encore implĂ©mentĂ© ça). Parfois, `require` existe par dĂ©faut. On peut faire : ```javascript const { Cu } = require("chrome"); const tabs = require("sdk/tabs"); ``` Dans dâautres cas, `require` nâexiste pas par dĂ©faut, donc : ```javascript importScripts("resource://gre/modules/workers/require.js"); const gce = require("resource://grammalecte/fr/gc_engine.js"); ``` Ou bien encore dans un autre contexte, il faut faire : ```javascript const Cu = Components.utils; const { require } = Cu.import("resource://gre/modules/commonjs/toolkit/require.js", {}); ``` Parfois, on importe `Components.utils (Cu)` grĂące Ă `require`. Parfois, on importe `require` Ă partir de `Components.utils (Cu)` ou bien dâautre chose. On peut aussi importer des modules via XUL ou le HTML, avec des espaces de noms partagĂ©s. Il y a aussi les dĂ©clarations de ressources dans un manifeste. Bref, tout ça est contreâintuitif au possible. Cela dit, alors que jâĂ©crivais ce texte, je dĂ©couvre que `import` et `export` [arrivent enfin dans les navigateurs](https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Instructions/import) ! On va peutâĂȘtre en finir avec tout ça bientĂŽt. Mais, ça rĂ©soudra pas tout. Comme je lâai dit, selon les applications et les contextes, certains objets ou fonctions existent ou nâexistent pas. Dans Firefox, on peut appeler directement `XMLHttpRequest()`, mais pas dans Thunderbird. Pour ce dernier, il « suffit » donc de faire : ```javascript let { Cc, Ci } = require("chrome"); let xRequest = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(); xRequest.QueryInterface(Ci.nsIXMLHttpRequest); ``` MĂȘme pour faire un *print*, il nây a pas de solution uniforme. LĂ encore, selon le contexte, il y a : `console.log()`, `Service.console.logStringMessage()` ou `dump()` ou que saisâje encore. Il y a des contextes oĂč rien de tout ça ne fonctionne. Une derniĂšre Ă©trangetĂ© : pour compenser la pauvretĂ© des objets standard, jâai ajoutĂ© des fonctions personnelles Ă `String`, `Regexp` et `Map`. Mais ce qui est curieux, câest que dans Firefox, il faut que ces nouvelles fonctions soient dĂ©clarĂ©es dans le module oĂč les objets sont instanciĂ©s... tandis que dans Thunderbird, il faut que ces nouvelles fonctions soient dĂ©clarĂ©es dans le module oĂč ces fonctions sont utilisĂ©es. Câest pourtant le mĂȘme moteur JavaScript. JâarrĂȘte ici de lister les incohĂ©rences, on nâen finirait pas. Chaque problĂšme nâest pas dramatique en soi, mais lâaccumulation de ces contretemps finit par rendre la programmation en JavaScript vraiment casseâpieds par moments. Et, lĂ , on ne parle que de Mozilla. Câest encore diffĂ©rent ailleurs, puisque lâimplĂ©mentation des nouvelles fonctionnalitĂ©s du langage nâavance pas au mĂȘme rythme selon les moteurs. En rĂ©sumĂ©, JavaScript, câest le bordel et on se demande pourquoi câest si incohĂ©rent. Ă mon avis, ce qui manque particuliĂšrement Ă ce langage, câest une implĂ©mentation standard avec un comportement logique et uniforme, des rapports dâerreurs plus clairs et une bibliothĂšque par dĂ©faut mieux faite et plus complĂšte. On perd un temps considĂ©rable avec ces histoires. Je ne voulais pas particuliĂšrement Ă©crire un long chapitre sur ce langage, mais ça fait dĂ©jĂ pas mal... ## De Writer Ă Firefox (ou de la littĂ©rature au Web) : le choc culturel ## Lâun des points auxquels je nâavais pas beaucoup rĂ©flĂ©chi et qui mâa le plus surpris, bien que jâavais conscience que les textes du Web nâĂ©galaient pas en qualitĂ© et normativitĂ© ceux sur lesquels jâavais travaillĂ© sur LibreOffice, câest combien lâĂ©crit sur le Web est chaotique et exubĂ©rant, et foisonne de nĂ©ologismes, dâanglicismes, de noms propres (compagnies, marques, produits, _people_), de sigles, de codes divers, de vocabulaire technique, de _smileys_, dâerreurs de syntaxe ou de formatage, sans compter les habituelles erreurs typographiques, orthographiques et grammaticales... Si bien que mĂȘme lorsque Grammalecte commençait Ă fonctionner comme il le devait sur Firefox, il mâest vite apparu que câĂ©tait difficilement utilisable en lâĂ©tat, et quâil fallait revoir son fonctionnement pour Ă©viter trop de signalements intempestifs, pour Ă©viter que tous les textes soient barbouillĂ©s de toutes les couleurs. Pourtant, je nâavais pas fait faire les premiĂšres armes du correcteur sur les logorrhĂ©es de Facebook, mais sur des textes dâacteurs « sĂ©rieux », comme les journaux et les blogs grand public ou plus confidentiels, mais _a priori_ bien tenus. Quelle dĂ©convenue !... Entre le charabia, les _hashtags_ et autres bidules, le formatage indigent et la novlangue du Web, Grammalecte tirait tout le temps la gueule, et il a fallu revoir beaucoup de choses pour que le correcteur se comporte moins comme un casseâpieds permanent. Jâai passĂ© un temps considĂ©rable Ă cette adaptation culturelle. Jâai fait passer au correcteur des centaines de textes tirĂ©s de blogs et de journaux. Jâai corrigĂ© des tas de faux positifs et jâai ajoutĂ© des centaines de mots dans le dictionnaire. Et beaucoup dâentre vous trouvent sans doute le correcteur encore trop rigide. Ă vous de me le dire, jâai eu trĂšs peu de retour sur ce point... Quoi quâil en soit, pour sâacclimater Ă Internet, il a fallu assouplir grandement la politique dâintĂ©gration des nĂ©ologismes, des anglicismes, des marques, amĂ©liorer lâanalyseur lexical pour ignorer des tas de trucs. Par exemple, si lâon peut se passer du verbe « tweeter » quand on ne sâoccupe que de LibreOffice, sur le Web, non, ce ne peut ĂȘtre compris des utilisateurs. Trop frĂ©quent. Idem pour pas mal de marques et dâautres nĂ©ologismes trĂšs courants. Cela dit, je suis toujours rĂ©ticent Ă ajouter trop de nouveautĂ©s et de bizarreries, les noms de produits sont toujours interdits (tant pis pour les Freebox, les _iBidule_, et autres gadgets dans lâair du temps...), et je me suis arrĂȘtĂ© au moment oĂč jâai estimĂ© que jâavais suffisamment assoupli les choses... Faitesâmoi part de votre avis, en bien ou en mal. Il reste sans doute encore des rugositĂ©s Ă polir. ## Lexique du correcteur La graphie dâun mot français ne permet pas de dĂ©terminer sa nature. Un mot finissant par « -ent » peut ĂȘtre un nom, un adjectif, un adverbe ou la forme conjuguĂ©e dâun verbe. Câest pourquoi un correcteur grammatical ne peut souvent pas grandâchose sans un lexique Ă©tiquetĂ© rĂ©fĂ©rençant tous les mots dâune langue. Cet Ă©tiquetage, câest la base de la connaissance du correcteur. Ce lexique est gĂ©nĂ©rĂ© Ă partir du dictionnaire orthographique pour Hunspell. Quelques donnĂ©es sur le dictionnaire : * plus de 82 300 entrĂ©es (+ 5 300 depuis le prĂ©cĂ©dent journal) ; * toutes les entrĂ©es sont grammaticalement Ă©tiquetĂ©es ; * environ 20 % dâentre elles sont sĂ©mantiquement Ă©tiquetĂ©es (mĂ©decine, informatique, botanique, etc.), mais cet Ă©tiquetage ne sert pas encore. AmĂ©liorer la base lexicale et son Ă©tiquetage, câest lâune des tĂąches les plus importantes de la conception dâun correcteur grammatical. Tout le travail sur le dictionnaire se fait sur [_Dicollecte_](http://www.dicollecte.org/home.php?prj=fr), oĂč sont collectĂ©es les propositions des utilisateurs. ## Câest toujours perfectible Beaucoup de choses ont Ă©tĂ© faites, parfois plus que ce qui Ă©tait demandĂ©, parfois le strict minimum. Ăvidemment, beaucoup de choses sont encore amĂ©liorables, câest le propre des projets informatiques. Un correcteur grammatical, ce nâest jamais fini. Si jâai oubliĂ© de mentionner quelque chose dâimportant, nâhĂ©sitez pas Ă mâen faire part. Malheureusement pour certains, je nâai pas réécrit le correcteur en OCaml, Haskell, Lisp, Cobol... [insĂ©rez ici votre langage Ă la mode favori]. Firefox et Thunderbird sâobstinent Ă ne comprendre que le JavaScript, LibreOffice le Python, le Basic et le Java. Câest barbare ou vintage si on est indulgent, mais câest ainsi. :-) Pour lâinstant, attendu que Mozilla nâa toujours pas implĂ©mentĂ© lâinterface de programmation qui permettra de souligner les erreurs directement dans les zones de texte, la correction se fait dans un panneau annexe. Mais, dĂšs que cette interface sera disponible, câest bien sĂ»r ainsi que les corrections se feront. Au cas oĂč ceci intĂ©resserait quelquâun parmi vous, sachez quâil existe une prime pour la rĂ©alisation de cette tĂąche sur [_Bountysource_](https://www.bountysource.com/issues/9358930-develop-an-interface-for-grammar-checkers). Il existe Ă©galement [une prime](https://www.bountysource.com/issues/44906435-bounty-improve-readability-of-grammar-and-spelling-errors) pour apporter la colorisation des erreurs dans LibreOffice. IdĂ©alement, jâaimerais quâon passe des vaguelettes bleues Ă peine visibles Ă des traits pleins, Ă©pais et colorĂ©s. Par exemple :  Lâun des problĂšmes qui mâennuie assez en ce moment, câest que la validation des extensions proposĂ©es sur le site de Mozilla est devenue vraiment longue depuis le dĂ©but de lâannĂ©e. Les contrĂŽleurs sont probablement submergĂ©s de nouvelles extensions Ă cause du passage obligatoire Ă WebExtension. Du coup, la version 0.5.16 nâest pas encore validĂ©e. La version 0.5.17 nâa pas encore Ă©tĂ© proposĂ©e, attendu que toute nouvelle version nous ramĂšne en fin de liste dâattente. # Lâavenir ## AmĂ©liorer la correction grammaticale AprĂšs le passage dĂ©licat que constituait la dĂ©simbrication de Grammalecte de LibreOffice, je vais dorĂ©navant me concentrer sur lâamĂ©lioration du correcteur luiâmĂȘme. Avec toutes les nouvelles fonctionnalitĂ©s apportĂ©es derniĂšrement, il est possible de faire bien mieux que ce quâon a maintenant. Pour lâinstant, le dĂ©sambiguĂŻsateur, quoique dĂ©jĂ fort utile, est particuliĂšrement sousâutilisĂ©, pas parce quâil est difficile dâemploi, mais parce que cette affaire est vraiment plus dĂ©licate que je ne lâavais supposĂ© de prime abord, et aussi parce que le processeur de texte fait en vĂ©ritĂ© dĂ©jĂ beaucoup de travail sur ce point (_cf._ le [journal prĂ©cĂ©dent](http://linuxfr.org/news/grammalecte-correcteur-grammatical#le-pr%C3%A9processeur-de-texte-par-lexemple))... Encore une fois, le diable est dans les dĂ©tails, les dĂ©tails, les dĂ©tails... En revanche, il mâapparaĂźt de plus en plus Ă©vident quâil serait utile dâadjoindre au dĂ©sambiguĂŻsateur un systĂšme dâannotation du texte, parce que tout ne dĂ©pend pas de la dĂ©sambiguĂŻsation grammaticale, et quâil est souvent apprĂ©ciable de connaĂźtre le contexte. Le fait que les rĂšgles puissent lancer plusieurs actions va permettre de faire des examens plus complets sur des dĂ©tails pour lâinstant ignorĂ©s, notamment sur le contrĂŽle des locutions adverbiales ou les syntagmes nominaux les plus frĂ©quents. Rien de difficile Ă premiĂšre vue. Juste un travail de tĂącheron qui demande du temps. Lâautre point central Ă mettre en Ćuvre, câest la fusion et le rĂ©ajustement des rĂšgles existantes. Le fait que les rĂšgles peuvent dorĂ©navant appliquer autant dâactions que voulu change grandement la donne. Par exemple, je vous avais expliquĂ© dans le prĂ©cĂ©dent journal que la vĂ©rification des verbes se faisait aprĂšs avoir vĂ©rifiĂ© tout le reste. Ă prĂ©sent, mĂȘme sâil est encore utile de fonctionner ainsi dans bon nombre de cas, il serait apprĂ©ciable de fusionner certaines de ces vĂ©rifications avec le dĂ©sambiguĂŻsateur qui, lui, est surtout utilisĂ© dans les premiĂšres phases de traitement. Ce travail de fusion et de rĂ©ajustement des rĂšgles ne prĂ©sente pas de difficultĂ©s particuliĂšres, câest surtout une question de stratĂ©gie globale qui ne nĂ©cessite cependant quâun travail minutieux et attentif, plutĂŽt ennuyeux et probablement un peu rĂ©pĂ©titif. Une fois de plus, avec plusieurs centaines de rĂšgles concernĂ©es, ça ne peut pas se faire en un tour de main. Autre objectif : bĂ©tonner les tests, bĂ©tonner les tests, bĂ©tonner les tests. Parce que câest possible et que câest indispensable pour Ă©viter les bogues inattendus que la correction grammaticale peut susciter. Mais il faudra aussi consolider radicalement les tests par lâajout systĂ©matique des erreurs les plus frĂ©quentes. AmĂ©liorer les suggestions... Un casseâtĂȘte qui sâest beaucoup amĂ©liorĂ© ces derniers temps, mais il faudrait quand mĂȘme rĂ©ussir Ă filtrer les absurditĂ©s que le correcteur sort parfois. Son dĂ©faut est dâĂȘtre un peu trop ingĂ©nieux par moments... mais bon, ça peut faire rire. :-) Parmi les suggestions, il y a particuliĂšrement les suggestions orthographiques. Pour le moment, dans Firefox et Thunderbird, Grammalecte utilise Hunspell pour avoir des suggestions orthographiques, mĂȘme sâil nâa plus besoin de lui pour savoir si un mot est prĂ©sent dans le dictionnaire et rĂ©cupĂ©rer les donnĂ©es grammaticales. Il serait utile dâadjoindre un module de suggestion orthographique en parcourant le graphe de mots Ă la recherche de possibles mots correspondant suffisamment Ă la graphie inconnue. Un domaine de recherche Ă part entiĂšre. Ă mon avis, il serait utile dâimplĂ©menter une suggestion basĂ©e sur des substitutions phonĂ©tiques. ##Plus loin, plus fort ? Ce nâest quâune idĂ©e, pour lâinstant mal formĂ©e et un peu extravagante, mais je rĂ©flĂ©chis Ă la possibilitĂ© de bĂątir un graphe de la grammaire française comme il a Ă©tĂ© possible de bĂątir un graphe de lâensemble des mots du français. La diffĂ©rence, câest que la totalitĂ© des mots français recensĂ©s peuvent sâĂ©crire selon un graphe acyclique, avec un dĂ©but et une fin connus, tandis que si on schĂ©matise la grammaire française les boucles et les rĂ©currences sont possibles, les embranchements innombrables, les fantaisies ne sont pas rares, la longueur de la chaĂźne de _tokens_ est thĂ©oriquement sans limite... Et on ne parle lĂ que de phrases faites avec une grammaire correcte. Comment gĂ©rer les erreurs rencontrĂ©es ? Fautâil les intĂ©grer dans ce mĂȘme graphe en crĂ©ant des branches dâerreur ? Câest une pensĂ©e embryonnaire qui nâaboutira peutâĂȘtre Ă rien dâutile, mais si lâon trouve un moyen de bĂątir ce graphe, il devrait ĂȘtre possible de gĂ©rer des cas trĂšs complexes. Ăa nous permettrait de sortir du schĂ©ma [motif potentiel dâerreur â condition dâerreur â suggestions â message dâerreur] quâon peut heureusement combiner avec diverses magouilles plus ou moins subtiles Ă©laborĂ©es avec le processeur de texte et le dĂ©sambiguĂŻsateur. Ce qui est sĂ»r, câest que le tokeniseur va prendre une place une place plus importante dans la nouvelle stratĂ©gie pour gĂ©rer la complexitĂ©. ## CrĂ©er une extension pour Chrome Pas grandâchose de spĂ©cial Ă dire sur ce sujet. Il est Ă espĂ©rer que produire lâextension pour Chrome prenne un temps raisonnablement court, attendu que Mozilla a essayĂ© de faire en sorte que la nouvelle API soit proche de celle de Chrome. Mais dans lâunivers de JavaScript, y aâtâil quelque chose de stable et bien pensĂ© ? Ce serait une bonne surprise. Jâironise et je mĂ©dis, mais câest un peu mĂ©ritĂ©, nâestâce pas ? Quoi quâil en soit, mĂȘme si ça se fait plus rapidement quâattendu â il nâest pas interdit de rĂȘver â, le temps prĂ©vu Ă cette tĂąche sera utilisĂ© pour renforcer le correcteur, ce ne sera donc pas perdu. En plus, moins je fais de JavaScript, plus je suis heureux... Câest donc avec bonheur que je me livrerai Ă une tĂąche plus essentielle que deviner ce que peut vouloir me dire le dĂ©bogueur de Chrome. ## Outils annexes LâamĂ©lioration du lexicographe (qui donne des informations sur les mots) et lâassistant lexical (permettant lâajout simplifiĂ© de mots au lexique) ont pour but de revisiter la maniĂšre dâamĂ©liorer la base lexicale, dont _Dicollecte_, le site Web existant pour cette tĂąche, commence Ă se faire vieux. JâespĂšre inciter les utilisateurs Ă participer Ă la conception de la base en rendant lâinterface plus simple et plus sĂ©duisante, et surtout directement accessible dans son logiciel. Ăa a lâair insignifiant, mais câest une question essentielle. Le dĂ©tecteur de rĂ©pĂ©titions est proposĂ© parce que câest un outil qui intĂ©resse potentiellement beaucoup les Ă©crivains soucieux de varier leur vocabulaire. # Le mot de la fin Bon sang ! Difficile de rendre une campagne de financement attrayante quand on parle de grammaire. Au final, on veut juste de petits liserĂ©s sous les mots erronĂ©s et un menu contextuel qui explique pourquoi câest faux et qui suggĂšre quelque chose de crĂ©dible. Rien de palpitant Ă la rĂ©flexion. On peut espĂ©rer susciter lâintĂ©rĂȘt des technophiles en parlant de lâarriĂšreâcuisine et du systĂšme de tuyauterie, mais jâavais dĂ©jĂ presque tout dit la premiĂšre fois, je ne peux que rendre compte de ce qui a Ă©tĂ© fait et amĂ©liorĂ©. Si la premiĂšre campagne vous a satisfait, si vous jugez que la correction grammaticale est trop importante pour ĂȘtre nĂ©gligĂ©e et quâil faut en finir avec la maltraitance de la langue française, si vous voulez peser sur les prioritĂ©s du correcteur grammatical ou ajouter des mots spĂ©cifiques ordinairement interdits dans le dictionnaire, je vous invite Ă consulter la [page de financement participatif](https://fr.ulule.com/grammalecte-2/) sur _Ulule_.