Comment créer un ChatGPT privé à l'aide d'une technologie open source ? Téléchargez notre livre blanc gratuit.

Intégration pour la correction orthographique | Bienvenue sur Lettria Lab

Ici, nous allons nous concentrer sur la résolution de la correction orthographique automatique grâce à l'intégration au niveau des caractères. Nos travaux sont disponibles pour téléchargement et expérimentation.

La correction orthographique automatique, bien qu'elle ait été développée depuis les années 70, reste difficile à résoudre en l'absence de données utilisateur significatives. Le texte bruyant pose problème pour de nombreuses tâches de PNL car il réduit la précision des techniques basées sur l'apprentissage automatique et augmente le nombre de mots hors vocabulaire (OOV) qui ne peuvent pas être gérés par des techniques courantes telles que Word2Vec ou Glove. C'est pourquoi, dans le cadre du prétraitement de notre pipeline, nous avons exploré plusieurs approches de correction orthographique proactive de nos données d'entrée afin d'améliorer notre précision sur les tâches en aval. Nous allons nous concentrer ici sur la résolution de ce problème grâce à l'intégration au niveau des personnages. Notre travail, qui permet une formation à partir de zéro, une utilisation et une visualisation, est disponible pour téléchargement et expérimentation en suivant ce lien[1].

Présentation

Les fautes d'orthographe peuvent être divisées en trois groupes qui nécessitent des approches différentes :

  1. Erreurs de mots réels: « trois » orthographié comme 'là'
    Les erreurs de mots réels sont les plus difficiles à corriger car elles dépendent du contexte. Pour les corriger, nous devons analyser l'ensemble des données pour vérifier la cohérence sémantique et la grammaire. En fonction de l'algorithme utilisé, nous introduisons la possibilité de corriger à tort des phrases précises et d'ajouter un temps de traitement important. La méthode la plus courante pour résoudre ce problème est le modèle seq2seq ou l'utilisation de données statistiques telles que le jeton ngram.
  2. Formulaires courts: « tu » orthographié comme « u »
    Les formes courtes ont la particularité de partager quelques lettres avec le mot voulu. Dans la mesure où modifier la distance craint que « u » soit plus proche du « je » que du « vous », les approches basées sur un dictionnaire sont donc moins efficaces.
  3. Erreurs autres que des mots: « rapide » orthographié comme « rapide »
    Les erreurs autres que les mots sont les plus fréquentes et proviennent principalement de fautes de frappe, nous nous concentrerons ici sur celles-ci.

La correction orthographique peut être divisée en trois tâches principales :

  • En prenant comme entrée une phrase, déterminez quels mots sont mal orthographiés.
  • À partir du mot mal orthographié, trouvez une liste de candidats au remplacement.
  • Choisissez le candidat approprié dans la liste. (En cas de correction automatique)

Comme nous ne nous intéressons qu'aux erreurs non verbales, pour déterminer quels mots sont mal orthographiés, il suffit de les comparer à un dictionnaire, bien qu'une attention particulière doive être portée aux noms propres.

Sélection des candidats

Il existe différentes manières de sélectionner les candidats :

  • L'approche la plus naïve consiste à calculer la distance d'édition que vous avez choisie entre votre mot et l'ensemble de votre dictionnaire. Bien que précise, cette approche est d'un coût prohibitif.
  • Algorithmes phonétiques[2] tels que Soundex, Phonex ou Metaphone. Ces algorithmes encodent n'importe quelle chaîne en une courte séquence qui permet l'indexation des chaînes par prononciation. « Hurry » et « hirry » renverront tous deux « H600 ». En prétraitant l'intégralité de votre dictionnaire et en l'indexant par code phonétique, vous pouvez facilement trouver des candidats phonétiquement similaires. Rapide à l'exécution mais il ne corrige que les erreurs phonétiques.
  • Calcul d'une liste de fautes d'orthographe possibles (insertion, suppression, transposition ou remplacement) de votre mot et en le faisant correspondre à votre dictionnaire. Bien que cette approche soit meilleure que l'approche naïve, elle est assez lente en raison d'un ensemble de fautes d'orthographe dont la taille augmente à un taux de 54 * longueur+25. Voir l'excellent article de Peter Norvig[3] pour plus d'explications.
  • Correction orthographique symétrique qui reprend l'idée précédente et l'étend en calculant les fautes d'orthographe à la fois pour le dictionnaire et pour le mot mal orthographié. Voir Symbole[4] pour plus de détails. Cette technique est à la fois précise et extrêmement rapide, mais elle nécessite un pré-calcul et un espace disque importants et nécessite une liste de fréquences de votre dictionnaire.

