マルコフ連鎖

Yahoo!のテキスト解析Web APIで日本語生成(マルコフ連鎖) - ishiducaの日記 - Hatena::Group::Perlを参考にしました。

#!/usr/local/bin/perl

use strict;
use warnings;
use MeCab;
use Data::Dumper;

my $text = shift || die "You should set argument $!";
my $eos = "EOS\n";
my %markov;
my @data;
my $sentence;

my $mecab = new MeCab::Tagger("-Owakati");
for (my $n = $mecab->parseToNode($text); $n; $n = $n->{next}) {
	push @data, $n->{surface};
}
push @data, $eos;

for (my $i = 0; $i < $#data; $i++) {
	push @{ $markov{$data[$i+1]}{$data[$i+2]} }, $data[$i+3];
}
my @keys = keys %markov;
my $phr1 = $data[1];
my @key = keys %{$markov{$phr1}};
my $phr2 = $key[int rand(@key)];
my $rand = int rand(@{$markov{$phr1}{$phr2}});
my $phr3 = $markov{$phr1}{$phr2}[$rand];
$sentence = "$phr1$phr2$phr3";

for(my $d = 0; $d < 1000; $d++) {	
	$phr1 = $phr2;
	$phr2 = $phr3;
	$rand = int rand(@{$markov{$phr1}{$phr2}});
	$phr3 =  $markov{$phr1}{$phr2}[$rand];
	last if $phr3 eq $eos;
	$sentence .= "$phr3";	
}
print $sentence;