続・マルコフ連鎖による作文

一昨日のコレの続き。
プログラミング作法」は出てすぐ読んで忘却の彼方にあったので、引っ張り出してみた。で、Perl版があったので、rubyで書き直してみたのがこれ(ruby使いの方、もっとエレガントに書き直してください)。

#!/usr/bin/ruby
# markov.rb - based on perl version of markov chain program appeared on
# "The Practice of Programming", Kernighan and Pike, 1999

srand
MAXGEN = 10000
NONWORD = "\n"
w1 = w2 = NONWORD
ary = suf = 
statetab = Hash.new("")
while gets()
    ary = split(/\t/)
    statetab[w1+w2] =  if statetab[w1+w2] == ""
    statetab[w1+w2].push(ary[0])
    w1,w2 = w2,ary[0]
end
statetab[w1+w2] = [] if statetab[w1+w2] == ""
statetab[w1+w2].push(NONWORD)
w1 = w2 = NONWORD
for i in 0..MAXGEN
    suf = statetab[w1+w2]
    r = rand(suf.size)
    break if (t = suf[r]) == NONWORD
    if t == "EOS\n"
        print "\n"
    else
        print t
    end
    w1,w2 = w2,t
end

入力は、Chasenのデフォルトの出力を想定してます。

$ chasen hoge.txt | ./markov.rb

とでもして下さい。こんな感じになります(実際の出力は長すぎるので抜粋)。

ぼくはこの本にはエレジーを基調にして、しばらくすると部屋の片隅や引き出しの奥かどっかできいたような特定の作品ではある。
話者は、現代の話者が創作したのか?
こうした知識の不足は、なんだか不思議な豊かさを出している。
このシリーズが連載されている感じで、無常観であるとか。
有機物はすでに腐食し、われわれが自分でやったんだろう。
なんとなくそこらで作った、なんてことはあり得ないだろう。
そして明らかにそのクロード・パージュは自分の設計した、フランスの田舎商人の小せがれとして生まれたクロード・パージュは、隅の仕切になきゃいけないのだ。
この本を読んで失望したところ、ヒトの奇形に興味を持っていて、ピンとこないというのが第10年がすぎ、そしてそれに関連しているけれど、やはりその中で非常に決まり切ったお話に落ち着いて事足れりとして、悪くないんだけど……それは所有者だったり、地域の関係者だったり、ただの三流以下のエロ雑誌になったアクアポリスの廃墟。
変な趣味の本ばかり出していることは一瞬たりとも考えなかったことで、著者は必ず、何かどっかできいたような、きわめて入念なリサーチをバックにしても「おお、これぞ天下の逸品」とか「これぞ究極の靴下モンキーたちを、集めて喜んでいるという驚き、と指摘する。
廃墟化した部分がある。
ホントかね。
だって自分で作った人たち。
これが日本の読者が対象だ。
本書の廃墟。
その再構成された物語なんだけれど、そこにある種のフレームをきちんと設定した、そんな部分がでてくる。
そしてたぶん、あらゆる表現ジャンル――ロックでも、日本と日本以外の価値なんて、こんなものにしたがる。
無機質っぽい。

元ネタは山形さんのCUT書評でした。うーん、それっぽい。わはは。