ELIZA(4)DOCTOR スクリプト

2019/04/04
藤田昭人


またまた間が開いてしまいましたが・・・

前回のページでは ELIZA のスクリプトの記法を紹介しながらスクリプト・エンジンの動作を追っかけてみましたが、このページでは(かの有名な) DOCTOR スクリプトの振る舞いを追っかけてみたいと思います。ELIZA(1)のページでも紹介したようにこのスクリプトは「精神分析医を模倣した傾聴的振る舞いをする」ことで知られていますが、実はここにELIZAの心理学的トリックが仕込まれていました。 少し長くなりますが、このトリックについて Weizenbaum は論文の Discussion の項で次のように述べています。

At this writing, the only serious ELIZA scripts which exist are some which cause ELIZA to respond roughly as would certain psychotherapists (Rogerians). ELIZA performs best when its human correspondent is initially instructed to "talk" to it, via the typewriter of course, just as one would to a psychiatrist. This mode of conversation was chosen because the psychiatric interview is one of the few examples of categorized dyadic natural language communication in which one of the participating pair is free to assume the pose of knowing almost nothing of the real world. If, for example, one were to tell a psychiatrist "I went for a long boat ride" and he responded "Tell me about boats", one would not assume that he knew nothing about boats, but that he had some purpose in so directing the subsequent conversation. It is important to note that this assumption is one made by the speaker. Whether it is realistic or not is art altogether separate question. In any case, it has a crucial psychological utility in that it serves the speaker to maintain his sense of being heard and understood. The Speaker further defends his impression (which even in real life may be illusory) by attributing to his conversation partner all sorts of background knowledge, insights and reasoning ability. But again, these are the speaker's contribution to the conversation. They manifest themselves inferentially in the interpretations he makes of the offered responses. From the purely technical programming point of view then, the psychiatric interview form of an ELIZA script has the advantage that it eliminates the need of storing explicit information about the real world.

これを書いている時点で、存在する唯一の真面目なELIZAスクリプトは ELIZA にロジャー派の心理療法士が行うインタビューとよく似た反応をさせるものです。ELIZA はタイプライターを介して、その人間の対話者が初めて精神科医に行うのと同じように、それに「話しかける」ように初めて指示されたときに最も効果的な対話をします。精神学的なインタビューは参加しているペアのうちのひとりが、現実の世界についてほとんど何も知らないという態度をとることができるという2者間の自然言語コミュニケーションの数少ない事例の1つであることから、この会話モードが選択されました。例えば、ある人が精神科医に「私は長いボートに乗りました」と言った場合に「ボートについて教えてください」と答えたとしても、彼がボートについて何も知らなかったとは思わないでしょう。彼がその後の会話を促すという目的を持っていると仮定できます。この仮定が対話者によってなされたものであることに注意することが大事です。それが現実的であるかどうかはまったく別の問題で、いずれにせよ、「それが対話者に聞いてもらえて理解されている」という感覚を維持するために役立つという点で重大な心理的な有用性があります。さらに対話者は、会話相手にあらゆる背景知識、洞察力および推論能力を動員することによって(実際の生活においても幻想的であるかもしれない)彼の印象を守ります。これらもまた対話者の対話への貢献です。提示された回答について彼が行った解釈の中で推論として現れています。また(メモリの記憶容量が小さかったという)当時のプログラミングの技術的な観点からみても、ELIZAスクリプトの精神医学的インタビューの形式が実社会に関する明示的な情報を格納する必要がないという利点も持っています。

ここで述べられているように、そもそも「精神医学的インタビュー」という形式こそが ELIZA の傾聴能力を実現するための最初のトリックだったという訳です。そこで実際の DOCTOR スクリプトをステップ・バイ・ステップで追っかけて、ELIZA の心理学的トリックの詳細を明らかにしようというのが、このページのテーマです。


ELIZAの応答メッセージの生成手順のおさらい

前回のページで説明した ELIZA の応答メッセージの作り方をおさらいしましょう。 ELIZAは対話相手である人間が直前に入力した文だけを使って応答メッセージを生成し、それは次の7つの手順を取ると説明したました。

  タグ 説明
  入力文をスペースで区切られた単語に分割(いわゆる形態素解析)を行う。
