Correcteur orthographique

Résolu/Fermé
hakim13700 Messages postés 1 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 12 février 2014 - 12 févr. 2014 à 14:09
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 12 févr. 2014 à 19:40
Bonjour, je réalise un correcteur orthographique en java et je suis bloqué a la question :

Etant donné un mot incorrect, il suffit de générer tous les mots qui diffèrent de ce mot incorrect d'une seule lettre. Par exemple, pour le mot incorrect 'tble', on va essayer d'ajouter une lettre à chaque position, et on va essayer :

- {a,b,c,..,z}tble (donc 26 mots)
- t{a,b,c,...,z}ble (donc encore 26 mots) : dans ce paquet, on trouve 'table'
- tb{a,b,c,...,z}le (encore 26 mots)
- ....

chaque mot généré est bien sûr cherché dans le dictionnaire et on ne retient que ceux qui sont corrects. On fait la même chose avec la suppression d'une lettre, la permutation de deux lettres, etc.

La méthode semble un peu "lourde", mais c'est en fait très rapide, car on ne génère à chaque fois que de l'ordre de 26 mots, donc ça fonctionne parfaitement.

Si quelqu'un a une idée merci de me répondre

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
12 févr. 2014 à 19:40
"on ne génère à chaque fois que de l'ordre de 26 mots"
En réalité tu en génère 26*(n+1) où n est le nombre de lettres donnés.
Pour un mot de 9 lettres tu auras donc 260 mots à comparer.

Je te propose de regarder ce code : Énumérer un ensemble comme si on avait des boucles imbriquées. Voici comment s'en servir dans ton cas :

import ccm.kx.enumerator.Bounds;
import ccm.kx.enumerator.Enumeration;

public class Test
{
    private static String insert(String str, int n, char c)
    {
        return str.substring(0,n)+c+str.substring(n,str.length());
    }
    
    public static void main(String[] args)
    {
        String incomplete = "tble";
        for (long[] tab : new Enumeration(2, Bounds.make(0,'a'), Bounds.make(incomplete.length(),'z'), Bounds.make(1), false))
             System.out.println(insert(incomplete,(int) tab[0], (char) tab[1]));
    }
}


Ce qui donne :

atble, btble, ctble, dtble, etble, ftble, gtble, htble, itble, jtble, ktble, ltble, mtble, ntble, otble, ptble, qtble, rtble, stble, ttble, utble, vtble, wtble, xtble, ytble, ztble, table, tbble, tcble, tdble, teble, tfble, tgble, thble, tible, tjble, tkble, tlble, tmble, tnble, toble, tpble, tqble, trble, tsble, ttble, tuble, tvble, twble, txble, tyble, tzble, tbale, tbble, tbcle, tbdle, tbele, tbfle, tbgle, tbhle, tbile, tbjle, tbkle, tblle, tbmle, tbnle, tbole, tbple, tbqle, tbrle, tbsle, tbtle, tbule, tbvle, tbwle, tbxle, tbyle, tbzle, tblae, tblbe, tblce, tblde, tblee, tblfe, tblge, tblhe, tblie, tblje, tblke, tblle, tblme, tblne, tbloe, tblpe, tblqe, tblre, tblse, tblte, tblue, tblve, tblwe, tblxe, tblye, tblze, tblea, tbleb, tblec, tbled, tblee, tblef, tbleg, tbleh, tblei, tblej, tblek, tblel, tblem, tblen, tbleo, tblep, tbleq, tbler, tbles, tblet, tbleu, tblev, tblew, tblex, tbley, tblez

Il ne te reste alors qu'à tester chaque mot dans le dictionnaire.
0