Hoe doe je dat?

Programmeer code

Een wordcloud genereren dankzij een class in PHP

Op bijna elke blog vindt je tegenwoordig een wordcloud. Dit is zogezegd een “wolk” met woorden die vaak voorkomen op een blog. Hoedoejedat.be heeft ook een wordcloud. De reden waarom dit vaak gebruikt word, is dat het makkelijk is om te laten zien hoeveel keer een bepaald woord voorkomt. Hoe groter het woord in de wolk staat, hoe vaker dit woord voorkomt.

Als je verstandig gebruik maakt van je woordkeuze, kan dit resulteren in het vaak voorkomen van een woord waardoor deze meer onder de aandacht komt wat ten goede kan komen bij je resultaten in zoekmachines. Ik geef jullie hier nu een zeer basic class in PHP die een eenvoudige wordcloud genereert op basis van een gegeven tekst/woorden.

Deze class mag je vrij gebruiken, ik heb ze zelf gemaakt en heb er ook geen licentie ofzo op geplaatst. Als je ze echter gebruikt of deelt op bijvoorbeeld een website, dan is een linkje terug natuurlijk altijd gewaardeerd :)

< ?php
class WordCloud
{
	private $words;
 
	public function __construct($text = '')
	{
		$this->words = array();
		$this->addWords($text);
	}
 
	public function addWords($text)
	{
		$text = preg_replace('/W/', ' ', $text);
		$words = split(' ',$text);
 
		foreach ($words as $word)
		{
			$this->addWord($word);
		}
	}
 
	public function addWord($word)
	{
		$word = strtolower($word);
 
		if (array_key_exists($word, $this->words))
		{
			$this->words[$word]++;
		}
		else
		{
			$this->words[$word] = 1;
		}
	}
 
	public function parse()
	{
		$output = '';
		$maxWeight = $this->getMaxWeight();
 
		foreach ($this->words as $word => $weight)
		{
			$output .= '<span style="font-size: '.($weight/$maxWeight).'em">'.$word.'</span> ';
		}
 
		return $output;
	}
 
	private function getMaxWeight()
	{
		return max($this->words);
	}
}

Hoe gebruik je nu deze class? Simpel, op deze manier:

< ?php
require_once 'class.wordcloud.php';
 
$wordCloud = new WordCloud('Dit is een test. Meerdere keren komt er test in voor.');
$wordCloud->addWords('Dit is een test.');
$wordCloud->addWord('test');
echo '<p style="font-size: 40px">'.$wordCloud->parse().'</p>';

Je zorgt eerst dat je de class include zodat je ze kan gebruiken (je kan ze ook rechtstreeks in je pagina plaatsen waar je ze gebruikt, zoals je zelf wenst). Daarna start je de class en kan je direct een aantal woorden meegeven. Dit is echter optioneel, de class kan zonder argumenten gestart worden. Daarna kan je gebruik maken van de methodes “addWords()” en “addWord()” om respectievelijk meerdere of een woord toe te voegen.

Let op: zorg dat je bij “addWord()” ook daadwerkelijk een woord meegeeft in plaats van een hele zin want anders zal hij de zin als een compleet woord zien. Om uiteindelijk het resultaat te zien, roep je de methode “parse()” waardoor de class alle woorden zal omzetten in HTML en dergelijke zodat de verandering in grootte plaatsvindt. Er is gekozen voor simpele span-tags om geen conflicten met andere HTML-tags te krijgen. Het resultaat van de “parse()” in bovenstaande code is dan:

<span style="font-size: 0.5em">dit</span> <span style="font-size: 0.5em">is</span> <span style="font-size: 0.5em">een</span> <span style="font-size: 1em">test</span> <span style="font-size: 0.75em"></span> <span style="font-size: 0.25em">meerdere</span> <span style="font-size: 0.25em">keren</span> <span style="font-size: 0.25em">komt</span> <span style="font-size: 0.25em">er</span> <span style="font-size: 0.25em">in</span> <span style="font-size: 0.25em">voor</span>

Zoals je ziet wordt er gebruik gemaakt van de “em” als aanduiding van de grootte van de tekst. De reden hiervoor, is dat hij dan de grootte zal aanpassen aan die van het omliggende element in je HTML. In de code die ik gaf, zal de tekst dan in het geval van 0.5em het formaat van 20px aannemen, in het geval van 0.25em het formaat van 10px, …

De class op zich is nog niet echt uitgebreid te noemen maar het kan een leuke opstap zijn naar een veel betere. Misschien dat ik er ooit eens wat verder aan sleutel om het veel beter te maken. Als iemand de class graag verbetert of uitbreid, dan mag je dat altijd laten weten en dan kan ik de betere versie online plaatsen (natuurlijk krijg je dan een eervolle vermelding en linkje terug naar je website).

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Verplichte velden zijn gemarkeerd met *

De volgende HTML tags en attributen zijn toegestaan: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>