[RESOLU] Tag cloud => Méthode originale

WRInaute occasionnel
Bonjour, j'aurais besoin d'un coup de main.

Je veux créer un tag cloud maison, parce que je ne trouve pas ce que je veux sur le Web.

Voici mon idée. Bcp de webmaster vu les sources trouvées accumulent dans une BDD à 2 champs les requêtes des recherches (clé primaire + tag), ce qui peut faire des miliers d'enregistrement dans la BDD.
Ensuite il faut créer un index et regrouper les mots similaires par un GROUP BY

J'essaie de faire autrement.

Voici ma table :
id_tag //clé primaire
tag //les mots clé ou expressions clé UNIQUES selon si recherche "tous les mots", "un mot" ou "expression exacte"
popularite //nombre d'occurences des recherches pour chaque mot ou expression uniques

Je sais pas si c'est clair. Plutôt que d'enregistrer 10 fois le même mot, je l'enregistre 1 seule fois avec une popularité de 10.
Ça évite de charger la BDD, c'est une gestion des enregistrements faite en amont en PHP.

Bon déjà je suis ouvert aux avis sur la méthode, au départ, plutôt que sur une autre.


Voilà maintenant mon pb. Je n'arrive pas à faire une requête SQL qui me permette de sélectionner les X tags les plus populaires, avec un affichage aléatoire de ces tags.
J'ai aussi besoin de recupérer le cumul de popularité (somme des champs popularité) pour les occurences sélectionnées par la requête.
Ainsi avec une règle de trois, je pourrais déterminé un ratio, qui va déterminer la taille et la couleur d'affichage du tag dans le nuage.

J'espère être clair. Cette requête est surement pas très compliquée, mais je sèche bêtement.

Merci
 
WRInaute passionné
Quelque chose comme ça?
(jamais testé une chose pareille)
Code:
SELECT * FROM
( SELECT *
FROM taTable
ORDER BY popularite
LIMIT 0,X)
ORDER BY RAND()
 
WRInaute occasionnel
Salut, merci.

Non à priori ce n'est pas ça, j'ai plein d'erreurs SQL, et en bidouillant, je ne trouve pas la bone soluce.

Je continue à chercher, et coups de main bienvenue. J'aimerais aussi savoir ce que vous pensez de cette méthode de stockage dans la BDD plutôt que ce qu'on trouve en général
 
WRInaute accro
Bonsoir

As-tu essayé un truc du style

Code:
SELECT champs1, champs2, ..., RAND() AS ChampsOrdre
FROM Table
ORDER BY ChampsOrdre ASC
LIMIT 0,x

J'ai pu la syntaxe en tête, mais en clair tu génères pour chaque enregistrement un nombre aléatoire dans un champs bidon, puis tu ordonnes ta table avec ce champs :wink:

Autre soluce plus "arrache" :
1°) Requête des x tags les plus populaires, que tu claques dans un tableau
2°) Mélange du tableau avant affichage (algorithme simplissime avec 1 boucle sur le nombre d'éléments et une inversion de deux éléments pris au hasard : pas besoin d'être "carré" algorithmiquement parlant avec ce genre de besoin :twisted: )
 
WRInaute occasionnel
Salut,

Je ne trouve aucune référence par rapport à cette syntaxe, je vois pas comment faire.

J'aimerais le faire en SQL, pas en php, mais je ne sais pas si c'est possible.

Je suis dessus depuis plusieurs heures, ça me gonfle.

Merci de votre aide.
 
WRInaute passionné
En PHP ça se fait très facilement c'est vrai.

Sinon ta solution est pas mal, mais va demander plus de requêtes pour l'ajout (un test pour voir si ça existe déjà, si oui une update, sinon insert) non?
 
WRInaute occasionnel
Oui, test, si TRUE update, si false, INSERT

En plus, comme il y a explode des mots clefs, on boucle sur le nombre de mots clefs une fois virés les mots de 2 lettres et moins

Ça fait plus de requêtes oui, mais elles sont simplicimes sur une base assez limitée par cette méthode.

