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. ![Logo de Grammalecte](https://www.dicollecte.org/grammalecte/img/Grammalecte_main_logo.png) **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. ![Graphe de mots](https://www.dicollecte.org/grammalecte/_old/img/wordgraph.png) 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. ![Graphe de mots](https://www.dicollecte.org/grammalecte/_old/img/office_no_please_no.gif) 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 » : ![À propos](https://www.dicollecte.org/grammalecte/_old/img/fxtb_apropos.png) Correcteur grammatical : ![Formateur de texte](https://www.dicollecte.org/grammalecte/_old/img/fxtb_correcteur.png) Conjugueur : ![Formateur de texte](https://www.dicollecte.org/grammalecte/_old/img/fxtb_conjugueur.png) Formateur de texte : ![Formateur de texte](https://www.dicollecte.org/grammalecte/_old/img/fxtb_formateur.png) Options grammaticales et orthographiques : ![Options Firefox](https://www.dicollecte.org/grammalecte/_old/img/fxtb_options1.png) ![Options Thunderbird](https://www.dicollecte.org/grammalecte/_old/img/fxtb_options2.png) Interface en ligne de commande : ![CLI : interface en ligne de commande](https://www.dicollecte.org/grammalecte/_old/img/cli.png) ## 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) : ![RĂšgles de Grammalecte dans SublimeText](https://www.dicollecte.org/grammalecte/_old/img/rules_sublime_text.png) ## 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 ![JavaScript](https://www.dicollecte.org/grammalecte/_old/img/js_the_good_parts.jpg) 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 : ![Exemple des soulignements possibles](https://www.dicollecte.org/grammalecte/_old/img/error_readability_tests.png) 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_.

AltStyle ă«ă‚ˆăŁăŠć€‰æ›ă•ă‚ŒăŸăƒšăƒŒă‚ž (->ă‚ȘăƒȘă‚žăƒŠăƒ«) /