最近の更新 (Recent Changes)

2014-01-01
2013-01-04
2012-12-22
2012-12-15
2012-12-09

Wikiガイド(Guide)

サイドバー (Side Bar)

--
← 前のページに戻る

会話キャラクター・システムの動作解説

1. 伝説のEliza(イライザ)システムとは

会話キャラクター・システムは、Eliza(イライザ)と呼ばれたある人工知能(AI)について考えたことから始まりました。

Eliza(イライザ)の歴史

Eliza(イライザ)は、ジョセフ・ワイゼンバウムが1966年に開発した人工知能(AI)プログラムです。

相手の言葉を反復して質問することで会話を続ける対話プログラムで、 Eliza と会話した多くの人々の心の中には、"Elizaは、自分たちを理解してくれる"という、驚くべき幻想を作り上げたといいます。

Elizaは当事一大ブームをおこしました。しかし、Elizaへの反響の大きさはワイゼンバウムを悩ましました。

あるユーザはプログラムと数時間も対話し、主治医か長年の親友のように思いこみました。

また、ワイゼンバウムの秘書が、Elizaと真剣に会話しているのを知り、大きな衝撃をうけた件が彼の著書にあります。

ところで、Elizaという名前はジョージ・バーナード・ショーの戯曲『ピグマリオン』の登場人物 Eliza Doolittle に因んだものとのことです。彼女は上流階級のアクセントで話すことを教えられる役でした。

Eliza(イライザ)の人間らしさ

Elizaは入力された文の構文解析を行い、そこから抜き出したキーワードを、定められた規則で定められたセンテンスに埋め込む処理を繰り返します。 この定められたセンテンスへの埋め込みは、非常に単純な規則しか用いていません。

しかし、それにもかかわらず多くの人が相手は人間だと思い込んでしまったと言います。 実際にこのプログラムの振る舞いを見た多くの人々が、Elizaは人間の言葉を理解して、相手の抱える問題に真剣に対応してくれたものと信じました。

Elizaの応答メッセージを以下に引用してみましょう。


young woman: Men are all alike.

eliza: In what way?

young woman: They're always bugging us about something specific or other.

eliza: Can you think of a specific example?

young woman: Well, my boyfriend made me come here.

eliza: Your boyfriend made you come here?

young woman: He says I'm depressed much of the time.

eliza: I am sorry to hear you are depressed.

young woman: It's true. I'm unhappy.

eliza: Do you think coming here will help you not to be unhappy?

young woman: I need some help, that much seems certain.

私は以下の2点により、人々はElizaを信用したと考えます。

1) Elizaの話す英語は、文法上におかしなところは見られません。また、同じ反応を繰り返したりもしていません。 いかにも機械が話しているようなたどたどしさはなかったのです。

2) Elizaの話す言葉には、相手の人間が話したワードやセンテンスが含まれています。 もともと事前に組み込まれた機械のプログラムが、今話した内容について返してくるとは思えなかったでしょう。

ただの機械とは思えないものが、自分に関する話題を話すならば、それを信じてじっくり話し合いたいと思ってしまうのも無理からぬでしょう。

英語特有の形態素解析しやすさ

Elizaは英語の会話を聞いて話します。

この英語の会話をElizaは、構文上おかしなところがないように、キーワードや一連の部分の文を取り出し、変換や新しい文の組み立てを行わなければなりません。

いわゆる形態素解析によって相手の話を処理し、適切な内容に変換します。

また、Elizaは、主語や目的語の人称の変更などを行い(相手の文のIをYouに変換等)、応答文に組み込んで返事を作成したりします。

この形態素解析を行う上で、英語にはとても有利な点があります。

英語では、単語は空白によってわかち書きされるので、文を形態素に区切るのは日本語に比べると比較的簡単なのです。また、単語の位置によって主語、述語、目的誤等の役割が決まっているため、意味の解析も容易に可能です。

これらの英語ならではの要因によって、Elizaは自然な英語を話して、人間らしく見せることに成功したのでしょう。 また、1966年という、とても早い時期に出現したのも、それらの容易さが影響していると考えられます。

英語で実現するとどう見えるか?人間らしく見えるか?

試しに、英語版のEliza風の応答をする会話キャラクターを作ってみました。

http://sourceforge.jp/projects/descartes/releases/

会話キャラ:Eliza風英語版 v1.0 for Windows