pre 入力文に対し一連の事前の文字列置き換えを行う。
key 入力文の全ての単語を走査しキーワードリストを作成し、以降はキーワード毎に処理を行う。
decomp 与えられたキーワードに対し分解パターン(decomposition pattern)をマッチさせ、最初に一致した要素を選択する。
assemble 分解パターンに対応する再構成パターン(reassembly pattern)を選択する。
post 生成された応答文に対し一連の事後の文字列置き換えを行う。
  応答文を出力する。

ELIZAとの会話の追跡ではそのうちの5つのステップをトレースすることにします。 応答メッセージ生成処理は2、3、4が中核で、各々キーワード、分解パターン、複数の再構成パターンが表示します。 1では、2あるいは3が上手く機能するように入力メッセージを部分的に書き換える処理を行なっています。 5では、入力メッセージの4の再構成パターンから合成した応答メッセージに主に人称を変更をする書き換えを行なっています。 また PUSH/POP のタグは前回も説明したELIZAのメッセージを記録しておく機構が動いていることを意味します。 一連のメッセージ書き換えを手順にしたがって追えるので ELIZA が比較的簡単な方法で応答メッセージを生成していることがよくわかります。

以上、スクリプトの技術的な側面は一通り説明しましたが、 せっかくなのでスクリプトの会話的な側面(心理学的側面?)についても考えてみます。 人間どおしのマンツーマンで行う会話をちょっと想像してみてください。 実際、誰かと話をしている時は「相手の発言にどのように返答するか?」を考えながら会話をしますよね? 多くの場合、挨拶などの決まり切ったやりとりや会話の相手との間で自明なことについてはあまり考えずに即座に返答することができます。 ですが、初対面の人や非常にシリアスな会話(例えば、悩みの相談に乗るとか…)の場合、返事の言葉を選んだりします。 会話相手を傷つけないような言葉を選んだり、相手に忖度したり、あるいは自分の思いや意見を率直に述べたり… 会話は案外頭を使う作業であることが多いし、考えても良い返事を思いつかないことがママあります。

ELIZAの応答メッセージの生成とは、この返事を考えるプロセスをコンピュータにシミュレートさせているとも言えます。 でも実際に ELIZA が返事そのものを考えている訳ではなくて「こういうキーワードが発言されたら、このような返事を返す」式のQ&A集をスクリプトに記述してます。 なので、返事を考えているのはスクリプトを書いた人で、ELIZAはそれを適切に選んで表示しているだけです。これが ELIZA が人工無脳と呼ばれている理由です。 ここではスクリプトを書く人になったつもりで、相手からこういう言葉を聞いた時に相手は何を考えているか想像しながら、 ELIZA のスクリプト(DOCTOR)が用意している応答メッセージを意味的にもチェックしてみます。


ELIZA論文の対話例で追っかけてみる

…と言うことで、ELIZAプログラムにちょっと細工をして、論文に掲載されている対話例を実行してみました。

さらに、実行ログにはメッセージ生成の追跡に役立つ情報を手作業で挿入しました。 入力メッセージには行の先頭に ">>>" を、出力メッセージには行の先頭に "<<<" を表示するようにしました。 "---" で始まる日本語文は例によって Google 翻訳の結果を後で挿入しました。 生成の過程が追いやすいように、assembleでは定義されている全パターンを挿入しています。ELIZAが選択したパターンは行の先頭を '>' でマークしています。 また類義語を参照しているところでは synon のワードリストも挿入しました。

では、ステップ・バイ・ステップで見ていきましょう。


--- こんにちは
>>> Hello.
      pre: hello
      key: hello
   decomp: *
>assemble: How do you do.  Please state your problem.
 assemble: Hi.  What seems to be your problem ?
     post: How do you do.  Please state your problem.
<<< How do you do.  Please state your problem.
--- ごきげんよう。あなたの問題を述べてください。

これは挨拶のような慣用表現に対して決まり切った応答を返す例です。 技術的には decomp は '*' で素通して、assemble を複数用意するELIZA スクリプトの記述の基本形でもあります。 応答メッセージを複数用意しておくと ELIZA は順繰りに(ラウンドロビンで)選択してくれるので、対話者の決まり切ってる感を多少和らげてくれます。

会話的には、この例では2つしか定義されてませんが、会話中になんども Hello という人間はいない訳で…


--- 男性はみんな似ている。
>>> Men are all alike.
      pre: men are all alike
      key: alike
   decomp: *
>assemble: In what way ?
 assemble: What resemblance do you see ?
 assemble: What does that similarity suggest to you ?
 assemble: What other connections do you see ?
 assemble: What do you suppose that resemblance means ?
 assemble: What is the connection, do you suppose ?
 assemble: Could there really be some connection ?
 assemble: How ?
     post: In what way ?
<<< In what way ?
--- どのように?

これも基本形の記述です。技術的には前項と同じ。

会話的にはキーワード 'alike'(同様の)に対する応答メッセージがたくさん並んでます。

* どうやって?(In what way ?)
* どのような類似性がありますか?
* その類似性はあなたに何を示唆していますか?
* 他にどのようなつながりがありますか?
* 似ているとはどういう意味ですか?
* その関係は何だとあなたは思いますか?
* 本当に何らかの関係があるのでしょうか?
* どうやって ?(How ?)

いずれも alike の状態について具体的な説明を促すメッセージに見えます。 もちろん精神医学的なインタビューを想定しているから返せる応答ではありますが…


--- 彼らはいつも何か他のものについて私たちを悩ませています。
>>> They're always bugging us about something or other.
      pre: they're always bugging us about something or other
      key: always
   decomp: *
>assemble: Can you think of a specific example ?
 assemble: When ?
 assemble: What incident are you thinking of ?
 assemble: Really, always ?
     post: Can you think of a specific example ?
<<< Can you think of a specific example ?
--- 特定の例を考えていただけますか。

これまた基本形の記述です。技術的には前項と同じ。

会話的にはキーワード 'always' (いつも、いつでも)から想定できる応答メッセージになっています。

* あなたは特定の例を考えることができますか?
* いつ?
* あなたはどんな出来事を考えていますか?
* 本当にいつでも?

対話者には、肯定的にいつも(always)繰り返される出来事について説明を求めている応答メッセージと 懐疑的に「本当にいつでも?」と認識の確かさを問い返す応答メッセージが定義されています。 傾聴のルールでは対話者には肯定的に反応することが原則ですが、 敢えて懐疑的に反応させるケースを挿入するのは、 その方が人間が応対しているような印象を与えやすいという事でしょうか?


--- はい、私のボーイフレンドが私をここに来させました。
>>> Well, my boyfriend made me come here.
      pre: well
      pre: my boyfriend made me come here
      key: my
   decomp: $* my *
 assemble: Lets discuss further why your (2).
 assemble: Earlier you said your (2).
>assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: But your boyfriend made you come here .
   decomp: * my *
>assemble: Your (2) ?
 assemble: Why do you say your (2) ?
 assemble: Does that suggest anything else which belongs to you ?
 assemble: Is it important that your (2) ?
     post: Your boyfriend made you come here  ?
<<< Your boyfriend made you come here  ?
--- あなたのボーイフレンドがあなたをここに来させましたか?

技術的には、これはdecompの分解パターンをフルに活用した事例です。 1つ目のdecompのパターンには先頭に '$' が付いていますが、これはメッセージを表示させず内部で記録させる指示マーカーです。 前回のページでも説明したように、 対話者からの入力メッセージから応答メッセージが作れなかった場合、ELIZAはデフォルトの応答メッセージを採用する前に使用できる応答メッセージを随時記録します。 そのため「そういえばさっきXXXって言いましたよね?」的な応答メッセージをここでは生成しています。 2つ目のdecompのパターンで実際に表示される応答メッセージを生成しています。パターンは '* my * ' とありますが、 これは入力メッセージから my というキーワードを探し、その前のワードリストとその後のワードリストに分けることを意味しています。 再構成パターンでは前のワードリストを(1)として後のワードリストを(2)として引用することができます。 ここでは "my boyfriend made me come here" から "your boyfriend made me come here" を作り出していますが、 仮に "Why do you say your (2) ?" や "Is it important that your (2) ?" が選択されてもおかしな文にはなりませんよね? ELIZA は応答メッセージ生成で英語やドイツ語といったラテン語系の自然言語を仮定しているので、こういう操作が可能になります。

会話的には、傾聴の要件である対話者の発言の一部を繰り返す反復の応答メッセージが生成されています。 1つ目のdecompでは、後の会話で話題を変更するために用いられることを想定しています。

* あなたの(2)が何故なのか、さらに議論しましょう。
* あなたは以前、あなたの(2)と言いましたよね?
* しかし、あなたの(2)
* それはあなたの(2)という事実と何か関係がありますか?

もちろん、このメッセージが呼び出される時、その会話の内容を ELIZA は理解してません。 ですが、唐突にこのようなメッセージが帰って来れば、対話者は「あ、さっきの話ね」と機転を聞かせてくれるでしょう。 2つ目のdecompでは(2)が表現する何かについて確認する、あるいはさらに詳しい説明を求める応答メッセージが生成されます。

* あなたの(2)?
* 何故あなたは、あなたの(2)だと言うのですか?
* それはあなたに属する何か他のことを示唆していますか?
* あなたの(2)が重要ですか?

このような、対話者に「聞いてもらえてる。理解してもらえてる。」実感を演出するところが、ELIZA が傾聴するシステムとされる理由でしょう。


--- 彼は私がいつも落ち込んでいると言います。
>>> He says I'm depressed much of the time.
      pre: he says i am depressed much of the time
      key: i
   decomp: * i am* @sad *
    synon: sad unhappy depressed sick
>assemble: I am sorry to hear that you are (3).
 assemble: Do you think that coming here will help you not to be (3) ?
 assemble: I'm sure it's not pleasant to be (3).
 assemble: Can you explain what made you (3) ?
     post: I am sorry to hear that you are depressed.
<<< I am sorry to hear that you are depressed.
--- あなたが落ち込んでいるのを聞いて私は残念です。

技術的には、これは synon を使った応答メッセージの生成事例です。decomp の分解パターンで@から始まるワード(ここではsad)は synon で定義されているワードリストの全てのワードとのマッチが試みられます。この synon は assembleの再構成パターンでも考慮されます。ここで使われている '* i am* @sad *' のパターンでは2つの '*' に続き3番目に@sadが登場するので、再構成パターンでは(3)として 'depressed' が採用されます。Weizenbaumの論文でも丁寧に説明されていたかと思います。

会話的には(3)、すなわち対話者の @sad で定義されているネガティブな状況にフォーカスした応答メッセージが生成されています。

* あなたが(3)であると聞いて私は残念です。
* あなたはここに来ることが、あなたが(3)でなくなることに役立つと思いますか?
* (3)になるのは楽しいことではないと、私にはわかってます。
* あなたを(3)にしている理由をあなたは説明できますか?

メッセージはいずれも対話者を理解・同情する内容で「本当に @sad なんですか?」といった懐疑的あるいは否定的な内容は含まれません。 key が i である場合、それは対話者自身に関する発言と見なして、傾聴のルールがしっかり守られているのでしょう。


--- それは本当です。私は幸せではありません。
>>> It's true. I am unhappy
      pre: it's true
      pre: i am unhappy
      key: i
   decomp: * i am* @sad *
    synon: sad unhappy depressed sick
 assemble: I am sorry to hear that you are (3).
>assemble: Do you think that coming here will help you not to be (3) ?
 assemble: I'm sure it's not pleasant to be (3).
 assemble: Can you explain what made you (3) ?
     post: Do you think that coming here will help you not to be unhappy ?
<<< Do you think that coming here will help you not to be unhappy ?
--- ここに来ることはあなたが不幸にならないために役立つと思いますか?

