Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

MeCab extensionを使ってTwitterで流行っているキーワードをクラウド化

ほとんどMeCab extension使いたさにあれこれこじつけた感ありありですが。。。
MeCabオープンソースとして公開されている形態素解析エンジンの1つで、GPLもしくはLGPL/BSDライセンスの下に公開されています。他の形態素解析エンジンとしては、KAKASIChaSenなどが知られていますね。

で、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」というサービスがあるようです。すみません、さっき知りました(^^; 類似発言を抽出できたり(これは面白い)、英語対応もしているようです。やっぱ、大量のコメントを集めた方が面白いものが出てきますね〜。