Page 1 sur 1

Moteur de recherche et comparaison.

Posté : 02 sept. 2006, 15:23
par blubsy
Bonjour, je suis entrain de créer un moteur de recherche utilisant un formulaire input texte pour taper le nom d'une ville.
Mais voila si l'utilisateur fait une faute ou modifi un peu l'orthographe de la ville j'aimerais pouvoir lui proposer des solutions ce raprochant de sa demande.

A part faire un algorythme très complexe testant les lettres une par une je ne vois pas trop comment faire.

Merci pour votre aide et vos conseils.

Posté : 02 sept. 2006, 17:14
par Hubert Roksor
Je pense que tu obtiendras le meilleur rapport entre le développement requis et le résultat obtenu en utilisant la fonction metaphone() de PHP. Par exemple, voici un exemple 'une fonction qui crée un hash à partir d'un mot. Ce hash (un entier non-signé qui ne dépasse pas 2^31, destiné à être stocké dans un champs SQL INT) correspond à la phonetique des 6 premières syllabes.
/**
* Generate the metaphone hash of a word
*
* @param	string	$word		The word
* @return	integer				The hash
*/
function metaphone_hash($word)
{
	static $val_ary = array(
		'0'	=>	array(5153632,   234256,  10648,  484,   22,  1),
		'A'	=>	array(10307264,  468512,  21296,  968,   44,  2),
		'B'	=>	array(15460896,  702768,  31944,  1452,  66,  3),
		'E'	=>	array(20614528,  937024,  42592,  1936,  88,  4),
		'F'	=>	array(25768160,  1171280, 53240,  2420,  110, 5),
		'H'	=>	array(30921792,  1405536, 63888,  2904,  132, 6),
		'I'	=>	array(36075424,  1639792, 74536,  3388,  154, 7),
		'J'	=>	array(41229056,  1874048, 85184,  3872,  176, 8),
		'K'	=>	array(46382688,  2108304, 95832,  4356,  198, 9),
		'L'	=>	array(51536320,  2342560, 106480, 4840,  220, 10),
		'M'	=>	array(56689952,  2576816, 117128, 5324,  242, 11),
		'N'	=>	array(61843584,  2811072, 127776, 5808,  264, 12),
		'O'	=>	array(66997216,  3045328, 138424, 6292,  286, 13),
		'P'	=>	array(72150848,  3279584, 149072, 6776,  308, 14),
		'R'	=>	array(77304480,  3513840, 159720, 7260,  330, 15),
		'S'	=>	array(82458112,  3748096, 170368, 7744,  352, 16),
		'T'	=>	array(87611744,  3982352, 181016, 8228,  374, 17),
		'U'	=>	array(92765376,  4216608, 191664, 8712,  396, 18),
		'W'	=>	array(97919008,  4450864, 202312, 9196,  418, 19),
		'X'	=>	array(103072640, 4685120, 212960, 9680,  440, 20),
		'Y'	=>	array(108226272, 4919376, 223608, 10164, 462, 21)
	);

	$val = 0;
	foreach (str_split(metaphone($word, 6), 1) as $i => $c)
	{
		$val += $val_ary[$c][$i];
	}

	return $val;
}
Pour chaque ville tu stockes le hash correspondant dans un champs indexé, puis si tu cherches les noms s'approchant de ce qu'a entré l'utilisateur ta requête ressemble à
$sql = 'SELECT * FROM villes WHERE ville_hash = ' . metaphone_hash($ville);

Posté : 02 sept. 2006, 18:12
par blubsy
Ok merci bc je vais testé tous ça.

@+

Posté : 05 sept. 2006, 11:29
par ant
Y a mieux avec l'algo de levenshtein mais présuppose des temps de calculs bcp plus importants.

Parcequ'avec metaphone c'est quand meme pas trés fiable. (vu qu'il prend en compte que la prononciation anglaise donc bcp de phonèmes francais passent à la trappe...)

http://www.php.net/manual/fr/function.levenshtein.php