これは技術的にも会話的にもほぼ前項と同じの synon を使った応答メッセージの生成事例です。 技術的には同じマッチング・ルールが連続して適用されたので assemble の次のメッセージを選択されています。 会話的には…もし対話者が表現を変えてなんども同じ事を発言する人物だった場合、 assemble のメッセージが4つだけでは直ぐに循環してしまうだろうなということぐらいです。もっとたくさんメッセージを用意する。 あるいは技術的に連続して同じマッチングルールが頻繁に適用された場合には、 格納されている応答メッセージを取り出して話題を変更させるロジックを組み入れる事を考えても良いかも。 実際の人間同士の会話でもよくありますよね?同じ事を何度も言う人間との会話で、強引に話題を変えたりすることが…


--- 私はいくらか助けを必要とします、それは確かにそうです。
>>> I need some help, that much seems certain.
      pre: i need some help
      key: i
   decomp: * i @desire *
    synon: desire want need
>assemble: What would it mean to you if you got (3) ?
 assemble: Why do you want (3) ?
 assemble: Suppose you got (3) soon ?
 assemble: What if you never got (3) ?
 assemble: What would getting (3) mean to you ?
 assemble: What does wanting (3) have to do with this discussion ?
     post: What would it mean to you if you got some help  ?
<<< What would it mean to you if you got some help  ?
--- あなたが何らかの助けを得た場合、それはあなたにとって何を意味するのでしょうか?

これも前項、前々項と同じ synon を使った応答メッセージの生成事例です。 ただマッチしたパターンが@desireですのでassembleのメッセージ・セットが変わります。

* あなたが(3)を手に入れたら、それはあなたにとって何を意味するのでしょうか?
* なぜ、あなたは(3)が欲しいのですか?
* すぐに(3)を手に入れたらどうでしょうか?
* あなたが(3)を持っていない場合はどうなりますか?
* (3)を得ることはあなたにとって何を意味するのでしょうか?
* (3)と思うことは、この議論と何の関係があるのでしょうか?

会話的には @desire は対話者の望みを語る表現ですので理解・同情ではなく詳細の説明を求める応答メッセージが並んでいます。 これが人間同士の会話であれば対話者の望みを叶える応答か、 「そうだったら良いのにね」と理解・同情する応答を返すところですが、 対話者に望みをさらに具体的に語らせる応答をするのは精神医学的なインタビューだからでしょうか?


--- 多分私は私の母と仲良くすることを学ぶことができるでしょう。
>>> Perhaps I could learn to get along with my mother.
      pre: perhaps i could learn to get along with my mother
      key: my
   decomp: $* my *
 assemble: Let's discuss further why your (2).
 assemble: Earlier you said your (2).
>assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: But your mother .
   decomp: * my* @family *
    synon: family mother mom father dad sister brother wife children child
>assemble: Tell me more about your family.
 assemble: Who else in your family (4) ?
 assemble: Your (3) ?
 assemble: What else comes to mind when you think of your (3) ?
     post: Tell me more about your family.
<<< Tell me more about your family.
--- あなたの家族についてもっと教えてください。

これは技術的には既出の '$* my * ' の分解パターンと synon @family を使った応答パターンを組み合わせた事例です。 スクリプトを見てもらうとわかるように key 'my' には多数の decomp が定義されています。 会話的には「私の」とつく対話者の周辺に関わる発言には様々な応答メッセージが用意されていることから、 対話者は「私」以外の自分の周辺について語りやすいのかもしれません。 ここでは decomp '* my* @family * ' のメッセージ・セットを覗いてみると…

* あなたの家族についてもっと教えてください。
* あなたの家族は他に誰が(4)ますか?
* あなたの(3)?
* あなたの(3)について考えるとき、あなたは他に何が思い浮かべますか?

ELIZA は家族に関してより詳細な情報を求める応答メッセージを返すようです。 確かに精神医学的インタビューの会話法をなぞっているように見えます。


