[C#] Correcteur orthographique

Correcteur orthographique [C#] - C#/.NET managed - Programmation

Marsh Posté le 24-05-2006 à 22:33:26    

Salut :)
 
En mal de trouver un projet "intéressant", j'ai fini par avoir l'idée d'écrire un petit correcteur orthographique.
Bon, je vois d'ici les puristes râler : "ouais mais il est nul ton machin, il est lent et il fait pas grand chose".
 
Ouais ok... mais bon, c'est pour ça aussi que je poste les sources : si vous avez envie de l'améliorer, vous être libres (ou si vous avez des suggestions formulables en langage humain) ;)
 
Sans plus tarder, entrons dans le vif du sujet.
 
Les sources sont partagées en deux projets.
 
Le premier, cOrthographe, est un projet de librairie de classes (DLL). Il contient tout ce qu'il faut pour l'implémenter dans un programme.
Tout... Pas tout à fait, j'y reviendrai plus tard...
Il contient deux classes :
cLettre, qui représente une lettre (qui l'eu cru !) ainsi qu'un array contenant la CLettre suivante, de façon à, au final, former le mot.
Il s'agit d'un arbre.
Pourquoi un arbre vous me direz ? Simplement pour une raison d'optimisation, et que c'est facile à mettre en place.
Je recherche mon mot lettre pas lettre, et je fini par le trouver (ou non) en ne parcourant à chaque lettre qu'un tableau très réduit, plutôt que de me taper tout le dictionnaire.
J'aurais pu aussi faire une recherche dicotomique, mais ça m'aurait imposé de trier les mots au chargement, ce que je ne fais pas ici (pas besoin).
cDictionnaire, qui hérite de cLettre. En fait, c'est une lettre virtuelle, qui va me permettre de stocker toutes les premières cLettre possibles pour stocker tout mon dictionnaire.
Il comporte aussi un constructeur plus évolué, qui permet de remplir directement le dictionnaire à partir d'un Array de strings. Genre, comme dans la distribution, on a un dictionnaire sous forme de fichier texte.
 
Le second projet, Orthographe, est un projet Windows. Il comporte une zone de saisie, et une ListBox qui va stocker toutes les fautes d'orthographe trouvées au cours de la saisie.
J'ai ajouté aussi plusieurs méthodes qui feraient bien d'être transplantées dans cOrthographe...
- Le chargement du fichier dictionnaire
- L'ajout d'un mot au fichier dictionnaire (click-droit sur la liste des erreurs quand une est sélectionnée)
- Le découpage du texte saisi en faisant abstraction des caractère "à la con" qui viennent polluer le texte
L'implémentation est un peu pourrie, je le reconnais. J'ai testé en copiant/collant le EULA.TXT de Windows (que vous trouvez dans c:\windows\system32) et... Ca a ramouillé quelques secondes quand même... Je vous parle pas ensuite pour taper le texte ;) Ceci dit, le problème vient de mon implémentation, plus que du moteur de orthographique.
 
Les sources des projets :
cOrthographe (12 Ko)
Orthographe (881 Ko)
 
La version compilée du tout :
Release (859 Ko)
 
Vous noterez que c'est un peu gros... Normal, je distribue le dictionnaire avec... Et il fait 3.55 Mo...
 
Ce que ça fait :
- Analyse un mot (à vous de découper votre texte) et vérifie qu'il existe existent. Il renverra true ou false le cas échéant.
 
Ce que ça ne fait pas :
- Le découpage de votre texte
- L'ouverture/modification directe du fichier dico
- Pas de dictionnaire personnel (donc dans mon EXE, je met à jour le fichier du dictionnaire principal)
- Ne fait pas attention à la casse. "habITaTion" n'est pas compté comme une erreur, pas plus qu'une majuscule au milieu d'une phrase, et il n'ignore pas un mot tout en majuscule, qui contient des nombres ou autre.
 
Ce que ça ne fera certainement jamais :
- La grammaire (ouais, nan...)
- Le reconnaissance de la langue (quoique... y'a bien des méthodes bourrines pour ça...)
- La suggestion de corrections
- Interpolation des orthographes possibles à partir du radical et des préfixe/suffixe permis
 
On peut pas tout faire non plus... ;)
 
Ceci dit, je pense que ça peut déjà être pas mal pour valider l'orthographe dans un petit CMS par exemple. Ca évite les méga-fautes...
 
Voilà, enjoy :)
 
Comme vous pouvez le constater, le code du moteur en lui-même est bien plus simple que celui de l'application de test (c'est toujours comme ça de toute façon... :spamafote:)
 

Code :
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace cOrthographe
  5. {
  6.     public class cLettre
  7.     {
  8.         public char lettre;
  9.         private cLettre[] lettres;
  10.         internal cLettre()
  11.         {
  12.             this.lettres = new cLettre[0];
  13.         }
  14.         public cLettre(char lettre)
  15.         {
  16.             this.lettre = lettre;
  17.             this.lettres = new cLettre[0];
  18.         }
  19.         public void AddMot(string mot)
  20.         {
  21.             int index = this.AddLettre(mot.ToCharArray(0, 1)[0]);
  22.             if (mot.Length > 1)
  23.             {
  24.                 this.lettres[index].AddMot(mot.Substring(1));
  25.             }
  26.         }
  27.         private int AddLettre(char lettre)
  28.         {
  29.             int index = this.GetLettreIndex(lettre);
  30.             if (index == -1)
  31.             {
  32.                 cLettre[] tmpLettres = new cLettre[this.lettres.Length + 1];
  33.                 this.lettres.CopyTo(tmpLettres, 0);
  34.                 index = this.lettres.Length;
  35.                 tmpLettres[index] = new cLettre(lettre);
  36.                 this.lettres = tmpLettres;
  37.             }
  38.             return index;
  39.         }
  40.         private int GetLettreIndex(char lettre)
  41.         {
  42.             for (int i = 0; i < this.lettres.Length; i++)
  43.             {
  44.                 if (this.lettres[i].lettre == lettre)
  45.                 {
  46.                     return i;
  47.                 }
  48.             }
  49.             return -1;
  50.         }
  51.         internal bool GetLettreIndexRecursive(string mot)
  52.         {
  53.             int index = this.GetLettreIndex(mot.ToCharArray(0, 1)[0]);
  54.             if (index != -1)
  55.             {
  56.                 if (mot.Length > 1)
  57.                 {
  58.                     return this.lettres[index].GetLettreIndexRecursive(mot.Substring(1));
  59.                 }
  60.                 else
  61.                 {
  62.                     return true;
  63.                 }
  64.             }
  65.             else
  66.             {
  67.                 return false;
  68.             }
  69.         }
  70.     }
  71.     public class cDictionaire : cLettre
  72.     {
  73.         cLettre[] lettres = new cLettre[0];
  74.         public cDictionaire(string[] mots)
  75.         {
  76.             foreach (string mot in mots)
  77.             {
  78.                 this.AddMot(mot + "." );
  79.             }
  80.         }
  81.         public bool CheckMot(string mot)
  82.         {
  83.             return GetLettreIndexRecursive(mot + "." );
  84.         }
  85.     }
  86. }


Message édité par Arjuna le 24-05-2006 à 22:38:44
Reply

Marsh Posté le 24-05-2006 à 22:33:26   

Reply

Marsh Posté le 24-05-2006 à 22:44:20    

comme d'hab, ça intéresse jamais personne ce que je fais :cry:

Reply

Marsh Posté le 24-05-2006 à 22:56:46    

je viens de tester, ça marche même en japonais :)
 
vive la gestion du char en utf-8 en C# :bounce:

Reply

Marsh Posté le 24-05-2006 à 22:58:57    

z'êtes relous les gars. vous pourriez au mois me dire un truc genre "il est nul ton machin, je faisais ça sur ma Ti92 au collège" ou chais pas moi... :sweat:

Reply

Marsh Posté le 24-05-2006 à 23:34:16    

