マルコフ連鎖
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;