myfinderの技術や周辺的活動のblog

2008年12月29日月曜日

人工無脳(chatbot)を実装してみる -第六回-

今回は、今までとは打って変わって形態素解析とマルコフ連鎖を利用して文章を自動生成してみます。

形態素解析にマルコフ連鎖と並ぶと、難しそうで思わず敬遠しちゃいそうですが、データ構造を先に見てしまえばきっとすぐ分ると思います。
長い文章のマルコフ連鎖は巨大なデータになってしまうので、ここでは
「私のお墓の前で泣かないでください」
を例にとって解説します。

まずは形態素解析です。
前回までに作成した形態素解析のためのクラスで解析メソッドに掛けると、下記のような出力が得られます。

[
["私", "名詞-代名詞-一般"],
["の", "助詞-連体化"],
["お", "接頭詞-名詞接続"],
["墓", "名詞-一般"],
["の", "助詞-連体化"],
["前", "名詞-副詞可能"],
["で", "助詞-格助詞-一般"],
["泣か", "動詞-自立"],
["ない", "助動詞"],
["で", "助詞-接続助詞"],
["ください", "動詞-非自立"]
]

こんな感じですね。
今までは、
1:名詞を抜き出して、入力を回答として記憶するパターン
2:名詞部分を置換用の文字列に置き換え、テンプレートとして記憶するパターン
という2種類の使い方をしていました。
今回は、「単語と単語のつながり」に着目して、文書を自動生成するための処理を組み立てます。

今回の文書のつながり方は、形態素解析によって次のようになっているということが分りました。
「私 -> の -> お -> 墓 -> の -> 前 -> で -> 泣か -> ない -> で -> ください」
この文のつながり情報を持ったデータ構造は下記のように表せます。

{
"泣か"=>
{"ない"=>["で"]},
"で"=>
{"泣か"=>["ない"], "ください"=>["%END%"]},
"前"=>
{"で"=>["泣か"]},
"ない"=>
{"で"=>["ください"]},
"墓"=>
{"の"=>["前"]},
"お"=>
{"墓"=>["の"]},
"私"=>
{"の"=>["お"]},
"の"=>
{"前"=>["で"],
"お"=>["墓"]}
}

これは、2単語の接頭+接尾で文章のつながりを表したものです。
このデータ構造によって、接頭2単語に続く接尾をランダムに選択し、接頭の2単語目と接尾を接頭2単語として再びランダムに選択し・・・ということを、ENDマークが出るまで繰り返すだけで文章を生成できるようになりました。
このままでは元の文章が生成されるだけなので、さらに別の文章もこのデータ構造に取り込んでいくと、分岐ができるようになり、(意味が通るかは別として)新たな文章が生成できるようになります。

今回は2単語+接尾でつないでいますが、1単語+接尾だけでつなぐと日本語として意味不明な文章が生成されがちなので、最低でも2単語以上でつないだ方がより自然な文章が作れるようです。
(「あたし彼女」のような文を作るときは1単語+接尾の方が雰囲気ある文章が作れそうですが)

0 件のコメント: