MeCab extensionを使ってTwitterで流行っているキーワードをクラウド化
ほとんどMeCab extension使いたさにあれこれこじつけた感ありありですが。。。
MeCabはオープンソースとして公開されている形態素解析エンジンの1つで、GPLもしくはLGPL/BSDライセンスの下に公開されています。他の形態素解析エンジンとしては、KAKASIやChaSenなどが知られていますね。
で、PHPの拡張モジュールとしてはPage2で公開されているものがあります。
これを使って、Twitterで流行っているキーワードをクラウド化するコードを書いてみました。なお、CSSはタグクラウドのスタイルを考える - collisions.dotimpac.toを参考にさせていただきました。
<style> div.taglist { float: none; width: 50%; margin-left: 20px; margin-bottom: 20px; line-height: 1.5em; font-size: 60%; text-align:center; text-transform: uppercase; } ul.taglist { margin: 0 0; padding: 0 0; background: none; display: block; letter-spacing:-0.1em; font-weight: bold; } a.latest { margin: 1em 0; letter-spacing:-0.1em; color: #333388 } a.latest:hover { color: #333388 } a.later { margin: 0 0; letter-spacing:-0.1em; color: #333388 } a.later:hover { color: #333388 } a.earlier { margin: 0 0; letter-spacing:-0.2em; color: #cccccc } a.earlier:hover { color: #333388 } a.earliest{ margin: 0 0;letter-spacing:-0.2em; color: #cccccc } a.earliest:hover { color: #333388 } </style> <?php error_reporting(E_ALL); require_once 'Services/Twitter.php'; require_once 'HTML/TagCloud.php'; $user = '[ログインID]'; $pass = '[パスワード]'; $twitter = new Services_Twitter($user, $pass); $friends = json_decode($twitter->getFriendsTimeline()); if (!is_array($friends)) { exit; } $mecab = new MeCab_Tagger(); $keywords = array(); foreach ($friends as $friend) { $text = $friend->text; $text = str_replace('[B!]', '', $text); $text = mb_ereg_replace('\([012][0-9]:[0-9]{2}\)', '', $text); $text = mb_ereg_replace('https?://[a-zA-Z0-9.-/=?&%]+', '', $text); $node = $mecab->parseToNode($text); do { if ($node->posid >= 37 && $node->posid <= 66 && // 名詞 $node->posid != 48 && // 数 $node->posid != 63) { // 名詞(非自立) if (!isset($keywords[$node->surface])) { $keywords[$node->surface] = 0; } $keywords[$node->surface]++; } } while ($node->next()); } krsort($keywords); $max_count = false; $cloud = new HTML_TagCloud(); foreach ($keywords as $keyword => $count) { if ($max_count === false) { $max_count = $count; } $cloud->addElement($keyword, null, $count * (10 / $max_count), time() - ($max_count - $count) * 60 * 60 * 24); } echo $cloud->buildHTML();
蛇足かも知れませんが、コードをざっと説明すると、
- Services_Twitterを使ってfriends_timelineを呼び出し
- コメント本文を抽出し、不要なワードを削除
- 今回はBktterの「[B!]」と時刻、URLを対象にしています
- MeCab extensionを使って、コメント本文から「名詞」を抽出
- 「数字だけ」や変なもの(非自立な名詞)は除外
- 「名詞」かどうかの判定には品詞IDを使っています。辞書のインストールでハマってましたが、http://p0t.jp/mt/archives/2007/06/mecab.htmlの情報に助けられました :-)
- PEAR::HTML_TagCloudでクラウド化
な感じで、最新のtimelineからクラウドを作ります。
コメントの取得にはfriends_timelineを使っていますが、public_timelineでもuser_timelineでもいけると思います。まあ、*_timelineは直近20件しか返してくれないので、クラウド化してもキーワードの数が少ないとか、頻出するキーワードがなくて全て同じ「重み」になってしまうとか色々ありますが。。。DBなどに一度溜めておいて、ある程度まとまった数でクラウド化するとか、動詞をクラウド化したりすると面白いかも知れませんね。
ちなみに、作ったきっかけは元後輩のBlog
です。
追記(2007/06/07 19:19)
PHPコードを若干修正しました。
追記(2007/06/09 14:35)
「buzztter」というサービスがあるようです。すみません、さっき知りました(^^; 類似発言を抽出できたり(これは面白い)、英語対応もしているようです。やっぱ、大量のコメントを集めた方が面白いものが出てきますね〜。