Si tu veux demain je relis mon Programming Pearls (me semble que c'est celui là) et je te dis à quel point c'est nul, j'ai souvenir qu'il parlait d'un correcteur orthographique codé en quelques ko, dictionnaire compris.

Message cité 1 fois
Message édité par masklinn le 24-05-2006 à 23:36:55

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 24-05-2006 à 23:47:47    

dictionnaire compris, spa possible :spamafote:
à la limite, en le stockant comme dans l'arbre en mémoire, on peux réduire la taille... mettons au dixième, mais pas à ce point :o
 
par contre, pour ce qui est du code, je suis d'accord. ma dll fait 12 Ko, en comptant que le C# compile par tranche de 4 Ko pour la taille de l'exe. donc mon truc fait entre 8 et 12 Ko en réalité (suffit de voir le source de toute façon, pour voir à quel point il est petit)

Message cité 1 fois
Message édité par Arjuna le 24-05-2006 à 23:50:35
Reply

Marsh Posté le 24-05-2006 à 23:53:50    

par contre, y'a un truc qui m'échappe : quand il est démarré, avec un dico vide (4 pauvres mots), mon truc bouffe 71 Mo :ouch:

Reply

Marsh Posté le 24-05-2006 à 23:54:53    

(avec le dico plein, il mange pareil d'ailleurs :D)

Reply

Marsh Posté le 25-05-2006 à 00:07:32    

il est fou ce programme :D
 
plus j'écris de texte, et moins il bouffe de mémoire :D
 
http://www.manga-torii.com/files/orthographe.png

Reply

Marsh Posté le 25-05-2006 à 01:36:58    

Arjuna a écrit :

dictionnaire compris, spa possible :spamafote:
à la limite, en le stockant comme dans l'arbre en mémoire, on peux réduire la taille... mettons au dixième, mais pas à ce point :o
 
par contre, pour ce qui est du code, je suis d'accord. ma dll fait 12 Ko, en comptant que le C# compile par tranche de 4 Ko pour la taille de l'exe. donc mon truc fait entre 8 et 12 Ko en réalité (suffit de voir le source de toute façon, pour voir à quel point il est petit)


J'ai retrouvé la référence.
 
C'est 'Spell' de Doug McIllroy, le dictionnaire étendu (càd l'intégralité des mots reconnus) est de ~75000 mots et le programme avait été créé pour tourner sur PDP-11 et tient donc dans 64ko de ram.

Reply

Marsh Posté le 25-05-2006 à 01:36:58   

Reply

Marsh Posté le 25-05-2006 à 01:39:32    

masklinn a écrit :

Si tu veux demain je relis mon Programming Pearls (me semble que c'est celui là) et je te dis à quel point c'est nul, j'ai souvenir qu'il parlait d'un correcteur orthographique codé en quelques ko, dictionnaire compris.


bah, spas mal moi je trouve :spamafote:
pis c'est un projet perso, pour apprendre ! à la rigueur, on s'en tape de l'optimisation :o


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 25-05-2006 à 01:41:50    

Harkonnen a écrit :

bah, spas mal moi je trouve :spamafote:
pis c'est un projet perso, pour apprendre ! à la rigueur, on s'en tape de l'optimisation :o


Le "à quel point c'est nul" était ironique et mirrorait sa propre utilisation du terme espèce de couillon :o

Reply

Marsh Posté le 25-05-2006 à 01:45:44    

non paske bon, s'il faut optimiser, je te ponds un algo de huffman en assembleur que j'utilise pour lire le dico (lui meme codé en huffman ou autre algo pour économiser de la place), le tout couplé au moteur du correcteur toujours en assembleur, et avec une GUI 100% assembleur Win32 comme savait si bien les faire chrisbk ( :sweat: ), et ça tiendra même dans une casio fx-7000g :o

Message cité 1 fois
Message édité par Harkonnen le 25-05-2006 à 01:46:03

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 25-05-2006 à 01:49:32    

Harkonnen a écrit :

non paske bon, s'il faut optimiser, je te ponds un algo de huffman en assembleur que j'utilise pour lire le dico (lui meme codé en huffman ou autre algo pour économiser de la place), le tout couplé au moteur du correcteur toujours en assembleur, et avec une GUI 100% assembleur Win32 comme savait si bien les faire chrisbk ( :sweat: ), et ça tiendra même dans une casio fx-7000g :o


Ca sera pas suffisant pour battre spell, mais tu peux si tu veux [:dawa]

Reply

Marsh Posté le 25-05-2006 à 09:41:01    

masklinn a écrit :

le dictionnaire étendu (càd l'intégralité des mots reconnus) est de ~75000 mots


euh...
 
là y'a une couille dans le potage.
moi mon dico contient plus de 360 000 mots :o
déjà, si je réduit à 75000, évidement, chuis sûr que moi aussi je le fais tourner sur ma montre :o :p

Reply

Marsh Posté le 25-05-2006 à 09:44:55    

Faut pas oublier que le Français a moins de "mots" que l'anglais, mais très largement plus de déclinaisons possibles.
 
Exemples :
-> Les adjectifs en français s'écrivent au masculin, pluriel, féminin, féminin pluriel. En anglais, ils sont invariables
-> Les verbes se déclinent en 3 formes en anglais : infinitif, prétérit (_ed), présent 3 personne du singulier (_s) et présent progressif (_ing). En français, je te laisse admirer :


zozota
zozotai
zozotaient
zozotais
zozotait
zozotâmes
zozotant
zozotas
zozotasse
zozotassent
zozotasses
zozotassiez
zozotassions
zozotât
zozotâtes
zozote
zozoté
zozotement
zozotements
zozotent
zozoter
zozotera
zozoterai
zozoteraient
zozoterais
zozoterait
zozoteras
zozotèrent
zozoterez
zozoteriez
zozoterions
zozoterons
zozoteront
zozotes
zozotez
zozotiez
zozotions
zozotons

Message cité 2 fois
Message édité par Arjuna le 25-05-2006 à 09:47:49
Reply

Marsh Posté le 25-05-2006 à 09:54:26    

moi je dis quand mm chapeau à Arjuna. Si les autres ne sont jms content, c'est pour eux... Ici tu es tjs un des pionier dans certains domaine, continue ainsi :D

Reply

Marsh Posté le 25-05-2006 à 11:07:31    

Arjuna a écrit :

il est fou ce programme :D
 
plus j'écris de texte, et moins il bouffe de mémoire :D
 
http://www.manga-torii.com/files/orthographe.png


Bon, y'a facile 10-15 Mo pris par le framework, mais pour le reste faudrait profiler pour voir si y'a pas des leaks

Reply

Marsh Posté le 25-05-2006 à 11:26:27    

Arjuna a écrit :

Faut pas oublier que le Français a moins de "mots" que l'anglais, mais très largement plus de déclinaisons possibles.
 
Exemples :
-> Les adjectifs en français s'écrivent au masculin, pluriel, féminin, féminin pluriel. En anglais, ils sont invariables
-> Les verbes se déclinent en 3 formes en anglais : infinitif, prétérit (_ed), présent 3 personne du singulier (_s) et présent progressif (_ing). En français, je te laisse admirer :


zozota
zozotai
zozotaient
zozotais
zozotait
zozotâmes
zozotant
zozotas
zozotasse
zozotassent
zozotasses
zozotassiez
zozotassions
zozotât
zozotâtes
zozote
zozoté
zozotement
zozotements
zozotent
zozoter
zozotera
zozoterai
zozoteraient
zozoterais
zozoterait
zozoteras
zozotèrent
zozoterez
zozoteriez
zozoterions
zozoterons
zozoteront
zozotes
zozotez
zozotiez
zozotions
zozotons



 
J'ai pas lut tout ton code encore, mais pour ce genre tu cas tu peut pas "briser" un peu ton arbre et à partir du t de zozo sauter vers un bout d'arbre contenant toutes les terminaisons pour ce groupe, et tout les verbes de ce groupe réutilisant ce bout d'arbre... ?
 
(plus difficile de construire l'arbre, mais plus léger en mémoire, et aussi rapide en lecture)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 25-05-2006 à 12:33:48    

Arjuna a écrit :

Faut pas oublier que le Français a moins de "mots" que l'anglais, mais très largement plus de déclinaisons possibles.


Et alors?
 
Tu fais tenir 360000 mots en 4Mo, Spell en fait tenir 75000 dans 64ko
Tu fais tenir 5fois plus de mots en 64 fois plus d'espace [:dawa]
 
Enfin bon vu que tu as l'air de te foutre de ces informations c'est probablement pas la peine de continuer [:spamafote]

Arjuna a écrit :

Exemples :
-> Les adjectifs en français s'écrivent au masculin, pluriel, féminin, féminin pluriel. En anglais, ils sont invariables
-> Les verbes se déclinent en 3 formes en anglais : infinitif, prétérit (_ed), présent 3 personne du singulier (_s) et présent progressif (_ing). En français, je te laisse admirer :


Et alors?
 
Dans l'analyse lexicographique ayant précédé la finalisation de Spell McIllroy a effectué une analyse d'affixes ayant mené à l'intégration dans spell de 40 règles de préfixages et 30 règles de postfixages (plus une liste de ~1300 exceptions), comme je te l'ai dit un peu plus haut tu utilises une approche pûrement brute force, pas Spell [:spamafote]

Reply

Marsh Posté le 26-05-2006 à 12:13:20    

0x90 a écrit :

J'ai pas lut tout ton code encore, mais pour ce genre tu cas tu peut pas "briser" un peu ton arbre et à partir du t de zozo sauter vers un bout d'arbre contenant toutes les terminaisons pour ce groupe, et tout les verbes de ce groupe réutilisant ce bout d'arbre... ?
 
(plus difficile de construire l'arbre, mais plus léger en mémoire, et aussi rapide en lecture)


yes, sauf que pour ça, faut que je trouve un dico gramatical, et non pas de mots.
en effet, pour pouvoir dire comment se terminent les verbes, faut déjà que je sâche de quel groupe ils sont, et quelles sont les terminaisons possibles de ce groupe.
 
j'ai pas de bécherelle à la maison, et encore moins l'envie de le recopier ;)
 
sinon, je ne suis pas convaincu que ce soit plus rapide à lire comme arbre.
par contre, ça ouvre la possibilité de la recherche de la vérification du genre/nombre et de la concordance des temps (un algo "niveau CP" devrait être plutôt simple à écrire... mais pour analyser des phrases à la Zola, ça risque d'être insuffisant ;))

Reply

Marsh Posté le 26-05-2006 à 12:14:36    

masklinn a écrit :

Et alors?
 
Tu fais tenir 360000 mots en 4Mo, Spell en fait tenir 75000 dans 64ko
Tu fais tenir 5fois plus de mots en 64 fois plus d'espace [:dawa]


jamais de la vie mon graphe utilise 4 Mo... A tout casser, 400 Ko je pense, faudrait faire un échantillon

Reply

Marsh Posté le 26-05-2006 à 12:18:17    

masklinn a écrit :

Dans l'analyse lexicographique ayant précédé la finalisation de Spell McIllroy a effectué une analyse d'affixes ayant mené à l'intégration dans spell de 40 règles de préfixages et 30 règles de postfixages (plus une liste de ~1300 exceptions), comme je te l'ai dit un peu plus haut tu utilises une approche pûrement brute force, pas Spell [:spamafote]


j'ai jamais prétendu écrire un truc qui fait de l'analyse synaxique pour vérifier qu'il n'y a pas d'incohérence dans ce qu'on écrit ou de fautes de style :o
et encore moins que mon programme tenait en 5 Ko :o
 
j'ai juste fait ça principalement "parceque je m'emmerdais", et aussi parce que nombre de gens sont emmerdés quand ils font un site web de type CMS : y'a jamais de correcteur orthographique gratuit utilisable directement depuis leur site.
là, il est pas parfait, mais il a l'avantage d'ête exploitable directement, et open source.
 
t'as qu'à le réécrire si t'es pas content :p

Reply

Marsh Posté le 26-05-2006 à 12:34:53    

Arjuna a écrit :

j'ai jamais prétendu écrire un truc qui fait de l'analyse synaxique pour vérifier qu'il n'y a pas d'incohérence dans ce qu'on écrit ou de fautes de style :o
et encore moins que mon programme tenait en 5 Ko :o


Nan mais j'avais bien compris hein :o

Arjuna a écrit :

j'ai juste fait ça principalement "parceque je m'emmerdais", et aussi parce que nombre de gens sont emmerdés quand ils font un site web de type CMS : y'a jamais de correcteur orthographique gratuit utilisable directement depuis leur site.
là, il est pas parfait, mais il a l'avantage d'ête exploitable directement, et open source.


Ya pas de bindings C# pour Aspell [:petrus dei]

Reply

Marsh Posté le 26-05-2006 à 12:36:46    

masklinn a écrit :


Ya pas de bindings C# pour Aspell [:petrus dei]


si
http://aspell-net.sourceforge.net/


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 26-05-2006 à 16:27:37    

Arjuna a écrit :

yes, sauf que pour ça, faut que je trouve un dico gramatical, et non pas de mots.
en effet, pour pouvoir dire comment se terminent les verbes, faut déjà que je sâche de quel groupe ils sont, et quelles sont les terminaisons possibles de ce groupe.
 
j'ai pas de bécherelle à la maison, et encore moins l'envie de le recopier ;)
 
sinon, je ne suis pas convaincu que ce soit plus rapide à lire comme arbre.
par contre, ça ouvre la possibilité de la recherche de la vérification du genre/nombre et de la concordance des temps (un algo "niveau CP" devrait être plutôt simple à écrire... mais pour analyser des phrases à la Zola, ça risque d'être insuffisant ;))


 
Ca ne sera pas plus rapide à lire, ce sera exactement la même chose.
 
Et plutot que de lire un bécherelle, tu peut faire un gros algo bien bourrin pour repérer les similitudes et qui te sorte une version "compactée" de l'arbre. (Mais tu refait pas ce calcul à chaque fois, tu sauvegarde la version compact de l'arbre, sinon ca va être "un peu" lourd ...)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed