2016-08-14 3 views
0

Je suis en train de développer un correcteur orthographique pour une langue non anglaise qui fonctionne sur la sortie OCR. J'utilise de très grands dictionnaires pour vérifier les fautes d'orthographe et donner des suggestions.Amélioration de la correction orthographique basée sur un ensemble de lettres avec des formes similaires en PHP

La plupart des erreurs d'orthographe sont dues à des lettres de forme similaire. Par exemple ـجـ, ـچـ, ـحـ, ـخـ ou غ, ع, etc Ces lettres existent en anglais aussi, par exemple I, l et u, v, y.

Le système de vérification orthographique donne quelques suggestions pour un mot que nous voulons vérifier. Par exemple, si nous saisissons voga il vous conseillerons ces mots:

  • volga
  • boga
  • yoga
  • toga

Depuis la longueur de voga est 4, alors nous allons ne gardez que des suggestions de 4 lettres. Maintenant, parce qu'un moteur OCR peut détecter v comme y (parce que leurs formes sont semblables), nous allons choisir yoga comme meilleure suggestion pour voga comme sortie OCR.

Dans notre langue, ce type de sélection est très efficace. Par exemple, si nous saisissons مدپر, ces mots seront proposées:

  • مدارا
  • مدار
  • مدیر
  • مراد

Sur la base de nos ensembles (dans cet exemple: ـبـ, ـپـ , ـیـ et ز, ر, ژ et ذ, د et مـ, فـ, قـ) et la longueur du mot, مدیر serait la meilleure option pour مدپر.

La façon dont je mets en œuvre habituellement cette fonction dans le langage de script PHP est de garder les mots dans la même longueur qui sont a alors suggéré de créer toutes les combinaisons possibles du mot mal orthographié en remplaçant tous les jeux (comme مدپر, فدپر, قدپر puis مذپر, فذپر, قذپر et ainsi de suite), puis de rechercher le même mot dans la liste des suggestions. Mais cette méthode de mise en œuvre est très lente (spécialement sur un grand contexte) et la rend presque inutile.

Quelle est la meilleure méthode ou algorithme pour implémenter ce type de fonction en PHP?

Mise à jour:

Les moteurs qui produisent des listes de suggestions sont optimisées et comprennent généralement le mot correct dans la liste de suggestions. Le problème est que mon système doit sélectionner l'une des suggestions comme le mot correct sans aucune intelligence artificielle. Donc, je pense que cette méthode est bonne dans ma langue car il existe de nombreux ensembles dans lesquels les lettres ont une forme similaire et c'est pourquoi les moteurs OCR détectent généralement les mots à tort. Mais s'il y a de meilleures méthodes, vous êtes invités à les suggérer.

+3

S'il vous plaît pardonnez-moi, mais êtes-vous sérieux ??? C'est une question trop large. Des solutions existent, mais de nombreux scientifiques y ont passé des années, car c'est un sujet important. Et vous pouvez certainement trouver des centaines de pages sur ce sujet. Alors s'il vous plaît faites quelques recherches, puis revenez et montrez vos efforts, montrez ce que vous avez essayé et quels problèmes vous devez résoudre dans votre prochaine étape. –

+0

@AlKepp Les moteurs que j'utilise pour obtenir des suggestions sont optimisés et donnent presque le mot correct comme une de leurs suggestions. Le problème est que mon système doit sélectionner automatiquement l'une des suggestions et en sélectionner une en utilisant cette méthode est vraiment efficace. Je ne sais pas comment devrais-je sélectionner le meilleur que l'on attend de faire une telle chose. –

+0

@AlKepp J'ai également mis à jour ma question. –

Répondre

1

Je pense toujours que cette question est trop large pour être posée ici. Il me semble toujours que vous n'avez aucune idée de comment le faire, donc vous ne devriez pas demander de solution PHP. À mon avis, cette question est en premier lieu sur la solution algorithmique, pas sur la programmation ou la mise en œuvre. Je suis sûr que de nombreuses solutions existent, et comme nous avons fait une recherche scientifique dans ce domaine il y a quelques années, je vais vous proposer une solution pour vous aider à comprendre comment vous pouvez le faire. Supposons que vous ayez un "mot OCR" invalide et que vous souhaitiez sélectionner le meilleur mot valide pour le remplacer dans votre dictionnaire de mots valides.

  1. Commencez avec l'algorithme de suggestion standard. Donc, vous obtenez quelques mots candidats.

  2. Calculez maintenant la "distance" de ces mots au mot OCR.

  3. Utilisez le candidat avec la distance calculée minimale.

La question est maintenant de savoir comment calculer la distance de deux mots. Vous pouvez commencer avec Hamming distance - mais cet algorithme classique n'est pas assez bon pour votre situation et il ne fera pas plus que ce que vous avez déjà obtenu à partir de l'étape 1, donc vous devez faire quelque chose de plus approprié pour vous. Simplement dit que vous voulez donner un bonus pour des symboles/lettres similaires. Nous avons utilisé un automate flou pour résoudre la même situation pour l'analyse de l'ADN. Il serait trop long d'écrire un algorithme complet ici, alors s'il vous plaît regardez our paper si vous avez besoin de plus d'informations. (Le lien va vers le référentiel searchgate.)

Vous pouvez également ignorer complètement l'étape 1 et créer un système de recherche global pour des mots similaires avec des similitudes, ce qui est également décrit dans notre article. Je voterais pour cette approche globale.

+0

Merci beaucoup, c'est ce dont j'avais besoin. Je vais lire l'article entier. –

+0

C'est tellement complexe! Je ne peux pas le comprendre. Pouvez-vous s'il vous plaît écrire un algorithme de programmation simple pour la recherche? –