Bon, pour la fonction de test, je propose cet algo :
------ Préparation à ne faire qu'une seule fois ------
Variable :
NGRAMME = 2 ou 3 (je préfèrerais 3)
TAILLE_CORPUS = beaucoup, disons 1 million (le nombre de lettre dans le corpus)
CORPUS = tableau de caractère contenant un savant mélange entre français, anglais, … en fonction de ce qu'on aura décidé
NOMBRE_CARACTÈRES_TESTÉS = pas mal (cf
http://bepo.fr/wiki/Caract%C3%A8res_support%C3%A9s si vous avez envie de compter). On n'est pas obligé de tous les tester, mais je pense que prendre au moins les 150 plus courants pourrait être intéressant. La liste différencie les caractères accentué entre eux (ex : é, e, è sont trois caractères.
OCCURRENCE = tableau de (NOMBRE_CARACTÈRES_TESTÉS ^ L_ DIGRAMME) cases + 1 (les caractères non supportés). C'est un énorme tableau, j'en suis bien conscient. Pour NGRAMME = 3, ça devrait rester acceptable (et j'aimerai bien qu'on teste les trigrammes). Pour gagner un peu de place en mémoire, on peux aussi diminuer NOMBRE_CARACTÈRE_TESTÉS. Si on prend NGRAMME = 3 et NOMBRE_CARACTÈRE_TESTÉS = 100, avec chaque occurrence stocké dans un entier de 32 bits, le tableau ferait donc 1 000 000 d'entiers, soit 8 MO.
debut :
pour i de NGRAMME à TAILLE_CORPUS faire
si (( CORPUS [ i ],CORPUS [ i - 1 ], CORPUS [ i - 2 ] (pour NGRAMME == 3)) sont des caractères connus) alors
incrémenter la case correspondant au N-gramme (CORPUS [ i ], CORPUS [ i - 1 ], CORPUS [ i - 3 ])
sinon
incrémenter la case correspondant à caractère non testé.
fin si
fin pour
enregistrer les résultats, et éventuellement les trier par ordre d’occurrence.
fin
ex : si on parce le corpus «Hé, c'est un pain pas bon», on obtiendra les stats suivantes (avec NGRAMME = 3) :
«Hé,» 1
«é, » 1
«, c» 1
« c'» 1
«c'e» 1
«'es» 1
«est» 1
«st » 1
«t u» 1
« un» 1
«un » 1
«n p» 2
« pa» 2
«pai» 1
«ain» 1
«in » 1
«pas» 1
«s b» 1
« bo» 1
«bon» 1
À part les NGRAMME première lettres et les NGRAMME dernières, elle seront toutes prises en comptes NGRAMME fois. En soit, ce n'est pas grave.
Cette méthode permet également de prendre en compte les débuts et fin de mots.
-----------
calcul du coup de tout les n-grammes
On se base sur les positions physiques des touches, pas du layout.
Cette étape peut également être en partie pré calculé/déterminé ( place prise en mémoire : (NOMBRE_DE_TOUCHE_SUR_LE_CLAVIER ^ NGRAMME) * (COUCHE_MODIFICATRICE ^ NGRAMME), soit environ (50^3) * (6 ^ 3) si on a 50 touches utiles, et les couches normale, maj, altgr, altgr+maj, level5, level5+maj) pour chacun des emplacement possible pour les touches modificatrices (mais ça ils ne devrait pas y en avoir 50 !)
Pour cela, on détermine le coup du n-gramme en question (on prendra en compte la position de chaque touche (ainsi que le coup pour activer les modificateurs si nécessaire), et un bonus si ça s'enchaine facilement, ou un malus si c'est dur).
C'est la partie compliqué, mais de toute façon on devrai la faire quelque soit l'algo utilisé.
---------------
fonction d'évaluation (la seule à effectué à chaque fois)
variable :
NB_ NGRAMMES_PRIS_EN_COMPTE = selon la vitesse à laquelle on veux évaluer, on peux prendre les 1000, 10000, … n-grammes les plus courants dans le tableau calculé à l'étape précédente.
COUP_TOTAL = entier
début
COUP_TOTAL = 0
pour i de 0 à NB_ NGRAMMES_PRIS_EN_COMPTE
On récupère le coup associé pour générer le n-gramme en question calculé à l'étape 2
on multiplie ce résultat par le nombre d’occurrences correspondant à ce n-gramme calculé à l'étape 1
on ajoute la valeur obtenue à COUP_TOTAL
fin pour
fin
---------------------------
L'avantage, c'est qu'on peux faire facilement des tests sur les lettres accentué, sur plusieurs couches, … sans que ça ne soit trop long (c'est une simple suite de multiplication d'entier).