--- 私の母は私の面倒をみてくれます
>>> My mother takes care of me.
      pre: my mother takes care of me
      key: my
   decomp: $* my *
 assemble: Let's discuss further why your (2).
>assemble: Earlier you said your (2).
 assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: Earlier you said your mother takes care of you .
   decomp: * my* @family *
    synon: family mother mom father dad sister brother wife children child
 assemble: Tell me more about your family.
>assemble: Who else in your family (4) ?
 assemble: Your (3) ?
 assemble: What else comes to mind when you think of your (3) ?
     post: Who else in your family takes care of you  ?
<<< Who else in your family takes care of you  ?
--- あなたの家族の他の誰があなたの面倒をみてくれますか?

これは技術的にも会話的にもほぼ前項と同じの応答メッセージの生成事例です。 メッセージ・セットが巧妙に出来てるので、対話者は母親に関する発言からELIZAに別の家族に関する質問をされてしまいました。


--- お父さん。
>>> My father.
      pre: my father
      key: my
   decomp: $* my *
>assemble: Let's discuss further why your (2).
 assemble: Earlier you said your (2).
 assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: Let's discuss further why your father .
   decomp: * my* @family *
 assemble: Tell me more about your family.
 assemble: Who else in your family (4) ?
>assemble: Your (3) ?
 assemble: What else comes to mind when you think of your (3) ?
     post: Your father ?
<<< Your father ?
--- あなたのお父さん ?

これは技術的にも会話的にもほぼ前項と同じの応答メッセージの生成事例です。 対話者は父親に関する発言をさせられてしまいました。 おそらく、対話者にとって父親はあまり触れられたくないことだったのではないでしょうか? でも ELIZA は容赦しません。父親について反復してます。


--- あなたは私の父のようなものです。
>>> You are like my father in some ways.
      pre: you are like my father in some ways
      key: like
   decomp: * @be *like *
    synon: be am is are was
 assemble: goto alike
      key: alike
   decomp: *
 assemble: In what way ?
>assemble: What resemblance do you see ?
 assemble: What does that similarity suggest to you ?
 assemble: What other connections do you see ?
 assemble: What do you suppose that resemblance means ?
 assemble: What is the connection, do you suppose ?
 assemble: Could there really be some connection ?
 assemble: How ?
     post: What resemblance do you see ?
<<< What resemblance do you see ?
--- どのような類似性がありますか?

技術的には assemble の goto ルールで key 'alike' のルール・セットに切り替えられている事例です。 英語の場合 @be like は alike と同じ意味(同じとか似ているとか)を表すと言うことでしょうか?

会話的には対話者は父親について直接的な評価を避けたように見えます。 が、やはり ELIZA は容赦しません。父親について更なる説明を求めています。


--- あなたはそれほど積極的ではありませんが、私にそれに気付かせたくないと思います。
>>> You are not very aggressive but I think you don't want me to notice that.
      pre: you are not very aggressive but i think you don't want me to notice that
      key: you
   decomp: * you are *
>assemble: What makes you think I am (2) ?
 assemble: Does it please you to believe I am (2) ?
 assemble: Do you sometimes wish you were (2) ?
 assemble: Perhaps you would like to be (2).
     post: What makes you think I am not very aggressive but you think I don't want you to notice that  ?
<<< What makes you think I am not very aggressive but you think I don't want you to notice that  ?
--- 私がそれほど積極的ではないと思うのはなぜでしょうか。

この会話で初めて key: 'you' と decomp: '* you are *' のルール・セットが選択されました。 これは対話者が ELIZA を話題にし始めた事を意味します。応答のメッセージ・セットは以下の通りです。

* あなたは私が(2)だと思う理由は何ですか?
* 私が(2)であると信じていいですか?
* あなたは時々あなたが(2)であることを望みますか?
* おそらくあなたが(2)になりたいと思うでしょう。

会話的には父親への論評を避けたい対話者は、よく似ている(と思っている)ELIZA に対して批評を始めたからだと思います。 もっとも、一般的な ELIZA との会話において ELIZA への批判は最も頻出する話題だと想像出来ますので、 そこでの知見に基づいているであろう key: 'you' 以下のルールセットは非常に洗練されている事は容易に想像できます。 対話者は ELIZA(と父親)が積極的でないと感じる理由を説明しなければならなくなりました。


