@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Text::MeCab で文章を分かち書きにして Algorithm::MarkovChain でマルコフ連鎖

markov chain and mecab · GitHub

#!/usr/bin/env perl
use strict;
use warnings;
use Text::MeCab;
use Algorithm::MarkovChain;
use Perl6::Say;
use Data::Dumper;

open my $in, '<', shift or die $!;
my $text = do { local $/; <$in>; };
close $in;

my $mecab = Text::MeCab->new({});
my @symbols;
for (my $node = $mecab->parse($text); $node; $node = $node->next) {
    #say $node->surface;
    push @symbols, $node->surface;
}

my $chain = Algorithm::MarkovChain->new;
$chain->seed(
    symbols => \@symbols,
    longest => 4,
);

my @newness = $chain->spew(
    length => 140,
    strict_start => 1,
    #complete => [ qw( the sky is ) ],
);

for my $chunk (@newness) {
    print $chunk;
}
  • Algorithm::MarkovChain の spew メソッドの strict_start オプションは、 @symbols で与えたものの一番先頭の要素から必ず文章がはじまるようにするためのもの。例えば、太宰治 走れメロスを与えると必ず「走れ」が先頭にくるようになる。これを外すと、「てにをは」が最初にきたりして不自然な文章になることが多い。
  • その他のオプションとかの意味はよくわかってない。