Correcteur d'orthographe - Apprendre-PHP.com

Rechercher
PHP5 Avancé - Eric Daspet et Cyril Pierre de Geyer - Commander sur Amazon.fr

Correcteur d'orthographe

ElePHPant El-Roubio

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 Cormier
http://www.robotix.fr
Site 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 samedi 07 février 2009 à 22:10

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

2. Par gottetall le mardi 14 juillet 2009 à 12:12

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 mardi 22 septembre 2009 à 22:10

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