hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
08/02/2009 ん [長年日記]
08/03/2009 ふーむ [長年日記]
08/10/2009 ううむ [長年日記]
08/14/2009 ふむ [長年日記]
■ [日記] 人工無脳
ここ 2, 3 日ほど人工無脳をでっちあげて遊んでみた結果. とはいえ実際手を動かしてたのは数時間程度だが.
モノは MeCab とマルコフ連鎖というオーソドックスなもの. 何も工夫しないと文章と呼ぶに値しない荒唐無稽なものしか出てこない.
そこでまず品詞を理解させる. 理解と言ってもその実ただの分岐で,命令は「一般名詞もしくは固有名詞で始まり終助詞もしくは句点で終われ」「ただし読みのない名詞は始まりとして認めない」のみ *1. 2 つめのルールは,うちの MeCab が "ー" 等を名詞と出力することがあるから (ipadic).
IRC での発言は口語でかつ発言の終了位置が分かりづらいことから学習に向かず,やはりおかしな文章を吐くことが多い. そこで,学習に際して,各発言の終了位置をおぼしき場所に句点を付加. 「句点で終われ」ルールにうまく引っかかって文章生成が格段にそれっぽくなった.
アルゴリズム (と呼べるような代物でもないが) 的な部分はこんだけ. 後はチューニングの領域. 議題 (?) の移り変わりが激しい IRC では,学習数が少ないうちはマルコフ連鎖の階数を少なくしておかないと,ただの山彦に成り下がる.2 で充分. また,短すぎる文章 (「名詞。」等) や,あまりに長い文章では面白さがない (鋭さがなくなる) ので,ループ数を調節できるようにした方が良い. ただし前述の「終助詞か句点で終われ」ルールと「学習文章の終わりに必ず句点付加」によって終了はたやすく出現するので,「n回以上」で充分. これは 5 くらいが丁度良いみたい.
とりあえずこのルールでランダムな文章生成はそれっぽくなった (とはいえ変なことを口走ることはあるのでまだまだではある). 「直前数回の発言内容からそれっぽい "返答" を生成」をやろうかなとか思ったあたりで飽きて考えるのをやめた.
賢くするためには定期的な学習データのメンテナンスが必要だろうなと思いつつ,めんどくさいから絶対やらないだろうな.
*1 ただしこれは不完全で,終了には一部の記号類も含めるべきだと思っている
08/17/2009 うひ [長年日記]
08/19/2009 む [長年日記]
■ [Py][戯言] うーむ
Amazon API が何か変わったのを知って PyAWSに対するこんなパッチ を作ってみたら,既に本家の Tracker に似たようなのがあった罠. 変数名や関数名まで被るとは面白い. 中身は割と違うけどな. Timestamp とか. とりあえず localtime にタイムゾーン "Z" はどうかと思う.
08/21/2009 む [長年日記]
08/25/2009 ふむ [長年日記]
■ [日記] ふむ
酒には酔うための酒,楽しく飲むための酒,味わうための酒など色々あると思うけど,今日はまさしく味わうための酒を飲んだ. シャトー・デュクリュ・ボーカイユ 1978. ボルドーのメドック格付け 2 級,当たり年と評される 1978 年もの. ヴィンテージワインなぞ飲むのは実は初めて.
自分はワインの善し悪しなんてこれっぽっちも分からんド素人だけど,たしかにこいつはうまい. 店の人に「ヴィンテージワインは華やかさよりもしっとり」と聞いた通り,深みとコクが.
ヴィンテージワインは開けた後の酸化が早く味が刻一刻と変化するとどっかで聞いた通り,開けた直後から時間経過によりどんどん味が変わっていくのも面白い. 開けた直後とボトルが空になる前とではド素人の自分にもはっきりと分かるくらいの違いがある.
こんな酒は今後そう飲む機会はなさそうだ.
08/27/2009 あー [長年日記]
■ [日記] んー
故あって,だいたい同じ用途のものを Perl, Python, Ruby, Java の 4 つの言語で書いたのだけれど,書き終えてみてやはり Ruby の文法や予約語のセンスは前衛的だなーとしみじみ思ったのでした.
文法的な部分以外だと,以下には何度かはまった. というか,どの言語がどうなのかこんがらがる.
$ ipython [1]>>> a = [0, 1, 2, 3, 4, 5] [2]>>> a[:-1] [2]<<< [0, 1, 2, 3, 4] $ irb irb(main):001:0> a = [0, 1, 2, 3, 4, 5] => [0, 1, 2, 3, 4, 5] irb(main):002:0> a[0..-1] => [0, 1, 2, 3, 4, 5] $ perl -MData::Dumper -e '@a = qw(0 1 2 3 4 5); print Dumper([@a[0..-1]]);' $VAR1 = [];
どうでもいいけど Rubyリファレンスマニュアル の「範囲の始点が終点よりも大きい時には nil を返します」てのは数値的な意味じゃないってことかいな.
□ kou [なんかすごそう! ]
□ atzm [すごいんです! ]