ああー、果たして、せめて人間らしく見えるのでしょうか?

どうすれば、人間らしく見えるのでしょうか?

日本語で実現するとどう見えるか?人間らしく見えるか?

英語では、日本人には感覚的に人間らしいのかどうか判りにくいですね。

そこで、日本語で「文法上おかしくなく」かつ「相手の人間の話したワードやセンテンスを使う」プログラムを作成しました。

とりあえず「会話キャラ:イライザ風日本語版」として開発しました。

メッセージを工夫すれば、「猫耳メイド風」や「ツンデレ風」にも改造できます。

動作アルゴリズムを以降に説明しましょう。

2. 会話キャラクター・システムのアルゴリズム

目的は、日本語の回答が「文法上おかしくなく」かつ「相手の人間の話したワードやセンテンスを使う」会話システムです。

このために、会話キャラクター・システムには、2つの大きな要素を持たせました。

1つ目は、自然な応答メッセージを生成するElizaシステムです。 単純なのですが、合成される応答メッセージを多数用意していくと、結構自然な応答に見えてくるのではないでしょうか。 そのために、Elizaシステムのアルゴリズムを利用しています。

2つめは、入力されたメッセージから、回答を作成するためのメッセージを作成することです。 そのために、簡単なものではあるのですが日本語形態素プログラムを作成しました。 この日本語形態素解析プログラムは、規模が大きくなることを防ぎ、かつ手軽に使えるようにしたかったため、 できるだけ辞書を使わないで日本語の形態素解析を行います。 これは、日本語の意味の解析に踏み込まないで、文脈からのみで、日本語の解析にトライするプログラムという意味でもあります。 現状では、100%の形態素への分解はできないのですが、高い精度で必要な解析を行えるように工夫しました。 独立したライブラリとして書いているので、他の日本語解析プログラムにも利用できることでしょう。

2.1 会話キャラクターの決心

今回、この会話キャラクター・システムを作る上で、一つ決心したことがあります。

通常このようなプログラムは、「人工無能」と呼ばれています。 人工無能では、応答メッセージを入力された文を使った、マルコフ連鎖によって合成されることが多いでしょう。 マルコフ連鎖を利用する人工無能は、確かに意外に意味の通じる味わい深い回答を返すことも多く面白いものです。

しかし、今回作成するプログラムには、マルコフ連鎖を使わないこととしました。

マルコフ連鎖を使った人工無能は、あるキーワードから、次に続くワードを蓄積された文から確率的に計算するものです。 しかし、それでは、どこまでいっても、回答には何の意図も意思も付け加えることはできないでしょう。

今回作成する会話キャラクター・システムの現状では、人工無能と結果的にはたいした違いはありません。

しかし、将来的には会話キャラクター・システムを自然言語の入力インターフェースの基礎とし、 これに単純ではあっても論理的な記憶と推論機能を付加することによって、 シンプルではあっても「人工知能」と呼ばれるものにしていきたいという思いがあります。

デカルト言語には、このような自然言語処理、論理的な記憶、推論機能を記述できる潜在能力を充分に備えていると信じていきたいと思っています。

2.2 回答メッセージの生成

2.2.1 読み込み処理

読み込み処理では、人間の入力した文を読み込みます。

このとき、複数の文を一行で入力している可能性があります。 たとえば、「~。~。」のように途中に、「。」がある場合には、分割して複数の文に分ける処理を行っておきます

これは、こうしておくと以降の処理では、必ず1つの完結した文を想定して処理を行っていけばよくなるからです。

また、入力された文に改行やあるいは制御文字が含まれていた場合には、それはあらかじめ取り外しておきます。

制御文字は、セキュリティ上の問題や文字列のパターンマッチの邪魔になるからです。

なお、デカルト言語のプログラムでは、他の言語のような「エスケープ・シーケンス¥」は言語使用として元々採用していません。 そのため、外部からの入力文字に対して、エスケープ・シーケンスについては気にしなくて済むようになっています。

2.2.2 人称の変換

この「会話キャラクター・システム」では、入力された文の一部を流用して回答メッセージを作ります。 しかし、入力される文には、「私」や「あなた」のような人称を表す単語が含まれているかもしれません。 これをそのまま流用すると「あなたは~です」のような文をそのまま回答としてしまいます。

極端な例ではありますが、たとえば以下のようなやり取りは不自然です。


