Moteur de recherche et comparaison.

Eléphanteau du PHP | 47 Messages

02 sept. 2006, 15:23

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.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

02 sept. 2006, 17:14

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);

Eléphanteau du PHP | 47 Messages

02 sept. 2006, 18:12

Ok merci bc je vais testé tous ça.

@+

ant
Eléphant du PHP | 161 Messages

05 sept. 2006, 11:29

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