読者です 読者をやめる 読者になる 読者になる

ゆーすけべー日記

はてなBlogってどーなの!?

日本語の文章をzenrize(全裸化)するAcme::Zenraっていうのを作った

Perl

かの有名なsugyanの全裸ボット。適当に人の発言に対して「全裸で」を付けて発言するボットなんだけど... これと、似た様なボットをたくさん作ろうとすると... 例えば「全裸で」を「動詞」の前につけるという部分のロジック、 つまり「zenrize」の部分を重複して作ることになる。 「夜の」というのを「名詞」の前につけて「夜のボット」を作りたい時も...

なので、「zenrize」を汎用的に行うAcme::Zenraっていうモジュールをでっちあげてみた。 githubにおいてあります。

yusukebe's Acme-Zenra at master - GitHub

このモジュールを使えば、IRCの発言をzenrizeしてNOTICEで返すIRC botも簡単に作れます。

実行例。

11:51 yusukebe: お腹が空きました
11:51 zenra_bot: 「お腹が全裸で空きました」ですね。わかります

IRCボットのコード例。

#!/usr/bin/perl
use Acme::Zenra;
use AnyEvent;
use AnyEvent::IRC::Client;
use Encode;
use utf8;

my $channel = $ARGV[0]          or die 'channel name is needed!';
my $appid   = $ENV{YAHOO_APPID} or die 'set $ENV{YAHOO_APPID}';
my $zenra = Acme::Zenra->new( yahoo_appid => $appid );

my $c   = AnyEvent->condvar;
my $irc = new AnyEvent::IRC::Client;

$irc->reg_cb( connect    => sub { print "connected\n" } );
$irc->reg_cb( registered => sub { print "registered\n"; } );
$irc->reg_cb( disconnect => sub { print "disconnet\n"; } );
$irc->reg_cb(
    publicmsg => sub {
        my ( $irc, $chan, $msg ) = @_;
        my $message = decode_utf8( $msg->{params}->[1] );
        my $result = $zenra->zenrize( $message );
        if ($message ne $result ) {
            $message = encode_utf8(
                '「' . $result . '」ですね。わかります' );
            $irc->send_chan( $channel, "NOTICE", $channel, $message );
        }
    }
);
$irc->connect( "chat.freenode.net", 6667, { nick => 'zenra_bot' } );
$irc->send_srv( "JOIN", $channel );
$c->recv;

このモジュールのいい点は先ほど言ったように「名詞」の前に「夜の」を付けて「nightize」させたいなんて時にも対応できる点です。newする時にこんな風に指定すればいいのです。

my $zenra = Acme::Zenra->new(
    yahoo_appid => $ENV{YAHOO_APPID},
    position    => '名詞',
    text        => '夜の'
);
my $result = $zenra->zenrize('お腹が空いたのでスパゲッティが食べたい');
print encode_utf8($result)    # 夜のお腹が空いたので夜のスパゲッティが食べたい

作ってみたものの、誰得な気がして、watchするのもsugyanとmakamakaさんくらいだろーなーとという感じですが、 希望があればアップデートします。