[Script] - "Essayer avec cette orthographe"

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics

raspoutine59
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 210
Inscription: Jeu Mar 17, 2005 19:25

[Script] - "Essayer avec cette orthographe"

Message le Ven Juin 03, 2005 15:19

Bonjour,

Lors de la création de ma page de recherche utilisant l'API Google, j'ai ajouté cette fonctionnalité qui propose à mes visiteurs d'essayer une nouvelle recherche avec une orthographe, si la précédente n'a donné aucun résultat (Généralement du aux fautes).

Comment ça marche ? La recherche s'appuie sur l'algorithme de Levenshtein. Elle recherche et compare deux chaînes et renvoie les occurences trouvé dans un tableau.

$keyword = Le mots clé qui à rien donné
$table = Le nom de la table MySQL ou ce trouve les mots à comparer et a proposer (Donc mon cas la table en question correspond à un historique des recherches, mais ça pourrait carrement être un dictionnaire...)

$fields = Array('champs1') doit correspondre aux champs dans lesquelles faire la recherche

$Key = correspond à un champ ID

$treeshold = doit correspondre à la taille divisé par 2 de $keywords si $keywords >=6


Code: Tout sélectionner
function search_keyword($keyword,$table,$fields,$key,$threshold){

if (!$threshold)
   if (strlen($keyword)<6) $threshold=round(strlen($keyword)/2);
   else $threshold=3;


$keyword=strtolower($keyword);
$res=mysql_query("SELECT * FROM ".$table);

      while ($item=mysql_fetch_object($res))
         foreach ($fields as $field)
         {
            $words=explode(" ",$item->$field);
            foreach ($words as $word)
               if (levenshtein($keyword, strtolower($word)) < $threshold)          
               {
                  $result[]=array($item->$key,$field,$item->$field);
                  break;
               }
         }

      if (!is_array($result)) return (false);
      else return ($result);
}
Dernière édition par raspoutine59 le Ven Juin 03, 2005 15:25, édité 1 fois.


dmathieu
Modérateur
Modérateur
 
Messages: 6910
Inscription: Ven Jan 09, 2004 16:21

Message le Ven Juin 03, 2005 15:23

le [size=7] a foiré :)
c'etait pour qu'on voit mieux le code ??

raspoutine59
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 210
Inscription: Jeu Mar 17, 2005 19:25

Message le Ven Juin 03, 2005 15:25

Non c'est pour faire jolie...


Patrice A.
Modérateur
Modérateur
 
Messages: 2413
Inscription: Ven Fév 11, 2005 19:36

Message le Ven Juin 03, 2005 15:29

hmmm ça a l'air bien ça...
je testerai ça sur mon moteur


pistonocus
WRInaute impliqué
WRInaute impliqué
 
Messages: 370
Inscription: Ven Mar 25, 2005 23:19

Re: [Script] - "Essayer avec cette orthographe"

Message le Ven Juin 03, 2005 15:45

raspoutine59 a écrit:Bonjour,

Lors de la création de ma page de recherche utilisant l'API Google, j'ai ajouté cette fonctionnalité qui propose à mes visiteurs d'essayer une nouvelle recherche avec une orthographe, si la précédente n'a donné aucun résultat (Généralement du aux fautes).

Comment ça marche ? La recherche s'appuie sur l'algorithme de Levenshtein. Elle recherche et compare deux chaînes et renvoie les occurences trouvé dans un tableau.

$keyword = Le mots clé qui à rien donné
$table = Le nom de la table MySQL ou ce trouve les mots à comparer et a proposer (Donc mon cas la table en question correspond à un historique des recherches, mais ça pourrait carrement être un dictionnaire...)

$fields = Array('champs1') doit correspondre aux champs dans lesquelles faire la recherche

$Key = correspond à un champ ID

$treeshold = doit correspondre à la taille divisé par 2 de $keywords si $keywords >=6


Code: Tout sélectionner
function search_keyword($keyword,$table,$fields,$key,$threshold){

if (!$threshold)
   if (strlen($keyword)<6) $threshold=round(strlen($keyword)/2);
   else $threshold=3;


$keyword=strtolower($keyword);
$res=mysql_query("SELECT * FROM ".$table);

      while ($item=mysql_fetch_object($res))
         foreach ($fields as $field)
         {
            $words=explode(" ",$item->$field);
            foreach ($words as $word)
               if (levenshtein($keyword, strtolower($word)) < $threshold)          
               {
                  $result[]=array($item->$key,$field,$item->$field);
                  break;
               }
         }

      if (!is_array($result)) return (false);
      else return ($result);
}


c'est vrai que cette fonction elle est pas mal, il ne faut pas tomber sur les suggestions à la Google, euh, il apprend tout seul au fur et à mesure ou il faut rajouter dans la base de données manuellement?


e-kiwi
Modérateur
Modérateur
 
Messages: 13817
Inscription: Mar Déc 23, 2003 9:04

Message le Ven Juin 03, 2005 15:47

c'est un clone de similar_text() :-)

raspoutine59
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 210
Inscription: Jeu Mar 17, 2005 19:25

Message le Ven Juin 03, 2005 15:48

Bah dans mon cas j'enregistre un historique des recherches depuis plus de deux ans, donc toutes les recherches tapé depuis ce lapse de temps (Keywords + hits) sont dans ma table.

Donc le mieux c'est de faire pareille et il proposera une autre orthographe en fonction de ton historique. De cette façon tous les mots vraiment important du site y sont, ni plus ni moins. Ca t'évite de mettre tous le dico et d'avoir des mots "hors-sujet".

Bon apres tu peux en ajouter manuellement pour avoir une base de depart si tu n'a rien.


e-kiwi
Modérateur
Modérateur
 
Messages: 13817
Inscription: Mar Déc 23, 2003 9:04

Message le Ven Juin 03, 2005 15:50


raspoutine59
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 210
Inscription: Jeu Mar 17, 2005 19:25

Message le Ven Juin 03, 2005 15:50

e-kiwi a écrit:c'est un clone de similar_text() :-)


Ca n'a absoluement rien à voir. Il te suffit de lire la doc PHP...

similar_text calcule la similarité entre les deux chaînes first et second , selon la méthode d'Oliver [1993].


levenshtein calcule la distance Levenshtein entre deux chaînes de caractères. Elle retournera -1 si l'un des deux arguments contient plus de 255 caractères.

La distance Levenshtein est définie comme le nombre minimal de caractères qu'il faut remplacer, insérer ou modifier pour transformer la chaîne str1 en str2 . La complexité de l'algorithme est en O(m*n) , où n et m sont les tailles respectives de str1 et str2 : c'est plutôt bien, en comparaison de similar_text , qui est en O(max(n,m)**3) , mais cela reste très coûteux.

raspoutine59
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 210
Inscription: Jeu Mar 17, 2005 19:25

Message le Ven Juin 03, 2005 15:51

e-kiwi a écrit:http://www.unixtech.be/docs/php-fr/ref.pspell.html


Oué faut-il encore que tu puisse installer les libs...


e-kiwi
Modérateur
Modérateur
 
Messages: 13817
Inscription: Mar Déc 23, 2003 9:04

Message le Ven Juin 03, 2005 15:53

ben vu les ressources de ses fonctions, ca marchera pas longtemps sur un mutualisé

raspoutine59
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 210
Inscription: Jeu Mar 17, 2005 19:25

Message le Ven Juin 03, 2005 15:54

C'est pour une utilisation sur les recherches hein et encore sur les recherches qui n'ont rien donné et c'est pas la page la plus utilisé sur un site web.


e-kiwi
Modérateur
Modérateur
 
Messages: 13817
Inscription: Mar Déc 23, 2003 9:04

Message le Ven Juin 03, 2005 15:55

ben aspell tu peux générer la liste

raspoutine59
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 210
Inscription: Jeu Mar 17, 2005 19:25

Message le Ven Juin 03, 2005 15:56

Bah j'doute pas de la performance de cette lib, mais bon faut pouvoir l'installer, faut savoir l'installer (tous ne sont pas des administrateur de serveur web) et puis faut avoir le temps de l'installer (quand il suffit de copier/coller dix lignes de code PHP pour une fonctionnalité minime, ça donne pas très envie)


ysimon
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 144
Inscription: Mar Fév 24, 2004 14:07

Re: [Script] - "Essayer avec cette orthographe"

Message le Ven Juin 03, 2005 16:51

Salut

j'ai mis en place un truc similaire sur RDC
exemple

http://search.rueducommerce.fr/shared/recherche/index.cfm?requete=minotla


je te conseille juste 2,3 petits trucs :

- considere qu'il y a peu de chances que la premiere lettre soit fausse

- considere aussi que ca ne sert à rien de comparer des mots dont la longueur est franchement différente

voilou :)

[Script] - "Essayer avec cette orthographe"

Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par Julien Coquet, expert certifié officiellement par Google Analytics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités