マソソソマソソソのバリエーションを生成する

ワードサラダマソリソマソリソが脳内で自然に融合したのできらレボ観ながら書いた。どうぞご利用ください。

[puma:~/masososomasososo] ec% perl maso.pl < masocorpus
マンソリマリリソ
[puma:~/masososomasososo] ec% perl maso.pl < masocorpus
マソンソマソンソ

maso.pl

#!/usr/bin/perl
use utf8;
use encoding 'utf-8';
use strict;

use constant {
    HEAD => 'マ',
    TOKEN_LEN => 4,
}; 

my $maso = learn(*STDIN);
print gen($maso).gen($maso)."\n";

sub learn {
    my $h = shift; 
    
    my $model = {};
    while (my $line = <$h>) {
        chomp $line;
        
        my @chars = split //, $line;
        for my $i (0..$#chars-1) {
            $model->{$chars[$i]}->{$chars[$i+1]} += 1 if ($chars[$i+1] ne HEAD);
        }
    }
    return $model;
}

sub gen {
    my $m = shift;
    my $seed = HEAD;
    my @str = ($seed);
    
    for my $i (0..TOKEN_LEN-2) {
        my $n = predict($m->{$seed});
        push @str, $n;
        $seed = $n;
    }
    
    return join '', @str; 
}

sub predict {
    my $h = shift;
    
    my @prob;
    while (my ($c, $r) = each %$h) {
        push @prob, $c for (1..$r);
    }
    die unless @prob;
    return $prob[int(rand(scalar @prob))]
}

masocorpus

マリリンマンソン
マソリンマンソン
マリリソマリリソ
マソリソマソソソ