Hatena::Keyword で記事タイトルをニュー速化

Hatena::KeywordCPAN に上げました。ということで(?) しょうもない Hack を一つ。フィードの URL を指定すると、そのフィードのタイトルをニュー速風に仕立て上げるという代物。よくあるあれですね。

僕のフィードではこうなりました。

[naoya@hydralisk work]$ perl nyusoku.pl http://d.hatena.ne.jp/naoya/rss
【iRC】 LimeChat 2.0【IRC】
【CPAN】 Hatena-Keyword-0.02【モジュール】
【コーパス】 はてなダイアリーキーワード抽出モジュール【MeCab】
【MacOSX】 いろいろインストールしてみました【ソフト】
【はてなブックマーク】 プログラマの種類とキャリア【努力】
【健康診断】 人力でのMac質問の回答どうもです・・・!
【OSX】 Witch【ターミナル】
【はてな認証API】 はてな認証API【Flickr】
【Rails】 どこからかこんな声が聞こえる
【WEB+DB PRESS】 勝手に添削 - WEB+DB Press Vol.32 オレオレコード版【blog】

なんとなくそれっぽい。以下ソース。10分ぐらいででっちあげ。Switch.pm なんて初めて使ったよ。

#!/usr/local/bin/perl
use strict;
use warnings;
use Jcode;
use Hatena::Keyword;
use XML::Feed;
use utf8;
use Encode;
use Switch;

my $feed_url = shift or die "usage $0 <feed_url>";

my $feed = XML::Feed->parse(URI->new($feed_url))
    or die XML::Feed->errstr;

for my $entry ($feed->entries) {
    my $summary = $entry->summary->body;
    Encode::_utf8_off($summary); #FIXME
    my $keyword = Hatena::Keyword->extract($summary);
    my $title = nyusokufy($entry->title, $keyword);
    print Jcode->new($title, 'utf-8')->euc, "?n";
    sleep 5;
}

sub nyusokufy {
    my ($text, $keywords) = @_;
    my @terms = sort { $a->refcount <=> $b->refcount } @$keywords;
    switch (@terms) {
        case 0 { return $text }
        case 1 { return sprintf "【%s】%s", $terms[0], $text }
        else   { return sprintf "【%s】%s【%s】", $terms[0], $text, $terms[1] }
    }
}

1;

フィードに含まれる各エントリの要約部分のテキストを Hatena::Keyword でキーワード抽出して、タイトルの前後にくっつけると。特徴語を見つけるアルゴリズムとかは特になくて、単純に結果を refcount (言及数) でソートして先頭の二つを取ってるだけですが、一応それなりの出力になるようですw

UTF-8 フラグを落としてやらないと Hatena::Keyword がちゃんと動かないことが判明したのでこれは 0.04 で対応するとします。