Another teacher’s website

  http://bit.ly/aSlTPl copy to clipboard + http://bit.ly/aSlTPl RSS

Nuage de mots-clés

Nuage de mots-clés

sans boucle de comptage, avec le plugin CFG

par SteF, le 16 février 2009 (maj 30 octobre 2010) BY-SA
6 commentaires

Donnez votre avis
7 votes

Sommaire

Egalement sur Spip-contrib.

Il y a quelques jours j’ai proposé sur spip-contrib la boucle qui me permettait d’afficher le nuage sur ce site : Nuage de mots-clés tout en SPIP.

Ecrite uniquement en SPIP et avec une structure html très simple, elle présentait l’avantage d’être très facilement intégrable à un squelette et à son habillage, et également d’être intégralement mise en cache entre les recalculs.

Mais comme on me l’a fait très judicieusement remarquer, c’est par contre au moment du recalcul qu’elle n’est pas vraiment économique puisqu’elle compte tous les éléments associés à chaque mot-clé, et pour un site avec beaucoup d’éléments et beaucoup de mots-clés, ça représente beaucoup de requêtes sql et beaucoup de calculs.

Il fallait donc trouver une solution pour répartir la charge de travail dans le temps, et si possible ré-utiliser les calculs faits à d’autres endroits dans le site.

C’est chose faite avec la version présentée ici. Le nuage à l’arrivée est absolument identique.

Principe

En fait, la boucle a besoin pour fonctionner :

  • de connaître le score de chaque mot, calculé en fonction du nombre d’éléments qui lui sont associés (articles, rubriques et sites)
  • de connaître les scores minimums et maximums pour calculer le coefficient qui permettra de calculer la taille de chaque mot en fonction de son score.

Dans la première version présentée sur spip-contrib, le calcul du nuage reposait sur deux boucles :

  • une boucle de comptage qui calcule tous les scores et extrait les extrêmes
  • une boucle d’affichage qui génère la liste de mots et style chacun en fonction des valeurs calculées par la première boucle.

Dans cette version, la boucle de comptage est supprimée, on récupère à la place le résultat des comptages déjà effectués pour l’affichage des pages associées aux mots-clés (squelette mot.html).

Pour ce faire, il suffit de dire au squelette mot.html que, chaque fois qu’il recalcule la page d’un mot donné, au passage il mette de côté le nombre d’éléments associés à ce mot, tant qu’il y est vu qu’il les compte de toutes façons.

Pour pouvoir réutiliser ce score dans le squelette du nuage, complètement indépendamment du squelette mots, j’ai utilisé les fonctions du plugin CFG qui permettent de stocker des variables dans la base de données et de les récupérer ensuite.

La boucle du squelette nuage se contente ensuite de récupérer les scores, de calculer la taille et d’afficher les mots, mais elle ne compte rien d’autre que les mots. Le calcul des scores, quant à lui, est réparti entre les recalculs des différentes pages du squelette mots, le travail est donc bien réparti de manière asynchrone dans le temps puisque chacune de ces pages a une durée de vie propre dans le cache.

Il est bien sûr nécessaire d’avoir installé et activé le plugin CFG.

Lire aussi
- Références du plugin CFG sur Spip-Contrib

Ajouts dans le squelette mots

Dans tout squelette mot bien constitué, on trouve normalement une boucle qui compte les éléments associés au mot du contexte, et qui ressemblera plus ou moins à ça :

Cette boucle génère une liste non-ordonnée des articles associés au mot portant l’id_mot du contexte (en général celui de la boucle englobante mot_principal dont l’id est récupéré dans l’URL).

De la même manière on trouvera des boucles pour lister les rubriques et les sites associés à ce mot.

Il faut récupérer le total de chacune de ces boucles et le traiter pour le transformer en score.

Stockage de chaque total dans une variable

En se servant de la balise #SET{variable,valeur}, on stocke la balise #GRAND_TOTAL de chaque boucle (ou #TOTAL_BOUCLE si les résultats ne sont pas paginés).

Notez que la balise #SET doit se trouver hors de la boucle qu’elle compte (pour ne pas être itérée), mais dans la partie optionnelle après pour pouvoir récupérer la balise de comptage : soit entre </BOUCLE_xxx> et </B_xxx>.

Traitement des variables : calcul et stockage du score

Pour calculer et stocker le score de chaque mot, on utilise une fonction php (à ajouter au fichier mes_fonctions.php qu’il faut créer au besoin si aucune fonction n’est déjà définie)