人     : あなたは、コンピュータです。
コンピュータ: あなたは、コンピュータです。

こんな場合に次のように回答すると面白いですね。


人     : あなたは、コンピュータです。
コンピュータ: 私は、コンピュータです。

このような場合に備えて入力された文では、「私」に相当する語は「あなた」に変換します。 「あなた」に相当する語は「私」に変換します。


あなた ← 私
あなた ← わたし
あなた ← あたし
あなた ← 俺
あなた ← おれ
あなた ← オレ

私 ← あなた
私 ← アナタ
私 ← おまえ
私 ← オマエ
私 ← お前
私 ← きさま
私 ← キサマ
私 ← 貴方
私 ← 貴女

この「私」や「あなた」に相当する語は、キャラクターによっては「あたし」、「おぬし」等にしておくと面白いと思います。 キャラクターの特性を示して、「キャラが立つ」状態を表現することができるでしょう。

2.2.3 応答メッセージのパターンマッチによる生成

応答メッセージは、入力された文の中を形態素解析した結果と、特定のパターンが一致したときに対応させます。 また、一つのパターンに対しては、複数の応答メッセージをテンプレートとして保持しておきます。

応答メッセージを作成する場合には、そのテンプレートの中から一つをランダムに選びだします。 これは、同じ入力文に対して、いつも同じ回答をすると、面白くなく、また、会話としても不自然で人間らしく見えなくなるからです。

たとえば、入力文の中に、「あなた は」とあった場合は以下のようなテンプレートの中から、応答メッセージを一つ選びます。


  (あなたは、~ )
  (~  、それで良かったのです)
  (~ 、それでどうなったのですか?)
  (それについてどう思いますか?)
  (私も同じです)

たとえば、人間からの入力文が、「私は、楽しいんだ」とします。 そうすると、「2.2.2 人称の変換」で説明したように、"私"を"あなた"に変換した、「あなたは、楽しいんだ」と変換します。

そして、「あなたは」の部分がパターンマッチすると、上の例で一つのテンプレートが選ばれます。 (~ 、それでどうなったのですか?)が選ばれたとしましょう。

"~"の部分には、「あなたは、~」のように"あなたは"の後の文が入力されるようにプログラムしておきます。 上の入力文だと、「楽しいんだ、それでどうなったのですか?」と応答メッセージが合成されます。


> 私は、楽しいんだ
# 楽しいんだ、それでどうなったのですか?

テンプレートは、ランダムに選ばれるため、同じ入力文に対しても、さまざまな回答が行われる可能性があります。

> 私は、楽しいんだ
# あなたは、楽しいんだ

> 私は、楽しいんだ
# 楽しいんだ、それでどうなったですか?

> 私は、楽しいんだ
# 私も同じです

> 私は、楽しいんだ
# あなたは、楽しいんだ

> 私は、楽しいんだ
# 楽しいんだ、それで良かったのです

> 私は、楽しいんだ
# 楽しいんだ、それでどうなったですか?

なお、応答メッセージのテンプレートには、問いかけや疑問文を構成するものを入れておきましょう。 これにより会話を続けて膨らませていく可能性を高めることができます。

さらに、パターンマッチするパターンは複数用意しておきます。

「こんにちは」、「こんばんは」、「~ない」、「~は、~」、「~が、~」、「いつも~」とか いろいろなパターンを用意しておいて、それぞれに対する応答メッセージのテンプレートをできる だけたくさん用意しておくのです。

パターンとテンプレートが増えれば増えるほど、多彩な会話の応答メッセージが生成されるでしょう。

2.2.4 パターン

入力文字列にたとえば、「こんにちは」が含まれていたとします。 そのときには、対応するメッセージとして「こんにちは」を返すようにしておきます。

入力文字列に、「たぶん」とあったとしたら、以下の応答メッセージのいずれかを選び、返事とします。


                (それについては、よく知らないのですか)
                (~ が、もう少し考えてみましょう)
                (たしかですか?)
                (~ について、知っていることはありますか?)

応答メッセージの「~」の部分には、入力文字列から適当なワードを抜き出して設定します。

