web 2.0

Seebz.net

Créer un nuage de mots clés

Le nuage de mots clés (tag cloud en anglais) est une façon de représenter visuellement les mots clés utilisés dans un site.
En général, les mots clés sont affichés avec un taille proportionnelle au nombre de fois où le mot clé est utilisé, les mots clés utilisés le plus souvent sont alors affichés en plus grand que les mots clés moins utilisés.

Cet article va vous permettre de créer un nuage de mots similaire à celui utilisé sur ce site.

Cet article ne s'applique qu'à la génération du nuage de mots clés, nous ne verrons donc pas ici la partie administration qui permet de lier un mot clé à un article. (ce sera l'objet d'un article futur)

La base de données

Pour réaliser notre nuage, nous aurons besoin d'au moin 3 tables :

  • une table 'articles' qui contiendra les articles
  • une table 'tags' qui contiendra les mots clés
  • une table intermédiaire 'articles_tags' qui lie les tags aux articles

La table articles :
Vous y mettrez les champs que vous voulez, seul contrainte il faudra impérativement qu'elle ai un champs id.

La table tags :
Cette table contient 3 champs : id, tag (le mot clé) et url (le mot clé épuré de caractères spéciaux).
Un mot clé ne sera présent qu'un seule fois dans cette table, même si utilisé pour plusieurs articles.

La table articles_tags :
Cette table contiendra 2 champs : article_id et tag_id.

Le fonctionnement

On commence par définir quelques paramètres :

// Nombre d'utilisation minimum pour être listé
$min_count = 1;

// Font-size (en %) du tag le moins utilisé
$min_size = 100;

// Font-size (en %) du tag le plus utilisé
$max_size = 200;

// Contiendra le nombre d'utilisation minimum d'un tag (on l'initialise en mettant un grand nombre)
$min = 100000;

// Contiendra le nombre d'utilisation maximum d'un tag
$max = 0;

On récupère ensuite tous les mots clés ainsi que le nombre de fois où ils sont utilisé :

$sql = "
SELECT DISTINCT t.tag, t.url, COUNT(at.tag_id) AS counter
FROM tags t
LEFT JOIN articles_tags at 
	ON at.tag_id = t.id
	GROUP BY at.tag_id
ORDER BY t.tag
";
$result = mysql_query($sql);

On met les tags dans un tableau et on en profite pour trouver le nombre d'utilisation minimum et maximum :

while ($row = mysql_fetch_assoc($result)) {
	if($row['counter'] >= $min_count) {
		$tags[$row['url']] = $row;
		if($row['counter'] < $min) $min = $row['counter'];
		if($row['counter'] > $max) $max = $row['counter'];
	}
}

Ensuite, il faut connaitre la différence de taille pour une utilisation d'un mot clé (j'entends par la différence de taille entre un tag utilisé une fois et un autre utilisé deux fois) :

// Espacement entre Min & Max
$spread = $max-$min;
if ($spread == 0) $spread = 1;    // Evite la division par zéro

// Espacement pour 1
$step = ($max_size - $min_size)/$spread;

Ceci fait, nous pouvons afficher notre nuage de mot clés en affichant les mots clés avec une taille proportionnelle à leur nombre d'utilisation :

// Boucle sur les tags
$out = '';
foreach ($tags as $tag) {
	$size = $min_size + (($tag['counter']-$min) * $step);
	$size = round($size);
	$style = 'style="font-size:'.$size.'%;"';

	$out .= '<a href="'.$tag['url'].'" '.$style.'>';
	$out .= $tag['tag'];
	$out .= '</a>' . "n";
}

// Affichage du nuage de tags
echo $out;

Le script complet

Pour vous faciliter le copier-coller, vous trouverez ci-dessous le script complet et commenté :

// Divers Paramètres

// Nombre d'utilisation minimum pour être listé
$min_count = 1;

// Font-size (en %) du tag le moins utilisé
$min_size = 100;

// Font-size (en %) du tag le plus utilisé
$max_size = 200;

// Contiendra le nombre d'utilisation minimum d'un tag (on l'initialise en mettant un grand nombre)
$min = 100000;

// Contiendra le nombre d'utilisation maximum d'un tag
$max = 0;



// Requête SQL
$sql = "
SELECT DISTINCT t.tag, t.url, COUNT(at.tag_id) AS counter
FROM tags t
LEFT JOIN articles_tags at 
	ON at.tag_id = t.id
	GROUP BY at.tag_id
ORDER BY t.tag
";
$result = mysql_query($sql);



// Mise en tableau des tags et recherche de min et max
while ($row = mysql_fetch_assoc($result)) {
	if($row['counter'] >= $min_count) {
		$tags[$row['url']] = $row;
		if($row['counter'] < $min) $min = $row['counter'];
		if($row['counter'] > $max) $max = $row['counter'];
	}
}



// Calcul de l'espacement (taille)

// Espacement entre Min & Max
$spread = $max-$min;
if ($spread == 0) $spread = 1;    // Evite la division par zéro

// Espacement pour 1
$step = ($max_size - $min_size)/$spread;



// Affichage

// Boucle sur les tags
$out = '';
foreach ($tags as $tag) {
	$size = $min_size + (($tag['counter']-$min) * $step);
	$size = round($size);
	$style = 'style="font-size:'.$size.'%;"';

	$out .= '<a href="'.$tag['url'].'" '.$style.'>';
	$out .= $tag['tag'];
	$out .= '</a>' . "n";
}

// Affichage du nuage de tags
echo $out;

Cet article n'a pas été le plus facile à rédiger et certaine partie du script risque de ne pas être très claire, je vous invite donc à poser vos questions par commentaire et comme toujours, je me ferais un plaisir de vous répondre

Partager : Share
 

7 Réponses à “Créer un nuage de mots clés”

  1. C'est bien d'expliquer, mais pour les novices, ils manquent des exemples concrets.
    Comment et ou mettre les mots. liens, tags, etc....

  2. julien> Le script à besoin d'une db comme expliquer

    Sinon très bon tutoriel, claire et simple comme le visuel du site d'ailleurs.

    Je regrette juste que tu n'est pas de newsletter par mail pour te suivre.

  3. Merci pour ton commentaire kitten ;)

    Je n'ai effectivement pas prévu de commentaire mais comme tu peux le constater, je publie de façon aléatoire mais en général les articles intéressants ressortent relativement bien dans google.

    A+

  4. Je comprend pas, la table "articles" n'apparait dans ton script.
    J'ai une table articles pour mon site, avec un champ "mots_clef".
    J'aimerai utiliser se champ pour mon nuage de mots clef, mais je vois pas bien comment aller les chercher.

  5. Ajorr: je n'utilise pas la table article car elle n'est pas nécessaire pour générer le nuage de tags vu qu'on travaille directement avec la table de jointure.

    Je l'ai nommé sinon on aurait pas compris l'interet d'avoir des tags liés à rien.

    Pour ton champ 'mots_clef', tu peux essayer de tous les récupérer et de les mettre dans un tableaux php en comptant le nombre de fois où il sont utilisé.. .

  6. Très bon article, qui explique vraiment bien le principe, et la façon de faire un tag cloud ! Même plus d'un an plus tard, ca sert toujours :D

    Merci !

  7. J'ai testé et ça marche. J'aurais juste aimé pouvoir créer des mots-clés à partir d'un champ de la table article.

    Merci beaucoup

Poster un commentaire

Remonter