On envoie le résultat à la fonction nuage_score() en ajoutant dans le squelette mot.html la balise suivante, après les boucles présentées plus haut :

Voici la fonction nuage_score()à ajouter à mes_fonctions.php :

Le score est calculé de la manière suivante :

  • 2 points sont donnés pour chaque rubrique associée à ce mot clé,
  • 1 point pour chaque article associé et
  • 1/4 de point pour chaque site associé.

Remarques
Ces valeurs sont complètement arbitraires et peuvent bien évidemment être modifiées.

Le calcul du score de chaque mot utilise les boucles du squelette mot.html correspondant, et n’est pas recalculé tant que ces pages ne sont pas mises à jour. Si par exemple la page d’un mot-clé n’est jamais affichée, le score de ce mot-clé n’est pas mis à jour non plus. Par contre, chaque fois qu’une page du squelette mot.html est recalculée, le nuage est mis à jour sur l’ensemble des pages où il est affiché, à condition de bien utiliser des inclusions indépendantes (sans le #).

Affichage du nuage

La structure de base du nuage est minimaliste, il s’agit d’une simple liste non ordonnée des mots-clés.

La taille de chaque mot clé est définie par un peu de css en ligne, soit pour chaque ligne :

On peut pour chaque mot récupérer le score qui est enregistré dans la base de données. Néanmoins, pour calculer la taille on ne peut appliquer un coefficient fixe. En effet, si on souhaite que le mot ayant le score le plus bas et celui ayant le score maximum aient toujours la même taille, quels que soient leurs scores, il faudra tenir compte de ces valeurs pour calculer le coefficient qui servira à calculer la taille en fonction du score.

Au début de la boucle, on récupère les valeurs min et max qu’on stocke dans des variables SPIP :

On récupère le score de chaque mot avec la balise #CONFIG{nuage/scores/#ID_MOT}

Pour calculer la taille de chaque mot, on filtre le score en transmettant les valeurs min et max à une nouvelle fonction.

Balise d’affichage de la taille :

La fonction nuage_taille() est également à ajouter au fichier mes_fonctions.php

Note - on ajoute 0.01 au dénominateur dans le calcul de l’écart-type pour éviter une division par zéro lors du premier calcul du nuage ou dans le cas très improbable ou le score minimum soit égal au score maximum — merci à Bruno Renaglia pour le tuyau.

Ce qui donne pour le fichier inc-nuage.html

Personnalisation du nuage

CSS
On peut faire passer une classe en paramètres à l’appel de l’inclusion du squelette pour appliquer des attributs css aux balises de la boucle. Ou plus simplement en stylant à partir de l’élément parent. On peut donc afficher le même fichier inclus dans différents contextes avec différents rendus.

Paramètres du score
Les valeurs des éléments associés aux mots-clés sont définies dans la fonction nuage_score()

Ces valeurs numériques peuvent être changées, ou rendues paramétrables dans l’espace privé à partir d’un formulaire CFG.

Paramètres de la taille
Les valeurs de base de la taille d’affichage des mots-clés en fonction de leur score sont définies dans la fonction nuage_taille()

La base représente la taille du plus petit mot-clé, l’écart ce qui la sépare de la taille du plus grand. Ces valeurs numériques peuvent être changées, ou rendues paramétrables dans l’espace privé à partir d’un formulaire CFG.

Tri des mots-clés

Par défaut, aucun critère n’est précisé pour définir l’ordre d’affichage des mots clés ou en exclure certains, on peut bien sûr en ajouter.

  • <BOUCLE_lesmots (MOTS){par type, titre}> pour classer les mots par groupe et alphabétiquement dans chaque groupe.
  • <BOUCLE_lesmots (MOTS){type!==^_}> est très pratique : tous les mots provenant de groupes dont le nom commence par un underscore « _ » sont exclus. Si on utilise des mots-clés non sémantiques qu’on souhaite exclure du nuage, il suffit de les placer dans un groupe dont le nom commence par « _ », par exemple « _administration ».

Paramétrage avec un formulaire CFG

Les paramètres de calcul du score, ainsi que ceux de l’affichage, peuvent être paramétrés dans le fichier mes_fonctions.php. Ils peuvent également être modifiés dans l’espace privé au moyen d’un formulaire CFG, qui stockera les valeurs choisies dans la base de données.

Mise en place du formulaire
Enregistrer dans le dossier fonds du squelette ou du dossier plugins/cfg le fichier cfg_nuage.html

On accède ensuite au formulaire par l’espace privé.

Récupération des valeurs du formulaire

La fonction nuage_score() peut désormais récupérer les valeurs saisies dans le formulaire plutôt que des valeurs fixes.

Les paramètres base et écart sont communs à tous les mots du nuage, on les récupèrera donc une seule fois avant le début de la boucle, et on les passe en paramètres à la boucle nuage_taille en même temps que le minimum et le maximum.

Le squelette inc-nuage.html doit donc être modifié comme ceci :

Et la fonction nuage_taille() doit également être modifiée pour utiliser les variables qu’on lui fait passer :

Help wanted

Je ne comprends pas grand chose à ce qui se passe sous le capot de spip, et je n’ai aucune certitude quant au bien-fondé de certains choix que j’ai dû faire. Il doit y avoir très très moyen d’optimiser l’écriture des scores et des paramètres dans la base de données, et je suis preneur de toute indication et de tout conseil sur ce sujet. Merci !

Retour en haut de la page

11/11 Sommaire de la rubrique Précédent Suivant

Conditions d'utilisation

Le billet ci-dessus « Nuage de mots-cles » par Stephane Busuttil, ainsi que — sauf mentions spécifiques — tous les documents accessibles sur cette page sont librement mis à disposition selon les termes de la licence Creative Commons Paternité - Partage des Conditions Initiales à l'Identique 3.0 Unported.

+ de détails

Votre avis sur cette page

7 votes

6 commentaires

Aller au dernier commentaire

  • Nicolas Hoizey, le 15 octobre 2009 à 14:22

    Wow, quelle astuce fabuleuse, ce calcul distribué sur toutes les pages de mots clefs, bravo !!!

    Il faut que je regarde cela de plus prêt pour remplacer le nuage que j’ai actuellement...

  • SteF, le 16 octobre 2009 à 11:49

    hello

    merci ! mais le code mériterait sûrement d’être revu et optimisé par quelqu’un qui sait vraiment programmer, parce que moi c’est juste le dimanche, et encore quand il pleut ! :))

  • un internaute anonyme, le 20 octobre 2009 à 08:39

    Bonjour

    N’y a-t-il pas un risque que le nuage soit faux si le cache est vidé entièrement et si personne ne passe sur les pages mots ou bien si un mot clé est placé sur plusieurs articles et que le recalcul de la page qui écrit dans la base de données par cfg ne se fasse pas ?

  • SteF, le 20 octobre 2009 à 23:28

    @ ? : hello. bien sûr que si. à un instant donné t, le nuage est même statistiquement presque toujours faux si de nouveaux articles sont postés souvent. ce sera visible essentiellement si le site contient très peu d’articles (grosse incidence du changement de score d’un mot clé sur la taille de tous les mots), mais dans ce cas pas la peine d’utiliser un nuage... sinon, les conséquences sur la taille des mots du nuage sont minimes, et globalement le nuage est juste tout le temps. les stats semblent indiquer que ts les mots affichés sont cliqués (et s’ils ne le sont jamais, c’est qu’il faut en changer...)

  • SteF, le 27 octobre 2009 à 07:44

    ... (complément au commentaire précédent). en fait les pages des mots sont recalculées et les scores mis à jour, sans même qu’il soit nécessaire qu’un visiteur les visite : en effet, les robots des moteurs, en explorant le site, font recalculer les pages dont le cache a expiré. donc entre les clics des visiteurs et les crawls du poto google, aucune page d’un site visité et indexé ne peut passer au travers d’un recalcul.

  • sobo, le 5 février 2010 à 22:32

    Hi Stef
    tu peux te remettre à sortir même les dimanches de pluie, il parait que le nuage de mots clés est mort et enterré !

    http://tiny.cc/i7fMl


Vos réactions

Laissez ci-dessous vos commentaires, précisions, remarques et questions. Vos contributions ne s'affichent publiquement qu'après validation, trop de spam sinon.

Commenter
  • (Pour créer des paragraphes, laissez simplement des lignes vides.)

    texte
Qui êtes-vous ?

Retour en haut de la page

SPIP

SPIP est un logiciel unique, merveilleux et irremplaçable. Dans cette rubrique, quelques modestes contributions.

10 autres articles dans cette rubrique

Morceaux choisis


Contribuez à maintenir ces pages sur la toile.
Paiement sécurisé par Paypal ou CB

Frais d'hébergement depuis 2009 : 230 €
Total des dons depuis 2009 : 99 €

Another Teacher's Website est motorisé par SPIP.

Contribuez au contenu de ce site