入力メッセージに、「~は、~」のパターンがあった場合は次に示すような応答メッセージから選びます。


               (~ はどうなるのでしょうか?)
               (それが ~ ですね)
               (~ についてどう思いますか)
               (~ はどうでしょうか)
               (こうなると ~ に期待できますね)
               (おそらく、 ~ のことだと思います)
               (~ について話してください)
               (一般的な ~ ですね)
               (~ なんて思いつかないです)
               (でも、 ~ は本当はこんなものじゃないですよね)
               (~ ということですね)
               (~ は、本質ですね)
               (~ の狙いは何でしょうか)
               (~ の問題は何でしょうか)
               (~ を実感できました)
               (~ には、ワクワクしますね)
               (なんと! ~ とは!!)

パターンとのマッチングは、該当するワードがあっても、必ず行うわけではありません。 ランダムに乱数によって、パターンマッチするかどうかを決めるようにします。 そのため、入力文字列に該当するパターンが、複数あった場合には、どのような応答をするかはいつも変わることになります。 それによって、多彩な応答ができることを狙っています。

2.2.5 パターンマッチしなかった場合の応答メッセージ

さらに、もう一つ重要な場合があります。 それは、用意したどのパターンにも合致しない場合です。

このような場合にも、何か返答する必要があります。 それは、相槌であったり、次の発言を促したり、それまでの発言に対する反応をしたりすると、自然な会話に見えるのではないでしょうか。

そのために、以下のような応答メッセージのテンプレートを用意します。


                 (ふむ、ふむ)
                (なるほど)
                (そんなことあるわけないです!)
                (そうなんですね)
                (それで、どうなるのですか?)
                (わかりますよ)
                (えーっと)
                (そうですか)
                (えっ)
                (どうしましょう)
                (どうでしょう)
                (どうですか)
                (嘘ですか)
                (思わせぶりですね)
                (何ですか、それは)
                (あなたね!)
                (教えてください)
                (ははは)
                (へへぇー)
                (ふふふ)
                (へー)
                (へぇー)
                (えぇ)
                (えー)

これらのテンプレートの文章は、会話の中のどのような場合に出てきても、不自然にならないようなメッセージを選ぶ必要があります。

また、用意したどのパターンにも合致しない場合は、実際の会話の中では多々あるでしょう。 そのため、この場合の回答メッセージの種類は多く用意しておかなければなりません。 応答メッセージの種類の数が少ないと、どうしても同じような回答が続くことになるためです。

2.2.6 応答メッセージによるキャラ付け

応答メッセージを工夫することにより、会話キャラクターに「キャラ付け」することができます。

小説やマンガなどで考えてみてください。 主人公は特徴のある喋り方をしていないでしょうか。 また、脇役でも重要な役割を果たす者はやはり特徴的な話し方をして、他のキャラクターより目立つのではないでしょうか。

そのような独特の話し方により、登場人物の「キャラ付け」をすることによって、キャラを立てているのです。

では、話し方にどのような特徴をつければよいのでしょうか?考えてみましょう。

まず、マンガやアニメでは、自分のことや相手を呼ぶときに独特の言い方をしていることがあります。

これは、前の項「2.2.2 人称の変換」で説明した話です。


              わし、あたい、拙者、ミー、あちき
              きさま、アナタ、おぬし、ユー、おまえ

次に、語尾が特徴的なキャラクターは、識別しやすく個性的に思えます。


             
             そんなことあるわけないですにゃ!

さらに、独特の決め台詞を持っている場合には、それを諸所で話すように設定しておくと、そのキャラらしさが引き立ちます。


             思わせぶりですにゃ

このあたりは、既存のマンガやアニメキャラクターなどに合わせて設定することもできるでしょう。

そうすると、好きなマンガやアニメキャラクターと話しているように錯覚するような会話キャラクターを実現できるかもしれませんよ。

2.3 形態素の解析

2.3.1 形態素とは

形態素解析器では、入力文を単語単位に分割します。 英語などの言語では、単語間が空白で区切られているので、単語の認識は割りと簡単に行えます。 しかし、日本語は英語のように単語同士が空白で区切られていません。 日本語解析をするためにはまず文を形態素に分解する必要があります。

2.3.2 形態素解析の例

たとえば、以下のような文があったとします。


デカルト言語は、論理的な推論を中心とした言語として設計しました

これを以下のように、文節で区切って形態素として分解します。


デカルト言語 は 論理的 な 推論 を 中心 とした 言語 として 設計 しました

主語を抜き出すために、「~ は」のパターンで抜き出して、「~」の部分を後の処理で利用できます。 また、目的語は、「~ を」のパターンをサーチして抜き出せばよいのです。