--- あなたは私と議論しません。
>>> You don't argue with me.
      pre: you don't argue with me
      key: you
   decomp: * you* me *
>assemble: Why do you think I (2) you ?
 assemble: You like to think I (2) you -- don't you ?
 assemble: What makes you think I (2) you ?
 assemble: Really, I (2) you ?
 assemble: Do you wish to believe I (2) you ?
 assemble: Suppose I did (2) you -- what would that mean ?
 assemble: Does someone else believe I (2) you ?
     post: Why do you think I don't argue with you ?
<<< Why do you think I don't argue with you ?
--- なぜあなたは私があなたと議論しないと思いますか?

ここでは前項と類似の key: 'you' と decomp: '* you* me *' のルール・セットが選択されました。 対話者の発言は「あなたが私に〜した」と言うパターンにマッチしてます。応答のメッセージ・セットは次の通りです。

* あなたは何故、私があなたに(2)したと思いますか?
* あなたは私があなたに(2)したと思うのが好きですね -- 違いますか?
* 私があなたに(2)したことをあなたはどう思いますか?
* 本当に、私があなたに(2)しましたか?
* 私にあなたに(2)したと信じることをあなたは望みますか?
* 私があなたに(2)をやったとしましょう -- それにはどういう意味がありますか?
* 私があなたに(2)したと他の誰かが信じますか?

全てが質問の形になっているので対話者には更なる説明が求められています。 抗議に対する受け答えの問答集のようにも見えますね。 この種の攻撃的な発言には ELIZA は鉄壁なように思えます。


--- あなたは私を恐れています。
>>> You are afraid of me.
      pre: you are afraid of me
      key: you
   decomp: * you are *
 assemble: What makes you think I am (2) ?
>assemble: Does it please you to believe I am (2) ?
 assemble: Do you sometimes wish you were (2) ?
 assemble: Perhaps you would like to be (2).
     post: Does it please you to believe I am afraid of you  ?
<<< Does it please you to believe I am afraid of you  ?
--- 私があなたを恐れていると信じてよいですか?

これは技術的には前々項と同じ応答メッセージの生成事例です。 会話的には対話者は自分の素直な印象を答えているように見えます。 が、ELIZA からは容赦無く鉄壁のメッセージ・セットから更なる質問が繰り出されます。


--- 私の父は皆を恐れている。
>>> My father is afraid of everybody.
      pre: my father is afraid of everybody
      key: my
   decomp: $* my *
>assemble: Lets discuss further why your (2).
 assemble: Earlier you said your (2).
 assemble: But your (2).
 assemble: Does that have anything to do with the fact that your (2) ?
     PUSH: Lets discuss further why your father is afraid of everybody .
   decomp: * my* @family *
    synon: family mother mom father dad sister brother wife children child
 assemble: Tell me more about your family.
 assemble: Who else in your family (4) ?
 assemble: Your (3) ?
>assemble: What else comes to mind when you think of your (3) ?
     post: What else comes to mind when you think of your father ?
<<< What else comes to mind when you think of your father ?
--- あなたがあなたの父について考えるとき、他に何が思い浮かぶのですか?

これは技術的には既出の '$* my * ' と '* my* @family * ' のパターンの組み合わせです。 会話的には、答えに窮した(と思われる)対話者が(伏せておきたかったと思われる)自分の父親の話を持ち出します。 彼女の父親に対する感情が剥き出しになってきている感じがします。 精神医学的インタビューとしてはこれは成功なんでしょうねぇ。 ですが、ELIZA はメッセージ・セットにしたがってもうひと押しします。


--- いじめっ子。
>>> Bullies.
      pre: bullies
      POP: But your boyfriend made you come here .
<<< But your boyfriend made you come here .
--- しかし、あなたの彼氏はあなたをここに来させました。

