#!/usr/local/bin/perl -w #----------------------------------------------- # # # 一階のマルコフ連鎖による学習とテキスト生成 # # #----------------------------------------------- # # 使用法 # $ perl l1.pl < text use strict; use Text::ChaSen; my @Textfiber=(); my $Maxhop=20; &initialize(); # ---------------------- # M A I N # ---------------------- srand; my $input; my @tokens; #一文ずつ学習 while(<>) { $input=$_; @tokens = &analyze($input); &learn1(@tokens); } #記憶のダンプ #&dump1; #ランダム文字列生成 for(0..50) { print &generate1("_HEAD")."\n"; } # ------------------------------------------------------------------------ # # L E A R N I N G # # 順方向で二階のMarkov連鎖 # # ------------------------------------------------------------------------ sub learn1(@) { my @input = @_; my $word; for $word (@input) { push(@Textfiber, $word); } } sub dump1() { my $key; print "dumping %Textfiber\n"; for $key (@Textfiber) { print $key."\n"; } } sub generate1($) { my $word=shift; my (@output,@cand); for(1..$Maxhop) { $word=$Textfiber[rand($#Textfiber+1)]; push(@output,$word); } return join("/",@output); } # ------------------------------------------------------------------------ # # # A N A L Y S I S # # # ------------------------------------------------------------------------ sub analyze($) { my $input = shift; my @tokens; # 特定文字のエスケープ for($input) { s/([%,)(\/])/'%'.unpack("H2",$1)/eg; } # 分かち書き $input=Text::ChaSen::sparse_tostr($input); chomp $input; @tokens=split /\//,$input; return @tokens; } sub initialize() { Text::ChaSen::getopt_argv('chasen','-F','%m/'); }