HTML_TagCloud+awstatsでKeywordCloud
何てことないんですが、awstatsの集計結果ファイルから検索文字列(キーワード)を抜き出して、cloud形式に表示するスクリプトを書いてみました。
。。。と理由は付けてますが、まあ、HTML_TagCloud使いたかっただけです ;-)
結果はDo You PHP?のEXPERIENCEからどうぞ。ちなみに、Cache_Liteを使って、24時間データを保存するようにしています。
<?php ini_set('error_reporting', E_ALL); require_once 'HTML/TagCloud.php'; require_once 'Cache/Lite.php'; define('DATA_PATH', '/path/to/awstats/'); define('FILE_PREFIX', 'awstats'); define('FILE_SUFFIX', '.txt'); define('CACHE_DIR', '/path/to/place/your/cache/file/'); define('CACHE_TTL', 60*60*24); ?> <?php $yesterday = time() - (60 * 60 * 24); $datafile = DATA_PATH . FILE_PREFIX . date('mY', $yesterday) . FILE_SUFFIX; $id = 'tagcloud'; $options = array('cacheDir' => CACHE_DIR, 'lifeTime' => CACHE_TTL); $cache = new Cache_Lite($options); if ($data = $cache->get($id)) { echo $data; exit; } $fp = fopen($datafile, 'r'); if ($fp) { while (!feof($fp)) { $line = fgets($fp, 4096); if (preg_match('/^BEGIN_KEYWORDS /', $line)) { break; } } $cloud = new HTML_TagCloud(); while (!feof($fp)) { $line = fgets($fp, 4096); if (preg_match('/^END_KEYWORDS/', $line)) { break; } preg_match('/(.*) (.*)/', $line, $matches); if (isset($matches[1]) && isset($matches[2]) && $matches[2] > 30) { $keyword = mb_convert_encoding(urldecode($matches[1]), mb_internal_encoding(), 'auto'); $count = $matches[2]; $cloud->addElement($keyword, null, $count); } } $data = $cloud->buildAll(); echo $data; $cache->save($data); } fclose($fp);
「クラウド」って、要は出現頻度をグラフや表ではなく、文字の大小で表しているところがポイント(ある種の「見える化」)なので、タグに限らず何でも使えそう。。。というのが、HTML_TagCloudを使った率直な感想です。