En fait tu choisi entre te couper un bras ou te couper une main. Je pense que c'est mieux que d'avoir des miliers de fois le même mot enregistré dans une BDD, avec un index.
Sinon, à la longue, ce serait beaucoup plus lourd, et les requêtes d'affichage du nuage sont lancées à chaque impression de page, souvent depuis la home, alors qu'avec ma méthode, tout le monde ne passe pas par la recherche par mot clé.

Ma requête de base serait :
Code:
$tagresult = mysql_query("SELECT tag, popularite, SUM(popularite) AS total FROM tag_cloud GROUP BY id_tag ORDER BY RAND() LIMIT $LIM ") or die(mysql_error());

Affichage aléatoire sans soucis. Par contre, il me manque deux choses que je n'arrive pas à trouver :

- Récupérer seulement les X tags les plus populaires (je ne vais pas afficher les tags qui ont été joués une seule fois il y a des mois)
- Calculer la somme des popularités pour les tags retenus par la requête. En l'état, ça ne fonctionne pas.

Merci
 
WRInaute accro
cedric_g a dit:
Mélange du tableau avant affichage (algorithme simplissime avec 1 boucle sur le nombre d'éléments et une inversion de deux éléments pris au hasard : pas besoin d'être "carré" algorithmiquement parlant avec ce genre de besoin :twisted: )
ou même sans algo, avec la fonction shuffle()
 
WRInaute occasionnel
Bon, pas trouvé en SQL.

Par contre, j'y suis arrivé avec shuffle(), un grand merci donc !

Voici la solution :

Code:
$LIM = "35";
$tagresult = mysql_query("SELECT tag, popularite FROM tag_cloud WHERE lang = '$lang' ORDER BY popularite DESC LIMIT $LIM ") or die(mysql_error());

function rand_hexcolor() //Défini une couleur hexadécimal de manière aléatoire (fonction pas moi)
{
$color = dechex(mt_rand(0,16777215));
$color = str_pad($color,6,'0');
return $color;
} 

$MIN_SIZE = "9";
$MAX_SIZE = "36";

print("<div class=\"tag\"><img src=\"$DOMAINE/images/graphisme/$lang/tag_cloud.gif\" alt=\"Nuage de mots clefs Tag cloud\"><br>");

$num = 0;
while ($tag = mysql_fetch_array($tagresult)) {

 $mot[$num] = $tag['tag'];
 $popularite[$num] = $tag['popularite'];
 
 $mix[$num] = array(mot => $mot[$num], pop => $popularite[$num]);
 
 $total += $popularite[$num];
 $num++;
}

	shuffle($mix);
	foreach ($mix as $motcle) {
	$motclemot  = $motcle[mot];
	$motclepop = $motcle[pop];
	
	$size = $motclepop/$total*300;
	$size = round($size, 0);
	if ( $size < $MIN_SIZE ) { $size = $MIN_SIZE; }
	if ( $size > $MAX_SIZE ) { $size = $MAX_SIZE; }
	
	$colo = rand_hexcolor();
	$mot_cherche = eregi_replace(" ", "+", $motclemot);
	echo "<a href=\"$DOMAINE/rechercher,camping-en-france.php?lang=$lang&search=".$mot_cherche."&mode=expression_exacte&Submit=Chercher&position=0\" style=\"font-size: ".$size."px; color: #".strtoupper($colo).";\" title=\"tag\">$motclemot</a>  ";
	}

print("</div>");

Voilà il reste à régler la mise en forme des tags, avec dimensionnement des polices et choix des couleurs.

Merci de votre aide, j'espère que ce bout de code pourra éviter une perte de temps importante pour ceux qui veulent créer un nuage de mots.

Si vous avez des remarques.

A+
 
WRInaute occasionnel
C'est terminé, pour ceux qui veulent voir le résultat sur la home de mon www.

Regardez dans les 2 langues, FR et EN. J'ai du ajouter dans la BDD un champ lang pour permettre cela.

Si quelqu'un veut des explications pour faire la même chose, avec cette méthode.

Merci de votre aide encore.

A+
 
Discussions similaires
Haut