Insertions au niveau des personnages

Nous avons exploré une autre approche de ce problème en utilisant des intégrations de mots pour représenter les mots au niveau des caractères. Les approches populaires pour l'intégration de mots, telles que Word2Vec, cherchent à représenter les mots par leur sémantique, car cela s'avère très utile pour diverses tâches. Cependant, en utilisant des modèles basés sur les caractères, il est possible de construire une intégration de mots basée sur l'orthographe des mots. L'idée est similaire à celle d'un algorithme phonétique qui vise à représenter des mots similaires sous la même métrique unique (une chaîne ou un nombre à virgule flottante) mais nous étendons l'idée en utilisant une intégration à n dimensions.

Notre approche est la suivante :

  • Entraînez un modèle pour produire des intégrations de mots au niveau des caractères
  • Vectorisez l'intégralité de notre dictionnaire et créez un index pour une recherche efficace
  • Vectorisez un mot mal orthographié et recherchez les voisins les plus proches

Le modèle utilise deux couches de LSTM pour créer une intégration d'une taille choisie. Une dimension plus élevée fournit des résultats plus précis au prix d'un temps de calcul plus long. Pour notre utilisation, nous avons opté pour la dimension 150. Le modèle est entraîné en lui passant un tuple de mots qui sont soit deux mots complètement différents ou un un mot et une faute d'orthographe. L'objectif de la formation est de minimiser la norme de la différence entre les deux intégrations pour un tuple similaire et maximisez-le pour des mots différents.

Les données d'entraînement ont été générées à l'aide d'un dictionnaire de 600 000 mots et ont généré plusieurs fautes d'orthographe de distance d'édition de 1 ou 2 pour chaque mot. Nous avons attribué des probabilités plus élevées aux fautes d'orthographe proches des caractères d'origine sur un clavier AZERTY (puisque nous travaillons en français) afin que le modèle les favorise. En raison du manque de paramètres d'entraînement clairs, il est difficile de savoir exactement quand arrêter l'entraînement, mais après avoir parcouru quelques millions d'exemples de formation, nous avons été satisfaits des résultats.

Une fois entraîné, le modèle peut être utilisé pour vectoriser des mots. En les projetant sur un plan 2D avec PCA, nous pouvons obtenir la visualisation suivante :

python usage_visualisation.py

The original model we used was developed by IntuitionEngineering.

Le modèle original que nous avons utilisé a été développé par Ingénierie de l'intuition.

Succès ! Les mots similaires semblent être regroupés dans l'espace vectoriel.

Ce n'est pas très utile en soi, alors nous allons maintenant vectoriser l'ensemble de notre dictionnaire de 600 000 mots. Ce processus prend environ 10 minutes sur un processeur moderne.

La dernière étape consiste à construire un index qui permet de rechercher efficacement les vecteurs les plus proches. Comme nous n'avons pas besoin d'une précision de 100 % et que nous sommes plus préoccupés par la vitesse de calcul, nous utiliserons nmslib[5], une bibliothèque spécialisée dans la recherche ANN (Approximative Nearest Neighbor).

Cette bibliothèque nous permet de rechercher un numéro dans l'index k des plus proches voisins d'un vecteur donné. Nous pouvons ajuster le nombre k de voisins les plus proches pour rétablir l'équilibre entre la précision et le temps de calcul. Une fois que nous avons obtenu la liste des voisins les plus proches, nous pouvons filtrer davantage avec la distance de modification pour ne conserver que les suggestions pertinentes. Cela nous donne le résultat suivant (en français) :

python usage_correction.py « langage »

Modifier la distance 1 : langue : ['langue']
Modifier la distance 2 : langue : ['langues', 'langue', 'langue', 'langue']