しかし、これが例えば以下のように、うまく分解できない場合には、以降の処理が難しくなります。


デカルト言 語は論理的な推 論を中心とした言 語とし て設計しました

「~ は」も「~ を」のパターンも見つけられなくなります。

「語は論理的な推」とか「論を中心とした言」とか、人間が見ても訳がわからないですね。 ちゃんと意味のある単位で分解しなければなりません。

2.3.3 形態素解析のプログラム

形態素解析のソフトには、有名なものがいくつもあります。


KAKASI(kanji kana simple inverter:kakasi.namazu.org
MeCab(和布蕪: mecab.sourceforge.net
ChaSen(茶筌): chasen.naist.jp
Juman: nlp.kuee.kyoto-u.ac.jp

しかし、デカルト言語で書かれた形態素解析プログラムがあれば、デカルト言語のプログラムから直接効率よく呼び出せて便利です。

そこで、この会話キャラクターのプログラムは、形態素解析を行うプログラムをライブラリとして内蔵させました。

2.3.4 形態素解析のアルゴリズム

会話キャラクター・システムに組み込んだ形態素解析プログラムは、大きく3つの要素に入力文を分けて処理します。

ここでの3つの要素とは、「格」、「述語」および「その他」です。

この3つの要素で文を解析していきます。しかし、途中でおかしな解析結果になってしまった場合には、デカルト言語のバックトラック機能を 使って再実行しながら自動的に矛盾のないように調整します。 そして、入力された文を動的に3つの要素に当てはめ試行錯誤した結果、最も適切な形態素解析した結果を返すように、 この形態素解析プログラムは動作します。

まず、「格」は、「~は」、「~が」のような格助詞によって文を分解します。 「わたしは」とあれば、「わたし」と「は」を組として認識し、形態素として分解してリストにします。


  わたしは  → (わたし は)
 カフェに  → (カフェ に)
 イメージが → (イメージ が)
 対象として → (対象 として)
 誰よりも  → (誰 よりも)

基本的には、格として助詞以外にも格助詞に係助詞や接続助詞などを接続した「として」や「よりも」の 様な語も使い「格」として認識できるようにします。

このような格を300ほど登録して、格と識別できるようにすると、たいていの日本語の文章に対応できるようになりました。

次の要素は、「述語」です。

これは、文の最後の述語の部分を、格と同様に「~です」、「~でした」のような形式に文を分解します。 しかし、述語が、2つの語の組み合わせで分解できない場合は、そのまま1つの形態素としてリスト化します。

「りんごです」とあれば、「りんご」と「です」を組として認識し、形態素として分解ししてリストにします。 「行われます」とあれば、「行われます」を形態素とします。


 りんごです → (りんご です)
 分解します → (分解 します)
 行われます → (行われます)

このような述語を80ほど登録しておくと、たいていの日本語の文章に対応できるようになりました。

しかし、日本語には、単純に述語で終わるわけではない文章、例えば体言止めのような文の形式があります。 そのような場合には、登録された情報からは述語と解釈できなくても、文の終わりの部分をそのまま述語と解釈するようにしています。 これにより、体言止めのような文に対しても対応できるようになりました。


 目の前の花です → (目 の) (前 の) (花 です)
 目の前の花   → (目 の) (前 の) (花)
 

最後の要素は、「その他」です。「格」でも「述語」でもない要素を解析します。

「その他」の対象となるものには、「そして」、「そこで」のような接続詞や、「そのために」、「どういうわけか」のように格でも述語でも処理できない語を対象とします。


 しかし     → (しかし)
 そのために   → (そのために)
 そのとき    → (そのとき)
 どういうわけか → (どういうわけか)
 もともと    → (もともと)
 もちろん    → (もちろん)

このような述語を200ほど登録して対応できるようになりました。

ここまでに示したような、「格」、「述語」および「その他」の処理により、日本語の形態素解析を行います。 デカルト言語を使うと、ステップ数にして、全体で1 k Stepsほどの処理で、このような形態素解析のプログラムが実行できてしまいます。


 (デカルト言語 を)
 (使 う)
 (と)
 (ステップ数 にして)
 (全体 で)
 (1 k Stepsほど の) (処理 で)
 (このような) (形態素解析 の) (プログラム が)
 (実行できてしまいます)