Hatena::Grouptwitter

smokeymonkey@ついったー部 RSSフィード

 | 

2008-01-28

smokeymonkeyのフレンドタイムラインからマルコフしちゃう子:@dabesa

18:38 | smokeymonkeyのフレンドタイムラインからマルコフしちゃう子:@dabesa - smokeymonkey@ついったー部 を含むブックマーク はてなブックマーク - smokeymonkeyのフレンドタイムラインからマルコフしちゃう子:@dabesa - smokeymonkey@ついったー部

これを改変し、アカウントdabesaとしてリリース。15分に1回喋ります。

文字化け抑止(半角カナ、半角記号、スペースを除去)したんだけど、まだ化けることがある。タイムライン自体はUTF-8(だよね?)で、それをJcode.pmでEUCにエンコードした時点で文字化けする。少し研究する。

マルコフ連鎖のロジックは1接頭語+1接尾語なので、せめて2段階くらいまで深めたい。今後の改善を検討。

#!/usr/bin/perl

use strict;
use Net::Twitter;
use Jcode;
use Text::MeCab;

sub main {

  my $twit = Net::Twitter->new(username=>"smokeymonkey", password=>"PASSWORD") ;
  my $result = $twit->friends_timeline();

  my $i = 0;
  my $j = 0;
  my @DATA = ();
  my @words = ();

  foreach my $hash (@$result) {
    $hash->{'text'} =~ s/[\s!-~]//g;
    $hash->{'text'} =~ s/[\x{FF61}-\x{FF9F}]//g;
    $DATA[$i] = $hash->{'text'};
    $i++;
  }

  for ($j=0; $j<$i; $j++){
    my $mec = Text::MeCab->new;
    Jcode::convert(\$DATA[$j], 'euc');
    for (my $nod = $mec->parse($DATA[$j]); $nod; $nod=$nod->next ) {
      my $word = $nod->surface if length $nod->surface;
      Jcode::convert(\$word,'utf8');
      push @words, $word;
    }
  }

  my %markov;

  if (@words > 1) {
    for ($i = 1 ; $i < @words ; $i++) {
      push(@{$markov{$words[$i-1]} }, $words[$i]);
    }
  }

  my $pre1 = $words[0];
  my $rand = int (rand (@{$markov{$pre1} }));
  my $suf1 = $markov{$pre1}[$rand];

  my $text = $pre1.$suf1;

  for ($i=0 ; $i<50 ; $i++) {
    $pre1 = $suf1;

    $rand = int (rand (@{ $markov{$pre1} }));
    $suf1 = $markov{$pre1}[$rand];

    if ($suf1 eq "EOS\n") {
      last;
    }

    $text .= $suf1;
  }

  my $lastword .= 'だべさ。';
  Jcode::convert(\$lastword,'utf8');
  $text .= $lastword;

  my $subtwit = Net::Twitter->new(username=>"dabesa", password=>"PASSWORD") ;

  Jcode::convert(\$text, 'utf8');
  my $subresult = $subtwit->update($text);

}

eval {&main(@ARGV)};
print "ERROR\n" if $@;

exit;
 |