対話者のこの発言は本音の呟きのようにも見えます。 技術的には ELIZA のルールセットには全くマッチしないので、 ここでようやく保管していた応答メッセージが呼び出されました。 会話的は…対話者はELIZAの父親に関する質問攻勢からようやく解放されて、ちょっと安堵したのではないでしょうか?


このようにして対話者が終了を宣言するまで、ELIZAとの会話は続いていきます。


まとめ

随分長くなってしまった…
お付き合いいただいた皆さん、お疲れ様でした。

このページではELIZA論文に掲載されている対話例を使ってELIZA内部でどのように応答メッセージを生成しているかトレースしてみました。 前回のページで紹介したスクリプト・エンジンの動作が具体的に示せたかと思います。 さらにELIZAが提供する傾聴的対話はELIZA本体ではなくDOCTORスクリプトによって支えられていることも納得していただけたでしょう。

僕自身の感想はと言うと…
ELIZA を始祖とする人工無脳が流行った 1980 年あたりに聞いた話では「対話システムは入力された文字列から特徴的なキーワードを取り出して、それにふさわしい応答文を返す」と言ったものだったのですが、今回、実際にELIZAでヒットした分解パターン(decomp)は次のような予想外の(英語が苦手な僕にも)平易なワードで構成されたものでした。

   decomp: *
   decomp: * @be *like *
   decomp: * i @desire *
   decomp: * i am* @sad *
   decomp: * my *
   decomp: * my* @family *
   decomp: * you are *
   decomp: * you* me *

おそらくネイティブスピーカーはこのパターンに意味的な何かが感じ取れるのでしょうが、僕には全くピンと来ませんで、40年前にELIZAの日本語化や独自の人工無脳の作成を志した人たちでもそれ同じだったんだろうなぁ…と思いました。日本語での会話を前提に「ELIZAの方法を単純に真似るやり方は上手くいかない」と言う話を聞いた記憶があります。その後、日本の人工無脳の開発者たちがどう言うアプローチを取ったのか?はもう少し調べてみたいと思います。

そもそも Weizenbaum(と彼の研究グループ)は、どうやってこの DOCTOR スクリプトを作ったのでしょうねぇ?そのヒントは ELIZA 論文にちょこっとだけ出てきます。オリジナルの ELIZA にはエディタを起動する機能がついていたそうで、それを使って ELIZA の動作中にスクリプトの追加・修正・削除が随時できたのだそうです。で、エディタを終了すると、更新されたスクリプトが有効になるような仕掛けになってたとか。この仕掛けを Weizenbaum は随分気に入っていたようで、論文で次のように語っています。

An important consequence of the editing facility built into ELIZA is that a given ELIZA script need not start out to be a large, full-blown scenario. On the contrary, it should begin as a quite modest set of keywords and transformation rules and permitted to be grown and molded as experience with it builds up. This appears to be the best way to use a truly interactive man-machine facility -- i.e., not as a device for rapidly debugging a code representing a fully thought out solution to a problem, but rather as an aid for the exploration of problem solving strategies.

ELIZAに組み込まれた編集機能の重要な結果は、大規模で本格的なシナリオであることをELIZAスクリプトを与えて始める必要はないということです。と言うよりもむしろ、キーワードと変換規則の控えめなセットとして始め、それを使った経験が積み重ねて成長させ成形することを可能にするべきです。これは、真にインタラクティブなマンーマシン環境を使う最善の方法のようで、問題に対する十分に考え出された解決策を表すコードを迅速にデバッグするための装置としてではなく、むしろ問題解決戦略を探求するための補助手段として考えるべきでしょう。

つまり、DOCTOR スクリプトは作成者のアドホックな作業の結果だったと推測されます。上記の decomp は文法と言ったルール的に正しいデザインと言うよりは、何度も試行錯誤を繰り返した結果、これが一番収まりが良かったといった類のパターンだったのでしょう。とすれば、日本語化においてもこのアプローチは有効なんだろうと思います。が、少なくとも入力文を分かち書きにする手段は必要でしょうねぇ。

などと、ELIZAと日本語で対話したいと思いつつ、本ページを終了します。

以上