119 votes

Quel algorithme donne des suggestions dans un correcteur orthographique ?

Quel algorithme est généralement utilisé lors de la mise en œuvre d'un correcteur orthographique accompagné de suggestions de mots ?

Au début, j'ai pensé qu'il serait judicieux de vérifier chaque nouveau mot tapé (s'il n'est pas trouvé dans le dictionnaire) en le comparant à sa fonction distance de Levenshtein de tous les autres mots du dictionnaire et de renvoyer les premiers résultats. Cependant, cela semble très inefficace, car il faudrait évaluer l'ensemble du dictionnaire à plusieurs reprises.

Comment cela se passe-t-il généralement ?

209voto

Thomas Jung Points 17692

Il y a bon essai de Peter Norvig comment mettre en place un correcteur d'orthographe. Il s'agit essentiellement d'une approche par force brute qui consiste à essayer des chaînes de caractères candidates avec une distance d'édition donnée. ( Ici Voici quelques conseils pour améliorer les performances du correcteur d'orthographe à l'aide d'une Filtre Bloom et hachage plus rapide des candidats .)

Les exigences relatives à un correcteur orthographique sont plus faibles. Il suffit de constater qu'un mot ne figure pas dans le dictionnaire. Vous pouvez utiliser un Filtre Bloom pour construire un vérificateur d'orthographe qui consomme moins de mémoire. Une ancienne version est décrite dans Perles de la programmation par Jon Bentley en utilisant 64kb pour un dictionnaire anglais.

A BK-Tree est une approche alternative. Un bon article est ici .

La distance de Levenshstein n'est pas exactement la bonne distance d'édition pour un correcteur orthographique. Elle ne connaît que l'insertion, la suppression et la substitution. La transposition est manquante et produit 2 pour une transposition de 1 caractère (c'est 1 suppression et 1 insertion). Distance Damerau-Levenshtein est la bonne distance d'édition.

18voto

Adrian McCarthy Points 17018

Une approche pour générer des suggestions que j'ai utilisée avec succès mais que je n'ai jamais vue décrite nulle part consiste à pré-calculer les suggestions (lors de la construction du dictionnaire) en utilisant de "mauvaises" fonctions de hachage.

L'idée est d'examiner les types de fautes d'orthographe que font les gens et de concevoir des fonctions de hachage qui attribueraient une orthographe incorrecte au même godet que son orthographe correcte.

Par exemple, une erreur courante est d'utiliser la mauvaise voyelle, comme définitif au lieu de définitif . Il faut donc concevoir une fonction de hachage qui traite toutes les voyelles comme la même lettre. Un moyen simple d'y parvenir consiste à "normaliser" le mot d'entrée, puis à soumettre le résultat normalisé à une fonction de hachage ordinaire. Dans cet exemple, la fonction de normalisation peut supprimer toutes les voyelles, de sorte que definite devient dfnt . Le mot "normalisé" est ensuite haché avec une fonction de hachage typique.

Insérez tous les mots de votre dictionnaire dans un index auxiliaire (table de hachage) en utilisant cette fonction de hachage spéciale. Les buckets de cette table auront des listes de collisions assez longues parce que la fonction de hachage est "mauvaise", mais ces listes de collisions sont essentiellement des suggestions pré-calculées.

Maintenant, lorsque vous trouvez un mot mal orthographié, vous consultez les listes de collisions pour le seau auquel l'orthographe erronée correspond dans les index auxiliaires. Et voilà : Vous avez une liste de suggestions ! Tout ce que vous avez à faire est de classer les mots qui s'y trouvent.

En pratique, vous aurez besoin de quelques index auxiliaires avec d'autres fonctions de hachage pour gérer d'autres types d'erreurs, comme les lettres transposées, les lettres simples/doubles, et même un index simpliste de type Soundex pour attraper les fautes d'orthographe phonétique. En pratique, j'ai trouvé que les index simplistes de prononciation allaient loin et rendaient essentiellement obsolètes certains des index conçus pour trouver des fautes de frappe triviales.

Il faut donc maintenant rechercher les fautes d'orthographe dans chacun des index auxiliaires et concaténer les listes de collision avant de procéder au classement.

N'oubliez pas que les listes de collisions ne contiennent que des mots qui figurent dans le dictionnaire. Avec les approches qui essaient de générer des orthographes alternatives (comme dans l'article de Peter Norvig), vous pouvez obtenir des (dizaines de) milliers de candidats que vous devez d'abord filtrer par rapport au dictionnaire. Avec l'approche pré-calculée, vous obtenez peut-être quelques centaines de candidats, et vous savez qu'ils sont tous correctement orthographiés, vous pouvez donc passer directement au classement.

3voto

Petr Peller Points 1693

Vous n'avez pas besoin de connaître la distance d'édition exacte pour chaque mot du dictionnaire. Vous pouvez arrêter l'algorithme après avoir atteint une valeur limite et exclure le mot. Cela vous fera gagner beaucoup de temps de calcul.

2voto

Le correcteur orthographique est très facile à mettre en œuvre, comme dans un programme orthographique Unix. Le code source est disponible au public. La correction peut être complexe, une technique consiste à effectuer des modifications et à vérifier à nouveau si ce nouveau mot figure dans le dictionnaire. Ces nouvelles modifications peuvent être regroupées et montrées à l'utilisateur.

Le système Unix utilise un programme écrit par Mc IllRoy. Une autre méthode consiste à utiliser un Trie qui peut être utile dans le cas de fichiers énormes.

L'approche unix nécessite très peu d'espace pour un énorme dictionnaire puisqu'elle utilise l'algorithme de hachage par dispersion.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X