web-dev-qa-db-fra.com

Quel algorithme donne des suggestions dans un correcteur orthographique?

Quel algorithme est généralement utilisé lors de l'implémentation d'un correcteur orthographique accompagné de suggestions Word?

Au début, j'ai pensé qu'il pourrait être judicieux de vérifier chaque nouveau mot tapé (s'il n'est pas trouvé dans le dictionnaire) par rapport à distance Levenshtein de chaque autre mot du dictionnaire et de renvoyer les meilleurs résultats. Cependant, cela semble être très inefficace, car il faudrait évaluer le dictionnaire entier à plusieurs reprises.

Comment cela se fait-il généralement?

111
Mithrax

Il y a bon essai de Peter Norvig comment implémenter un correcteur orthographique. Il s'agit essentiellement d'une approche par force brute essayant des chaînes candidates avec une distance d'édition donnée. ( ici sont quelques conseils pour améliorer les performances du correcteur orthographique en utilisant filtre Bloom et hachage candidat plus rapide .)

Les exigences pour un correcteur orthographique sont plus faibles. Vous n'avez qu'à découvrir qu'un mot n'est pas dans le dictionnaire. Vous pouvez utiliser un Bloom Filter pour construire un correcteur orthographique qui consomme moins de mémoire. Une ancienne version est décrite dans Programming Pearls par Jon Bentley utilisant 64kb pour un dictionnaire anglais.

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

La distance de Levenshstein n'est pas exactement la bonne distance d'édition pour un correcteur orthographique. Il 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.

196
Thomas Jung

Une approche pour générer des suggestions que j'ai utilisées avec succès mais que je n'ai jamais vues décrites 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 d'erreurs d'orthographe que les gens font et de concevoir des fonctions de hachage qui attribueraient une orthographe incorrecte au même compartiment que son orthographe correcte.

Par exemple, une erreur courante consiste à utiliser la mauvaise voyelle, comme definate au lieu de definite. Vous concevez donc une fonction de hachage qui traite toutes les voyelles comme la même lettre. Un moyen simple de le faire consiste à "normaliser" d'abord le mot d'entrée, puis à placer le résultat normalisé via une fonction de hachage standard. Dans cet exemple, la fonction de normalisation peut supprimer toutes les voyelles, donc definite devient dfnt. Le mot "normalisé" est ensuite haché avec une fonction de hachage typique.

Insérez tous vos mots du dictionnaire dans un index auxiliaire (table de hachage) à l'aide de cette fonction de hachage spéciale. Les compartiments de ce tableau auront des listes de collisions plus longues car la fonction de hachage est "mauvaise", mais ces listes de collisions sont essentiellement des suggestions pré-calculées.

À présent, lorsque vous trouvez un mot mal orthographié, vous recherchez les listes de collisions pour le compartiment auquel la faute d'orthographe mappe dans les index auxiliaires. Ta da: Vous avez une liste de suggestions! Tout ce que vous avez à faire est de classer les mots dessus.

Dans la 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 simpliste de type Soundex pour détecter les fautes d'orthographe phonétiques. Dans la pratique, j'ai trouvé que les prononciations simplistes vont très loin et essentiellement obsolètes certaines conçues pour trouver des fautes de frappe triviales.

Alors maintenant, vous recherchez les fautes d'orthographe dans chacun des index auxiliaires et concaténez les listes de collisions avant le classement.

N'oubliez pas que les listes de collisions ne contiennent que des mots qui se trouvent dans le dictionnaire. Avec des 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.

Mise à jour : J'ai depuis trouvé une description d'algorithme similaire à celle-ci, la FAROO Distributed Search . Il s'agit toujours d'une recherche limitée par la distance de montage, mais elle est très rapide car l'étape de pré-calcul fonctionne comme mon idée de "mauvaises fonctions de hachage". FAROO utilise simplement un concept limité d'une mauvaise fonction de hachage.

17
Adrian McCarthy

Algorithme

  1. Prenez un mot mal orthographié comme entrée.
  2. Stockez la liste des mots anglais ainsi que leurs fréquences dans un fichier texte.
  3. Insérez tous les mots anglais disponibles (stockés dans le fichier texte) ainsi que leurs fréquences (mesure de la fréquence à laquelle un mot est utilisé en anglais) dans un arbre de recherche ternaire.
  4. Traversez maintenant le long de l'arbre de recherche ternaire -
    • Pour chaque mot rencontré dans l'arbre de recherche ternaire, calculez sa distance de Levensthein par rapport au mot mal orthographié.
    • Si Distance Levensthein <= 3, stockez le mot dans une file d'attente prioritaire.
    • Si deux mots ont la même distance d'édition, celui avec une fréquence plus élevée est râpe. Imprimez les 10 principaux éléments de la file d'attente prioritaire.

Optimisation

  1. Vous pouvez éliminer les mots dans la sous-arborescence du nœud actuel si la distance de modification de la sous-chaîne du mot d'entrée par rapport au mot actuel est supérieure à 3.
    Vous pouvez trouver l'explication plus détaillée et le code source sur projet github .
7
amarjeetAnand

Vous n'avez pas besoin de connaître la distance de modification 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 économiser beaucoup de temps de calcul.

3
Petr Peller

Le correcteur orthographique est très facile à implémenter comme dans le programme de sorts Unix. Le code source est disponible en public. La correction peut être impliquée, une technique consiste à faire des modifications et à nouveau vérifier si ce nouveau mot est dans le dictionnaire. Ces nouvelles modifications peuvent être regroupées et affichées à l'utilisateur.

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

L'approche Unix a besoin de beaucoup moins d'espace pour un énorme dictionnaire car elle utilise l'algorithme de hachage de dispersion.