Correcteur d'orthographe

Rechercher

Correcteur d'orthographe

  • Par robocop
  • 3 commentaires
  • 6 290 lectures
  • De Quentin Cormier
  • RSS -  Atom

PhpCheck est un petit script php qui a pour but de corriger l'orthographe d'un texte en utilisant un dictionnaire de mots.

Le dictionnaire est constitué de nombreux fichiers textes, pour améliorer le temps de calcul.

Pour corriger un texte, on utilise la fonction correct_text string -> string ou on peux créer sa propre fonction de mise en forme grâce à l'array renvoyé par la fonction get_correction().

Portion de code

<?php/*Ce script est placé sous la license GPL.Auteur : Quentin Cormierhttp://www.robotix.frSite du script : http://pascal.cormier.free.fr/correcteur/*/header('Content-Type: text/html; charset=iso-8859-1');ini_set("memory_limit",'160M');if(isset($_GET['source']))     show_source(__FILE__);    /* * Définition des variables globales */$explode = '\s,\/\n\r()<>."\';?!:='; //Cacractères à exploser$extrawords = array(" ", ",", "<", ">", "(", ")", ".", "/", "\\", "\"", "\n", "\r", "\t", ";", ":", "=", "'", "!", "?", "l", "n", "qu", "d", "c", "s", "n", "t", "j", "m", "a", "à");$chemin = 'dictionnaire/'; /** Fonction qui s'occupe de la mise en forme de la correction, et qui renvoie le texte*/function correct_text($texte){    $resultat = get_correction($texte);    $return = '';    foreach($resultat as $mot)    {        if($mot[0] == 0)            $return .= $mot[1];        elseif($mot[0] == 1)            $return .= '<acronym title="Nous vous proposons  : '.implode(', ', $mot[2]).'" style="color:orange;">'.$mot[1].'</acronym>';        elseif($mot[0] == 2)            $return .= '<acronym title="aucune suggestion trouvée" style="color:red;">'.$mot[1].'</acronym>';    }    return $return;} /* * Fonction qui corrige un mot */function correct_word($mot, $dictionnaire) {    $mot_entre = strtolower($mot);    if(in_array($mot_entre, $dictionnaire))     {        $faute = false;        $correction = false;    }    else     { //Si le mot n'est pas dans le dictionnaire        $distance = -1; //On va rechercher des distances de mots : pour l'instant, elle est à moins un.        $suggestions = array();        foreach($dictionnaire as $mot_dico)         {             $lev = levenshtein($mot_entre, $mot_dico);            if($lev <= 2)             {                $faute = true;                $correction = true;                $suggestions[$lev] = $mot_dico;            }        }        if (!isset($faute)) { //Si il n'existe aucun mot à correspondance exacte et si le mot est trop éloigné du dico            $faute = true;            $correction = false;        }    }      if ($faute && $correction)    {        ksort($suggestions);        $return = array(1, $mot, $suggestions);    }    elseif ($faute && !$correction)        $return =  array(2, $mot);    else        $return = array(0, $mot);     return $return;}/* * Fonction qui applique à chaque mot la fonction correct_word */function get_correction($texte) {    global $explode, $extrawords;      $mots = preg_split('/(['.$explode.'])/', $texte, -1, PREG_SPLIT_DELIM_CAPTURE);    $mots = array_filter($mots); //On enlève tous les débrits d'array que l'on a créé en explosant le texte    $dictionnaires = charge_dicos($mots); //On charge les dictionnaires;    $resultat = array();    foreach($mots as $mot)     {        if(!is_numeric($mot) && !in_array(strtolower($mot), $extrawords)) {            if(is_correct($mot))    {                $dico = name_dico($mot);                $resultat[] =  correct_word($mot, $dictionnaires[$dico]);            }            else                $resultat[] = $return =  array(2, $mot);        }        else            $resultat[] = array(0, $mot);    }    return $resultat;} /** Fonction qui charge les dictionnaires nécéssaires à la correction du texte*/function charge_dicos($mots)     {    global $extrawords, $chemin;     $dico_a_charger = array();    foreach($mots AS $mot)     {        if(!in_array($mot, $extrawords) && is_correct($mot) && !is_numeric($mot))            $dico_a_charger[] = name_dico($mot);    }    $dico_a_charger = array_unique($dico_a_charger); //On enlève tous les doublons    $dictionnaires = array();    foreach($dico_a_charger as $dico)     {        if(file_exists($chemin.$dico.'.txt'))         {            $dictionnaire = file($chemin.$dico.'.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);            $dictionnaires[$dico] = array_map('rtrim', $dictionnaire);        }        else            $dictionnaires[$dico] = array(); // Pas de dictionnaire correspondant, on envoit du vide pour éviter une erreur    }    return $dictionnaires;}/* * Fonction pour obtenir le nom du dictionnaire approprié */function name_dico($mot) {    $mot = strtolower($mot);    $lenght = strlen($mot);    $mot = no_accents($mot);    if ($lenght < 2)        return $mot[0].'.-.1-3';    elseif ($lenght > 26)        return $mot[0].'.'.$mot[1].'25-27';    else        return $mot[0].'.'.$mot[1].'.'.($lenght-1).'-'.($lenght+1);} /** Fonction qui vérifie si les deux premiers caractères de chaque mot est bien une lettre ou un tiret*/function is_correct($mot) {    $mot = no_accents(strtolower($mot));    if (((ord($mot[0])>=97 && ord($mot[0])<=122) || ord($mot[0])==45) && ((ord($mot[1])>=97 && ord($mot[1])<=122) || ord($mot[1])==45) && ord($mot[0])!=60)        return true;    else        return false;}/** Fonction qui enlève les accent d'un mot*/function no_accents($mot) {    $mot = strtr($mot, "àäâéèêëïîöôüûùç", "aaaeeeeiioouuuc");    return $mot;} ?>

Les commentaires

1. Par laurent le 07/02/2009 22:41

c'est cool, mais ils sont ou les fichiers textes du dico ?

2. Par gottetall le 14/07/2009 12:14

Cool on venait juste de me signaler des fautes sur l'un de mes sites. je vais essayer ce script. Merci

3. Par Jean le 22/09/2009 22:26

laurent : tu pourras télécharger le dictionnaire ici : http://pascal.cormier.free.fr/correcteur/