人工無脳をつくってみようとする8
レポートとして提出したところまでの人工無脳。提出したのは2月24日だったんだけど、レポート提出の開放感で絶賛放置していた。とりあえず現状を確認する。
プログラムは以下のURL。
http://konbu.s13.xrea.com/lib/mezassi.tar.bz2
インストール
実行するためには
MeCab、mecab-perl モジュール、Data::Dumper モジュール、MeCab 品詞IDの定義が必要。
MeCab 品詞ID はデフォルト設定の pos-id.def ( 同梱したものも同じもの ) を利用。
設計
まず全体のコンセプトとして、「人との会話により学習して会話ができるようになる人工無脳」とするべく作成した。
発言とは最短経路問題であるとした。
「ノード=単語」、「経路長=単語間の繋がりの尤もらしさ」としたグラフを考え、気分や知識や会話の流れなどで決定される「目的の単語」をいくつか設定し、「文頭 - 目的の単語 - 文末」を通る最短の経路こそ尤もらしい発言であると仮定した。
「単語」は人間の発言を MeCab により解析することで得た。
「単語間の繋がりの尤もらしさ」とは、実際の人間の場合を考えると気分や知識、会話の流れなど様々な要因により動的に変化するものだと考えられますが、今回は 3-word-gram のみにて、尤もらしさの計算をおこなった。
「目的の単語」は直前の人の発言から MeCab により得られる品詞情報により一つだけ決定した。「目的の単語」抽出優先順位は、実行ファイルに同梱したpos-id.def のidで「2, 36..67, 10..12, 31..35, 68, 0, 1, 25..30, 3..9, 13..24」の順である。
「会話は最短経路問題である」としたが、このプログラムは最短経路を求めない。ノード間を短かさにより確率で経路を選んで進み続け、終着ノードに辿りついた経路により発言を決定している。そのため、同様の状況でも言うことが変わってくる可能性は高い。
これは技術的な理由も大きい。またこのような方法であるため、「目的の単語」を一つしか設計できない仕様となった。一つだけなら可能であるのは、出発ノードを「目的の単語」、目的ノードを「文頭」もしくは「文末」に指定しているからである。「文頭」および「文末」はどの文章にも必ず存在するので、どのような経路を通っても到達することが可能なため。
実行結果
# 行が人間側の発言、> 行がプログラムの発言。同梱した dumpdic を辞書として利用して会話した。dumpdic は mid.log を学習させた時の辞書。
% ./meztalk.pl # こんにちは。 > こんにちは。 # どうもどうも。 > まあなんにもしていたが、どうもmixiは好かんから不便。 # そういうものですか。 > 今のPC-BSDにはKDEとか必要無いから、日記というものを一度見直してから考えれ>俺 # あまり会話にはなっていませんね。 > 会話をしましょう。 # 良い提案だと思います。 > 良い提案だと思います。 # 知識は大事ですね。 > 予備知識無しでFreeBSDとか入れようと思う。 # 予備知識は大事だと思いますけど。 > 予備知識無しでFreeBSDとか入れようとして書くことが超クールに思えてきた。 # そろそろ眠いです。 > 眠いなあ。 # ではおやすみ。 > おやすみ。 #
手頃なコーパスが見つからないので、mid.log は単なる日記の文章を流用。