WindVoiceの日記: BNF? マルコフ連鎖?
日記 by
WindVoice
作りかけ作文スクリプトで書いたPerlスクリプトを作ってからも、何とかもっとまともな(人間っぽい)会話のできる方法ってないものかなと調べていました。
文法に沿った処理をBNF(バッカス・ナウアー記法)で書くと、「符号化された入力を文法解析して決められたアクションを起こしてくれるようなC言語のプログラムを生成してくれる」という、GNU Bisonがもしかしたらヒントになるかなと思ったのですが、マニュアルその他を読んでみると、LALR(1)というのは人間の言語とはやっぱり少し違うようで、こちらの方法は今のところいいアイディアには見えません。ただ、人間語の小さな小さなサブセット(たとえば英語の五文型全部はやめて第一文型のSVだけとか)に限ってサポートすると決めてしまうなら、見込みがありそうかもしれません(というかそれがまさにプログラミング言語なわけですが)。
マルコフ連鎖というのが人工無能で会話させるソフトでは使われているという情報を見つけた(「あたしマルコフ」で検索すると出てくる)のですが、これはすごいかも、と思って「あたしマルコフ」の作者氏による解説を読んでみたら、これは↑で私が書いたPerlスクリプトとそれほど違わないアイディアでした(「あたしマルコフ」は前の2語から次の1語を決めるけど、私のスクリプトは前の1語から次の1語を決める形式なだけ)。マルコフ連鎖というのは確率論の用語のようですけど、応用はこんなにチープなものに限られるのかなぁ。もう少しちゃんと調べるべきかもしれません。
「あたしマルコフ」が私のPerlスクリプトよりも巧く喋っているように見えるのは、テーマを限定したところ(つまり小説風のものに話題を限る)にあるのかな、つまりデータベースの造りが工夫されているのだろうと分析しています。
やはり目標は「限定された話題についてはどうにかこうにか喋っているような雰囲気を醸し出せる」くらいに置いたほうがよさそうです(低め低めのハードルですが)。
文法に沿った処理をBNF(バッカス・ナウアー記法)で書くと、「符号化された入力を文法解析して決められたアクションを起こしてくれるようなC言語のプログラムを生成してくれる」という、GNU Bisonがもしかしたらヒントになるかなと思ったのですが、マニュアルその他を読んでみると、LALR(1)というのは人間の言語とはやっぱり少し違うようで、こちらの方法は今のところいいアイディアには見えません。ただ、人間語の小さな小さなサブセット(たとえば英語の五文型全部はやめて第一文型のSVだけとか)に限ってサポートすると決めてしまうなら、見込みがありそうかもしれません(というかそれがまさにプログラミング言語なわけですが)。
マルコフ連鎖というのが人工無能で会話させるソフトでは使われているという情報を見つけた(「あたしマルコフ」で検索すると出てくる)のですが、これはすごいかも、と思って「あたしマルコフ」の作者氏による解説を読んでみたら、これは↑で私が書いたPerlスクリプトとそれほど違わないアイディアでした(「あたしマルコフ」は前の2語から次の1語を決めるけど、私のスクリプトは前の1語から次の1語を決める形式なだけ)。マルコフ連鎖というのは確率論の用語のようですけど、応用はこんなにチープなものに限られるのかなぁ。もう少しちゃんと調べるべきかもしれません。
「あたしマルコフ」が私のPerlスクリプトよりも巧く喋っているように見えるのは、テーマを限定したところ(つまり小説風のものに話題を限る)にあるのかな、つまりデータベースの造りが工夫されているのだろうと分析しています。
やはり目標は「限定された話題についてはどうにかこうにか喋っているような雰囲気を醸し出せる」くらいに置いたほうがよさそうです(低め低めのハードルですが)。
BNF? マルコフ連鎖? More ログイン