|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
![]() Étudiant Inscription : janvier 2013 Messages : 3 ![]() |
Bonjour je dois créer un correcteur orthographique en perl qui doit effectuer quatre tâches différentes: l'insertion de caractères, la substitution, la suppression et la transposition. Puis mettre les corrections dans un nouveau fichier.
Il doit aussi prendre en compte l'accentuation des mots, ce que je n'ai pas encore réussi à trouver pour le moment. De même pour l'insertion de caractère, il semble qu'un splice ne soit pas suffisant pour cette opération, car pour le mot mal orthographié "lou" il ne trouve pas le mot "loup" dans le dictionnaire. Voici donc mon code: Code :
|
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Laurent R.Conseil - Consultant en systèmes d'information Inscription : mai 2012 Messages : 568 ![]() |
Hum, ce n'est pas un problème simple.
Déjà, il faut tenir compte des différentes formes que prennent les mots (pluriel, féminin, conjugaisons, etc.). Il faut également tenir compte des accents, des nombres, des tirets et des apostrophes, etc. Cela peut être fait dans le lexique, mais ça alourdit considérablement ce lexique. Tu règles le problème des majuscules en mettant tout en minuscule, mais cela veut dire que tu ne verras pas une erreur comme les mots "angleterre" ou "allemagne" écrits sans la majuscule. Ensuite, trouver tous les mots qui ne figurent pas dans le lexique n'a rien de bien complexe (bien qu'il puisse y avoir des considérations de performance à prendre en ligne de compte), mais trouver les mots qui "ressemblent" pour proposer une correction possible est bien plus difficile. Il faut alors, d'une façon ou d'une autre, essayer de définir une forme de "distance" entre deux mots en fonction du nombre de lettres différentes et de leur ordre, afin de pouvoir proposer les mots du dictionnaire les moins distants des mots non trouvés dans le texte à analyser. En termes de performances, stocker les mots du dictionnaire dans une table de hachage est certainement une bien meilleure solution que dans un tableau, la recherche sera considérablement plus rapide. Il y a une discussion intéressante de ce problème dans le livre "Programming Pearls" (j'ai bien écrit "Pearls", ça n'a rien à voir avec le langage Perl), de Jon Bentley (chapitre 13). Ce bouquin peut être téléchargé gratuitement au format PDF (avec un filigrane assez gênant en bas de chaque page, mais, bon, pour suivre globalement la discussion, ça reste utilisable).
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés. |
|
|
00
|
|
|
#3 | ||
|
Invité de passage
![]() Étudiant Inscription : janvier 2013 Messages : 3 ![]() |
Tout d'abord merci pour vos conseils.
Effectivement la lecture du tableau est assez fastidieux. Je vais voir ce que je peux faire pour mettre le lexique dans une table. Et merci pour la recommandation du livre EDIT: après chargement du lexique dans une table de hashage l'affichage est vraiment plus rapide Les seuls problèmes qu'il me reste à résoudre sont : l'accentuation, l'ajout de lettre à la fin du mot (bizarrement cela fonctionne pour le début mais pour la fin. J'obtient par exemple pour "lou" = "clou" ou "flou" mais pas "loup" ni "loué" Et j'aimerais savoir comment faire pour quand l'utilisateur entre "0" le mot considéré comme erroné reste tel quel dans la correction ( sûrement une histoire de condition ...) Code :
|
||
|
|
00
|
|
|
#4 | |||||||
|
Membre Expert
![]() Laurent R.Conseil - Consultant en systèmes d'information Inscription : mai 2012 Messages : 568 ![]() |
Citation:
Code :
$ligne1 =~s/$mot_errone/$propositions[$choix]/ if $choix; L'autre solution est de commencer par mettre le mot supposé erroné dans le tableau @propositions (comme premier élément du tableau), en sorte que $propositions[0] soit ce mot. Dans ce cas, si l'utilisateur tape 0, le mot erroné est remplacé par lui-même. Pour l'accentuation, je passe mon tour pour l'instant car je ne vois pas très bien quel est le problème. En général, je ne travaille que sur de l'ASCII 7 bits et je ne connais donc pas très bien les problématiques Unicode/UTF8/etc., mais je n'ai pas rencontré de difficulté particulière les quelques fois où j'ai eu besoin de comparer des textes et fichiers ayant des mots accentués: je suppose que les mots étant encodés de la même manière des deux côtés, le programme se débrouillait pour s'y retrouver. Ou alors, peut-être que ma machine ou mon installation de Perl était paramétrée correctement, avec le bon "locale" pour gérer les caractères accentués français, cédilles, etc. Il s'agissait d'un gros serveur sur lequel je n'ai aucun contrôle, l'installation de Perl a été faite à ma demande par un administrateur système, mais j'ignore ce qu'il a fait précisément. J'ai notamment eu besoin de valider des adresses mail (ou, plutôt, le contraire, de détecter des adresses invalides). La présence d'un caractère accentué était une cause d'exclusion. Je n'ai eu aucun problème à détecter des adresses de la forme "toto.titi@numéricable.fr" et à les remplacer par une version avec le même caractère non accentué avec une commande du genre : "tr/àéèùôç/aeeuoc/", pour obtenir: "toto.titi@numericable.fr" Par ailleurs, je viens de faire un petit essai sur mon PC perso avec Perl sous Cygwin, il a l'air de gérer tout aussi correctement les accents dans les cas simples. Par exemple, le code suivant: Code :
Code :
Code :
__________________
Sauf mention contraire explicite, les bouts de code que je poste en réponse à une question n'ont pas forcément été testés. |
|||||||
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Étudiant Inscription : janvier 2013 Messages : 3 ![]() |
Je vais opter pour la solution de mettre le mot erroné en première position dans le tableau, ce qui est plus cohérent avec l'énoncé.
En ce qui concerne les accents c'est au niveau de l'insertion de lettres et de substitution que cela pose problème. $alphafr ( 'a'..'z' ) ne prend pas les accents. Je pense créer un tableau contenant les lettres de l'alphabet français, logiquement cela devrait résoudre le problème. EDIT1: j'ai résolu le problème d'insertion de caractère, il fallait rajouter +1 après $elt dans le splice Code :
splice (@insertion, $elt+1, 0, $alphafr); EDIT2: mettre l'alphabet avec les accents dans un tableau à résolu le problème. Il me reste juste à changer le nom du fichier sortie pour plus de clarté "nomdufichier" - "corrigé" .txt Encore merci pour votre aide |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com