[Script] - "Essayer avec cette orthographe"

WRInaute discret
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:
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);
}
 
WRInaute occasionnel
raspoutine59 a dit:
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:
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?
 
WRInaute discret
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.
 
WRInaute discret
e-kiwi a dit:
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.
 
WRInaute discret
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.
 
WRInaute discret
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)
 
WRInaute discret
pistonocus a dit:
Comment tu fais pour les alertes?

ben, toutes les nuits, je regarde si les requetes pour lesquels des gens se sont inscrits donnent des resultats

si c'est le cas, j'envois un mail aux inscrits pour le leur dire
et je les vide de la table des inscrits :)
 
Discussions similaires
Haut