Bienvenue, Invité
Merci de vous identifier ou de vous inscrire.    Mot de passe perdu?

[TUTO] Correcteur orthographique
(1 lecteur(s)) (1) Invité(s)
Aller en basPage: 1
SUJET:

[TUTO] Correcteur orthographique

#55089
mparis
Junior Boarder
Messages: 25
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

[TUTO] Correcteur orthographique

Il y a 6 Années, 4 Mois
Karma: 2  
Bonjour à tous.

Dans mon premier tuto concernant le moteur de recherche, je vous ai dis que j'allais vous expliquer la correction orthographique. Come je n'ai qu'une parole, voici une explication de celle-ci :

Problématique
Comment connait-on l'orthographe exact de tel ou tel mot ?
Réponse
Il n'est pas utiles de savoir l'orthographe parfaite des mots, il est surtout utile de connaître tous les mots que contient votre site web, principalement, tous les mots que l'utilisateur pourra rechercher dans le moteur de recherche. Il n'y a pas besoin d'aller chercher très loin, la table catalogsearch_fulltext contient un champ 'data_index' qui contient tous les mots de vos articles. Il suffit juste de les séparer.

Problématique
Comment savoir qu'un mot est mal orthographié ?
Réponse
Un mot est mal orthographié tout simplement quand une recherche n'aboutit pas. A ce moment là on peut effectuer tous les calculs nécessaires pour essayer de corriger le mot.

Problématique
Comment corriger le mot ?
Réponse
Voilà le cœur du problème, mais PHP est bien fait, et a la solution à notre problème. Les fonctions metaphone() et levenshtein().
La fonction metaphone permet de donner une représentation phonétique du mot (en anglais hélas, mais c'est mieux que rien ) et la fonction levenshtein via (l'algo de levenshtein) nous donne le nombre de modification (ajout, suppression ou modification de lettre) nécessaire pour trouver le deuxième mot.

Une fois ces deux fonctions maitrisées, il nous suffit d'effectuer un petit algo qui parcourt tous les mots du site pour sortir celui se rapprochant le plus possible de notre mot mal orthographié.
Pour ce faire, il faut surcharger le block Result du module catalogsearch, principalement, la fonction getNoResultText():

Block/Result.php :
Code :


public function getNoResultText()
    {
        $stringHelper = Mage::helper('core/string');
        
        //On vérifie la longueur de la requête.
     if (Mage::helper('catalogsearch')->isMinQueryLength()) {
            return Mage::helper('catalogsearch')->__('Minimum Search query length is %s', $this->_getQuery()->getMinQueryLength());
        }
        
        //Pour charger au plus vite les mots, on récupère directement la resource pour y effectuer notre requête de récupération.
        $resource = Mage::getSingleton('core/resource');
$read= $resource->getConnection('core_read');
        
$select = $read->select()->from('catalogsearch_fulltext', array('data_index'));
$textProducts = $select->query();
        $all_text = '';
        //Pour chaque ligne (produit), on remplace le séparateur | par un espace pour isolé tous les mots
        foreach($textProducts->fetchAll() as $text){
         $all_text .= str_replace('|', ' ', $text['data_index']);
        }
        
        //On récupère tous les mots unique dans un tableau (variable true)
        $all_words = $stringHelper->splitWords($all_text, true);
        
        //On récupère tous les mots de notre recherche pour vérifier qu'ils soient tous bien orthographiés
        $all_words_searching = $stringHelper->splitWords($this->helper('catalogsearch')->getQueryText(), false);
        $all_correct_word = array();
        
//On vérifie ensuite tous les mots de la recherche
        foreach($all_words_searching as $word_fault){
         if(!in_array($word_fault, $all_words)){
         $word_fault = Mage::helper('monentreprise_catalogsearch/data')->getMostSimilarString($word_fault,$all_words);
         }
         $all_correct_word[] = $word_fault;
        }
        //Si un mot a été mal orthographié on propose un lien avec la nouvelle recherche.
        if(count($all_correct_word)>0){
         return 'Aucun résultat n\'a été trouvé, essayez : <a href="'.Mage::helper('monentreprise_catalogsearch/data')->getResultUrl(join(' ', $all_correct_word)).'">'.join(' ', $all_correct_word).'</a>';
        }
        else{
         return $this->__('Aucun résultat n\'a été trouvé, essayez de corriger votre recherche.');
        }
    }



Dans le helper de votre module, ajoutez la fonction suivante pour trouver le mot le plus similaire :

Code :


public function getMostSimilarString($fault, $lst_word)
{
$faultMetaphone = metaphone($fault);

$metaphoneKeys = array();
$levenshtein = 0;
$proximityWord = '';

//Pour chaque mot, on récupère le mot ayant la plus petit longueur de levenshtein que ce soit en phonétique ou textuelle.
foreach($lst_word as $word){
$metaphoneKeys[$word] = metaphone($word);
if($metaphoneKeys[$word] == $faultMetaphone){
return $word;
}

//Longueur de levenshtein phonétique
if(!$levenshtein || $levenshtein > levenshtein($metaphoneKeys[$word], $faultMetaphone)){
$proximityWord = $word;
$levenshtein = levenshtein($metaphoneKeys[$word], $faultMetaphone);
}

//Longueur de levenshtein textuelle
if(!$levenshtein || $levenshtein > levenshtein($word, $faultMetaphone)){
$proximityWord = $word;
$levenshtein = levenshtein($word, $faultMetaphone);
}
}
return $proximityWord;
}



Voilà, j'espère avoir été assez clair dans mes explications, n'hésitez pas si vous avez des questions. C'est un traitement un peu lourd, et il y a surement moyen de l'optimiser malheureusement, je n'ai pas eu le temps de m'attarder sur son optimisation.

Bon courage à tous.

Matthieu
 
L'administrateur a désactivé l'accès public en écriture.
#55108
easypara
Expert Boarder
Messages: 136
graphgraph
Personne n'est hors ligne Cliquez ici pour voir le profil de cet utilisateur

Re:[TUTO] Correcteur orthographique

Il y a 6 Années, 4 Mois
Karma: 1  
Bien pratique, ajouté aux favoris ;)
 
L'administrateur a désactivé l'accès public en écriture.
Revenir en hautPage: 1
Modérateur: Gabriiiel, ILOA, zuiko