Want to learn how to build a private ChatGPT using open-source technology?

Résultats

Nous avons testé notre modèle sur un corpus généré via notre générateur de fautes d'orthographe (environ 4 000 phrases). Notre indicateur sera la précision que nous définirons comme le pourcentage de fois où nous trouvons le mot correct dans notre liste de candidats.

Sur l'ensemble du corpus, le modèle chars2vec nous donne une précision de 85 % alors que l'algorithme phonétique standard avoisine les 40 %. La combinaison des deux approches nous donne une précision de 90 %. Le principal goulot d'étranglement concerne les mots de 4 caractères ou moins qui ne fonctionnent pas bien.

Il fallait s'y attendre car :

  • Les mots de cette taille ont de nombreux voisins à une courte distance d'édition.
  • Une faute de frappe dans un mot de 3 lettres a beaucoup plus d'impact que dans un mot de 10 lettres, ce qui rend beaucoup plus difficile pour le modèle de mapper correctement les mots les uns à côté des autres dans l'espace vectoriel.

Choix de correction

Alors que notre exemple précédent nous donne directement la réponse souhaitée, il y a souvent plusieurs candidats à distance d'édition et un choix doit être fait. Nous avons essayé deux approches différentes :

  • Probabiliste : utilisez une liste de fréquences construite à partir d'un vaste corpus et choisissez le mot le plus fréquent. L'inconvénient évident est que certains mots peu fréquents peuvent ne jamais être choisis, alors que cette approche est extrêmement simple et offre une bonne précision.
  • Sémantique : classez les candidats en fonction de leur similitude sémantique avec les mots qui les entourent dans la phrase. En prenant un skip-gram Word2Vec préentraîné et en calculant la distance moyenne entre l'intégration du candidat et les mots environnants (ou la phrase entière). Bien que le calcul soit intensif, cela donne de très bons résultats pour les mots ayant une bonne signification sémantique, bien que cela ne soit pas très efficace pour des mots tels que « là », « je », « sont » qui peuvent être utilisés dans n'importe quel contexte.

Empiriquement, nous avons constaté que l'approche sémantique fonctionne assez bien pour les mots plus longs et moins fréquents et que l'approche probabiliste est meilleure pour les mots plus courts. La combinaison des deux approches avec des règles fabriquées à la main nous donne un taux de correction d'environ 70 % sur notre corpus généré de manière aléatoire.

Travaux futurs : jeton N-grams

Au lieu de choisir entre sémantique et fréquence, l'approche idéale serait de combiner les deux. Ceci peut être réalisé en utilisant des tableaux de fréquences de mots N-grammes.

Pour construire ces tableaux, des séquences consécutives de N mots sont comptées et compilées sur un très grand corpus. La meilleure ressource disponible à cet effet est Google Books N-gram[6] qui a été construit en analysant autour de 5 millions de livres dans différentes langues.

‘Spelling Correction’ bi-gram occurrences

Occurrences du bigramme « Correction orthographique »

Les données brutes sont disponibles à ce sujet lien[7] mais en raison de la quantité de texte, le téléchargement et la compilation dans un état utilisable prennent beaucoup de temps.

Conclusion

L'utilisation d'intégrations au niveau des caractères donne de bonnes performances globales et est particulièrement efficace pour les mots plus longs. Avec des règles de prétraitement artisanales et une sélection adéquate des candidats, cela constitue une alternative décente aux solutions existantes de correction orthographique.

Les travaux ultérieurs incluront une référence appropriée avec des solutions populaires déjà existantes et l'utilisation de jetons n-gram. En attendant, ce package peut être expérimenté gratuitement avec : char2vec[1].

[1] https://github.com/Lettria/Char2Vec
[2] https://en.wikipedia.org/wiki/Phonetic_algorithm
[3] https://norvig.com/spell-correct.html
[4] https://github.com/wolfgarbe/SymSpell
[5] https://github.com/nmslib/nmslib
[6] https://books.google.com/ngrams/
[7] http://storage.googleapis.com/books/ngrams/books/datasetsv2.html

Callout

Créez votre pipeline NLP gratuitement
Commencez ->