以下、本発明を実施するための形態について図面を参照しながら詳細に説明する。図1は、対話装置の一実施形態を示すブロック図である。対話装置100は、データベース101(データベース)、取得部106(取得手段)、抽出部107(抽出手段)、データ取得部102(データ取得手段)を含む応答文出力部103(応答文出力手段)、及び記憶部104(記憶手段)を備え、所定の対象、例えばユーザと対話可能に構成されている。この対話装置100は例えば、家庭用の対話機能付きスピーカーや、ロボットの対話機能に組み込んで使用することができる。ロボットである場合、上記所定の対象は例えば、他のロボットであってもよい。
データベース101は、複数のルールデータ110を記憶しており、各ルールデータ110には、想定入力単語組(想定入力発話文)と、応答文と、オートマトンの状態番号と、オートマトンの次回の遷移先の状態番号(以下「次遷移先状態番号」という)とが含まれる。この想定入力単語組は、ユーザから入力されると想定される複数の入力単語で構成され、応答文は、ユーザの発話に対する応答文であり、これらの想定入力単語組、応答文、オートマトンの状態番号、及びオートマトンの次遷移先状態番号が、互いに対応付けられて、ルールデータ110として記憶されている。オートマトンの状態番号及び次遷移先状態番号は、ユーザとの対話中に、複数のルールデータ110のうちのいずれを選択して応答すべきかを規定するものであり、次遷移先状態番号は、次回の応答時に選択すべきルールデータ110に含まれるオートマトンの状態番号を表して(定義して)いる。この場合、オートマトンの状態番号と次遷移先状態番号は、同じ番号であったり、異なる番号であったりする。各ルールデータ110のオートマトンの状態番号及び次遷移先状態番号、並びに、それらの各々に対応する応答文は、ユーザとの対話における話題を適切に変化させながら自然な応答が行われるように、設定されている。ここで、例えば様々な話題のユーザの発話に対応できるように、同一のオートマトンの状態番号を含む複数のルールデータ110が、データベース101に記憶されていてもよい。
取得部106は、ユーザの入力発話情報115を、例えばマイクロフォン(図示せず)を介して取得する。
抽出部107は、上記入力発話情報115を、増幅器及びA/D(アナログ/デジタル)変換器等を介してデジタル化してデジタル音声に変換する。次に、抽出部107は、このデジタル音声に対して、音声認識処理を実行することにより、入力文のテキストデータを取得し、取得した入力文のテキストデータに対して形態素解析を実行することにより、発話を単語ごと(例えば名詞や動詞、形容詞、副詞等)に分かち書きした形式で、複数の入力単語からなる入力単語組111のテキストデータを抽出する。
応答文出力部103は、複数のルールデータ110から、オートマトンの現在の状態を含む所定の状態と、取得部106にて取得された入力発話情報115とに応じて、応答ルールデータ113を選択し、選択した応答ルールデータ113に含まれる応答文114を所定の対象に対して出力する。
ここで、応答文出力部103は、次のようなデータ取得部102を有してよい。データ取得部102は、複数のルールデータ110のうちの、オートマトンの現在の状態を含む所定の状態に対応する複数のルールデータよりも少ない複数のルールデータから、取得された入力発話情報115に応じて、応答ルールデータ113の候補となる応答候補の複数のルールデータである応答候補ルールデータ112を検索して取得する。この検索は、例えば次のようにして行われる。まず、取得した入力単語組111に包含される想定入力単語組を有するルールデータ110を、応答候補ルールデータ112の暫定候補データとして検索する。この場合、「入力単語組111に包含される想定入力単語組」は、想定入力単語組の単語数が入力単語組の単語数以下であって、かつ、想定入力単語組のすべての単語が入力単語組の一部またはすべての単語と一致する想定入力単語のことである。データ取得部102は、このようにして検索された1つ以上の暫定候補データに対し、更に後述するように記憶部104を参照して、応答候補ルールデータ112を検索する。
応答文出力部103は、データ取得部102で検索された応答候補ルールデータ112から応答ルールデータ113を選択し、その応答ルールデータ113に含まれる応答文(図1のルールデータ110に含まれる応答文を参照)を、ユーザの発話に対する応答文114として出力する。このようにして出力された応答文114のデータ(例えばテキストデータ)に対して、音声合成処理部からD/A変換器、増幅器、及びスピーカを介して、応答文114に対応する音声が発声される。なお、対話装置100が例えばロボットの対話機能として組み込まれている場合、ロボットはユーザが周囲に存在することをセンサ等によって検出している状態で、上記音声の発声を対話装置100に行わせる。これと共に、応答文出力部103は、応答ルールデータ113に含まれるオートマトンの次遷移先状態番号(図1参照)を、スタック状態番号NSAとして、記憶部104に順次記憶する。このように、記憶部104は、オートマトンの状態番号をスタックするスタックとして機能する。記憶部104に記憶された複数のスタック状態番号NSAは、ユーザの発話の話題が辿るのに応じて遷移したオートマトンの状態番号の履歴を示すと同時に、これらの複数のスタック状態番号NSAのうち、最も新しく記憶されたスタック状態番号NSAは、遷移したオートマトンの現在の状態番号(=例えば話題)を示している。
ここで、データ取得部102は、前述したようにして検索された1つ以上の暫定候補データ(ルールデータ110)のうち、その対応するオートマトンの状態番号(図1参照)が記憶部104中の複数のスタック状態番号NSAのうちの何れかに一致する暫定候補データを、応答候補ルールデータ112として検索する。記憶部104中の各スタック状態番号NSAは、ユーザの発話の話題が辿るのに応じて遷移したオートマトンの状態番号(=例えば話題)を示している。従って、データ取得部102は、データベース101に記憶されているルールデータ110のうち、いままで発生したオートマトンの状態番号(スタック状態番号NSA)と同じ状態番号を含むルールデータ110、すなわち、例えばいままで話題にのぼったルールデータ110から、応答候補ルールデータ112を選択することになる。
最も望ましいのは、記憶部104に最も新しく記憶されているスタック状態番号NSA、すなわちオートマトンの現在の状態番号と同じ状態番号を含むルールデータ110が検索されることである。しかしながら、ユーザによる入力単語組111に対応するルールデータ110に含まれるオートマトンの状態番号が、オートマトンの現在の状態番号と必ずしも一致するとは限らない。このような場合に、データ取得部102は、記憶部104が記憶するスタック状態番号NSAが示す過去に辿ってきたオートマトンの状態番号と一致するオートマトンの状態番号を含むとともに、入力単語組111に対応する想定入力単語組を有するルールデータ110を応答候補ルールデータ112として検索する。この対話装置100の構成により、ユーザとの例えば対話における話の流れに沿った応答候補ルールデータ112を検索することができる。
この場合、データ取得部102は更に、対応するオートマトンの状態番号が上述のように記憶部104中の複数のスタック状態番号NSAの何れかに一致する複数の応答候補ルールデータ112(ルールデータ110)が存在する場合に、これらの応答候補ルールデータ112のうち、より新しく記憶されたスタック状態番号NSAに一致する状態番号に対応する応答候補ルールデータ112が、応答ルールデータ113として優先的に選択されるように、各応答候補ルールデータ112のスコアを算出する。
より具体的には、データ取得部102は、例えば、入力単語組111に含まれる入力単語の各々に、後述するTF−IDF手法などの所定の手法によって、重み係数を設定する。これにより、複数の入力単語の各々の重み係数は、その重要度に応じて、互いに同じ値に設定されたり、互いに異なる値に設定されたりする。また、データ取得部102は、応答候補ルールデータ112としてのルールデータ110に含まれる想定入力単語組(図1のルールデータ110の想定入力単語組を参照)の入力単語組111に対する類似度を示すコサイン類似度を、設定した重み係数に応じて、応答候補ルールデータ112毎に算出する。また、データ取得部102は、算出したコサイン類似度に応じて、応答候補ルールデータ112毎に、応答ルールデータ113を選択するための指標を示すスコアを算出する(コサイン類似度をスコアとして算出する)。さらに、データ取得部102は、複数の応答候補ルールデータ112(ルールデータ110)のうちの、記憶部104に記憶された複数のスタック状態番号NSAのうちのより過去に記憶されたスタック状態番号NSAに一致する状態番号に対応する応答候補ルールデータ112のスコアを、より小さな値に算出する。そして、応答文出力部103は、応答候補ルールデータ112毎に算出された上記スコアに基づいて、最大のスコアを有する応答候補ルールデータ112を応答ルールデータ113として選択する。この対話装置100の構成によって、応答文出力部103は、データ取得部102により検索された1つ以上の応答候補ルールデータ112のうち、オートマトンの現在の状態番号(=例えば現在の話題)により近い状態番号(=例えばより近い話題)に対応する応答候補ルールデータ112を、応答ルールデータ113として優先的に選択することができ、よりユーザとの話題に沿った自然な対話が行える対話装置100を提供することが可能となる。
ここまでの構成に加えて、選択された応答ルールデータ113に基づいて生成された応答文114を過去所定回数分記憶する応答文記憶部104(応答文記憶手段)を更に備えてよい。そして、データ取得部102は、応答文記憶部104を参照することにより、1つ以上の応答候補ルールデータ112中の各応答候補ルールデータ112が応答ルールデータ113として選択されるときの優先度(例えば前述したスコア)を、応答候補ルールデータ112の応答文114が過去何回目に生成されたかに応じて変更してよい。この対話装置100の構成により、同じ応答ルールデータ113による応答文114が繰り返し出力されるのを防ぐことができる。
ここまでの構成に加えて、データベース101には、所定の複数の非想定用ルール(後述するワイルドカードリスト、スーパーワイルドカードリスト)が含まれてもよい。そして、データ取得部102は、ユーザによる発話の内容が想定外の内容である場合、すなわち、入力単語組111の複数の単語が、いずれのルールデータ110の想定用入力単語組の複数の単語を包含していない場合には、複数の非想定用ルールのうち、前回に選択された応答ルールデータに対応するものを、応答候補ルールデータとして取得してよい。
図2は、図2の対話装置100を実現可能なコンピュータのハードウェア例を示す図である。このコンピュータは、通常のパーソナルコンピュータのほか、スマートフォン、タブレット端末、デジタルカメラなどを含む。図2に示されるコンピュータは、CPU(Central Processing Unit)CPU201、メモリ202、入力装置203、出力装置204、補助情報記憶装置205、可搬型記録媒体211が挿入される媒体駆動装置206、ネットワーク接続装置207、音声入力装置208、及び音声出力装置209を有する。これらの構成要素は、バス210により相互に接続されている。図2に示される構成は図2の対話装置100を実現できるコンピュータの一例であり、そのようなコンピュータはこの構成に限定されるものではない。
メモリ202は、例えば、Read Only Memory(ROM)、Random Access Memory(RAM)、フラッシュメモリ等の半導体メモリであり、例えば、後述する図4〜図7のフローチャートの処理に対応するプログラム、及び後述する図3に対応する各種データを格納する。
CPU(プロセッサ)101は、例えば、メモリ202を利用して、図2の対話装置100に用いられる後述する図4〜図7のフローチャートの処理に対応するプログラムを実行することにより、図2に示される各処理ブロックとして動作する。
入力装置203は、例えば、タッチパネル入力装置であり、オペレータ又はユーザからの指示又は情報の入力に用いられる。出力装置204は、例えば、上記タッチパネル入力装置と一体に形成される液晶ディスプレイ(LCD:Liquid Crystal Display)などのディスプレイ装置であり、オペレータ又はユーザへの問合せ又は処理結果の出力に用いられる。
補助情報記憶装置205は、例えば、半導体記憶装置、ハードディスク記憶装置、磁気ディスク記憶装置、光ディスク装置、光磁気ディスク装置などであり、例えば、図1で説明したデータベース101を記憶する記憶装置、或いは、図1の記憶部104又は応答文記憶部105として動作する。図2の対話装置100は、補助情報記憶装置205に図2の対話装置100に用いられる例えば図4から図7のフローチャートの処理を実行するプログラム及び図3で後述する各種データなどのデータを格納しておき、それらをメモリ202にロードして使用してもよい。
媒体駆動装置206は、可搬型記録媒体211を駆動し、その記録内容にアクセスする。可搬型記録媒体211は、メモリデバイス、フレキシブルディスク、光ディスク、光磁気ディスク等である。可搬型記録媒体211は、Compact Disk Read Only Memory(CD−ROM)、Digital Versatile Disk(DVD)、Universal Serial Bus(USB)メモリ等であってもよい。オペレータ又はユーザは、この可搬型記録媒体211に上述のプログラム及びデータを格納しておき、メモリ202にロードして使用することができる。
このように、上述のプログラム及びデータを格納するコンピュータ読取り可能な記録媒体は、メモリ202、補助情報記憶装置205、又は可搬型記録媒体211のような、物理的な(非一時的な)記録媒体である。
ネットワーク接続装置207は、例えばLocal Area Network(LAN)等の通信ネットワークに接続され、通信に伴うデータ変換を行う通信インタフェースである。図2の対話装置100は、上述のプログラム又はデータを外部の装置からネットワーク接続装置207を介して受信し、それらをメモリ202にロードして使用することができる。
音声入力装置208は、ユーザが喋る音声をアナログ入力音声信号として入力するマイクロフォン/アンプ、アナログ入力音声信号をデジタル入力音声信号に変換するA/D(アナログ/デジタル)変換器、デジタル入力音声信号をユーザからの入力としてCPU201に引き渡すためのインタフェース回路などである。
音声出力装置209は、図2の対話装置100が生成した応答文114に対応するデジタル音声信号を合成する音声合成処理装置、デジタル音声信号をアナログ音声信号に変換するD/A(デジタル/アナログ)変換器、アナログ音声信号をユーザに向かって放音するためのアンプ/スピーカなどである。
なお、図2の対話装置100が図2の全ての構成要素を含む必要はなく、用途又は条件に応じて一部の構成要素を省略することも可能である。例えば、オペレータ又はユーザからの指示又は情報を入力する必要がない場合は、入力装置203の一部又は全部や出力装置204の一部又は全部が省略されてもよい。可搬型記録媒体211又は通信ネットワークを利用しない場合は、媒体駆動装置206又はネットワーク接続装置207が省略されてもよい。
図3は、図2のコンピュータが実現する図2の対話装置100の制御に必要な主要な各種データのフォーマットの例を示す図である。
図3(a)は、制御データのデータフォーマット例である。制御データの先頭ポインタCtrlのアドレスから順に、以下の各種データが図2のメモリ202に記憶される。
transition:対話データベースへのポインタ。図2の補助情報記憶装置205などに記憶される図2のデータベース101内のルールデータ110の先頭へのポインタである。ルールデータ110は、図1を用いて前述したように、オートマトンの状態番号毎に、ユーザが発話すると想定される単語の組(想定入力単語組)と、それに対応する応答文と、次に遷移するオートマトンの状態番号(次遷移先状態番号)を管理する。
inputWordCount:入力単語数。入力されたユーザ発話の単語(形態素)数である。
inputWords[inputWordCount]:図3(b)の入力単語データへのポインタ。入力されたユーザ発話に含まれる単語(形態素)群の実体アドレスである。上記入力単語数inputWordCount分の入力単語データ配列である。
transCandidates:応答候補ルールデータリスト。当該の入力による条件に合致する1つ以上の応答候補ルールデータ112(図1参照)を格納するためのリストである。各リストの要素は、各ルールデータtransition[i](図3(c)参照)へのポインタのほかに、各応答候補ルールデータ112の一致単語数の値や、各応答候補ルールデータ112のスコアの値も含む。
state_id:状態番号のスタック配列。記憶部104に記憶されるスタック状態番号NSA(図1参照)を管理するスタック配列である。
score_coef:評価係数。各応答候補ルールデータ112を評価するためのコサイン距離を計算する際の、入力側分母成分である。
図3(b)は、ユーザの発話に基づいて検出される図1の入力単語組111を示す入力単語データのデータフォーマット例である。各入力単語データの先頭ポインタはinputWords[i](i=0、1、2、・・・)で示され、入力単語データ毎に、このアドレスから順に以下の各種データが、図2のメモリ202に記憶される。
word:入力単語。形態素解析処理により設定される、形態素単位のテキストデータ列である。
weight:重み係数。そのルール内でのその単語の重要度を示すための係数である。重み係数の値は、例えば品詞に応じて大小が付けられ、例えば名詞や動詞に対しては大きな値、助詞などに対しては小さな値が付けられる。
prev:前ポインタ。ユーザの発話において、現在の入力単語の直前に発音された入力単語へのポインタである。
next:次ポインタ。ユーザの発話において、現在の入力単語の直後に発音された入力単語へのポインタである。
図3(c)は、図1のデータベース101に記憶されるルールデータ110のデータフォーマット例である。各ルールデータ110の先頭ポインタはtransition[i](i=0、1、2、・・・)で示され、ルールデータ110毎に、このアドレスから順に以下の各種データが、例えば図2の補助情報記憶装置205内(メモリ202内でもよい)の図1のデータベース101に記憶される。
userWordCount:想定入力単語数。ルールデータ110の入力として与えられる想定入力単語の数である。
userWords[userWordCount]:ルールデータ110の入力として与えられる想定入力単語のテキストデータの配列である。図1のルールデータ110内の想定入力単語組に対応する。
state_id:オートマトンの現在の状態番号。ルールデータ110が属する状態を示す番号である。図1のルールデータ110内の状態番号に対応する。
bot_reply:応答文。ルールデータ110の出力である応答文のテキストデータである。図1のルールデータ110内の応答文に対応する。
next_state_id:次遷移先状態番号。ルールデータ110が選択された後に遷移するオートマトンの遷移先の状態を示す番号である。図1のルールデータ110内の次遷移先状態番号に対応する。
prev:前ポインタ。現在のルールデータ110の直前に接続されるルールデータ110へのポインタである。
next:次ポインタ。現在のルールデータ110の直後に接続されたルールデータ110へのポインタである。
図4から図7は、図2の対話装置100の動作を実現するために、図2のコンピュータが実行する対話処理の例を示すフローチャートである。この対話処理は、図2のCPU201が、メモリ202又は補助情報記憶装置205に記憶されている図3で説明した各種データを用いながら、メモリ202に記憶された対話処理プログラムを実行する処理である。
図4は、対話処理の例を示すメインフローチャートである。特には図示しないパワースイッチがオンされてシステムが起動すると、CPU201が、メモリ202上の各種変数の初期化、及び必要なデータの補助情報記憶装置205からメモリ202へのロードを実行する(ステップS401)。
次に、CPU201は、図3(a)の制御データ上のオートマトンの状態番号のスタック配列state_idに、初期状態を表す状態番号0をプッシュする(ステップS402)。
ステップS402の後、CPU201は、ユーザ発話の入力(ステップS403)と、対話装置の終了指示(ステップS404)の待機状態となる(ステップS403とステップS404の繰返し処理)。
ユーザが発話を行うと、図2の音声入力装置208において、ユーザが喋る音声がマイクロフォン/アンプでアナログ入力音声信号として入力され、A/D変換器においてそのアナログ入力音声信号がデジタル入力音声信号に変換され、図2のバス210を介してCPU201に送られる。そして、CPU201が、このデジタル入力音声信号の所定閾値以上のパワーを検出したときに、ユーザ発話の入力が検出され、ステップS404の判定がYESとなる。CPU201は、前処理(ステップS405)、ルール検索処理(ステップS406)、及び応答文出力処理(ステップS407)を順次実行し、その後、ステップS403とS404の待機処理に戻る。
ユーザが特には図示しないパワースイッチをオフして対話装置100の終了指示が発生すると、ステップS403の判定がYESとなって、CPU201は、確保したメモリ202上の領域等を破棄し、図4に示す対話処理を終了し、システムを終了する。
図5は、図4のステップS405の前処理の詳細例を示すフローチャートである。この前処理では主に、図3(b)の入力単語データinputWords[0]、inputWords[1]、・・・を作成する処理が実行される。
まず、CPU201は、メモリ202上にある図3(a)及び(b)の各データ(変数)を初期化する(ステップS501)。
次に、CPU201は、図4のステップS404で入力されたユーザの発話に基づくデジタル音声データに対して、まず音声認識を行って入力文のテキストデータを作成し、更にそのテキストデータに対して形態素解析を実行することにより、形態素に分割された複数の単語から成る入力単語群を抽出する(ステップS502)。この入力単語群は、図1の入力単語組111に対応する。
次に、CPU201は、初期値1を、メモリ202上の変数であるスコア係数にセットする(ステップS503)。スコア係数については、後述する。
次に、CPU201は、ステップS502での形態素解析により抽出した先頭の形態素から順に(ステップS504)、ステップS505ですべての形態素の検索が終了したと判定するまで(ステップS505)、ステップS509で形態素を順次検索しながら、以下のステップS506からS508の一連の処理を、形態素毎に繰り返し実行する。
まず、CPU201は、図3(a)の制御データの入力単語数:inputWordCountの値をインクリメントする。また、CPU201は、図3(b)の入力単語データの新たなエントリ(記憶領域)(例えばinputWords[i])をメモリ202上に生成し、そのエントリ内の入力単語:wordとして、ステップS504又はS509で取得した形態素のテキストを登録する(以上、ステップS506)。なお、CPU201は、入力単語データの新たなエントリの前ポインタ:prevを、その直前に生成されているエントリの先頭アドレスに設定し、更にその直前エントリの次ポインタ:nextの値を上記新たなエントリの先頭アドレスに設定することにより、ユーザ発話に従って順番に接続された入力単語データのエントリのリストを生成する。
次に、CPU201は、ステップS504又はS509で取得した形態素に対応する入力単語の重み係数を設定し、その重み係数を、ステップS506でメモリ202上に生成した図7(b)の入力単語データの新たなエントリの重み係数:weightとして設定する(ステップS507)。上述の重み係数は、対応する形態素の入力単語の、入力された文書内での重要度を示しているといえる。単語の文書内での重要度は、入力文書内で多く出現する単語ほど大きな(重要な)値として設定されるTF(Term Frequency)と呼ばれる良く知られた手法と、いくつもの文書で横断的に使われている単語はそれほど大きな(重要な)値ではなく設定されるIDF(Inverse Document Frequency)と呼ばれる良く知られた他の手法とを組合せたTF−IDF手法により設定することができる。従って、上述の重み係数は、このようなTF−IDF手法により設定されてよい。また、単語の文書内での重要度は、形態素の品詞によっても異なる。重み係数の値は、例えば名詞や動詞に対しては大きな値、助詞などに対しては小さな値が割り当てられる。そこで、上述の重み係数は、例えば図2の補助情報記憶装置205に保持している、品詞別の重み係数テーブルや、IDF(Inverse Document Frequency)テーブルなどから設定されてよい。
そして、CPU201は、ステップS507で取得した重み係数の2乗値を、ステップS503で初期設定したメモリ202上のスコア係数に加算する(ステップS508)。スコア係数については後述する。
以上のステップS506からS508までの一連の処理が、ステップS505からS509までの繰返し処理により入力により得られる全ての形態素について実行されることにより、図3(b)の入力単語データinputWords[0]、inputWords[1]、・・・が作成される。図3(b)に示されるように、入力単語データinputWords[i](i=0、1、・・・)は、形態素解析された現在の形態素のテキストデータである入力単語wordと、その入力単語に対応してステップS507で取得された重み係数weightと、前後のエントリへのポインタprev及びnextから構成される。
すべての形態素に対する処理が終了してステップS505の判定がYESになると、CPU201は、メモリ202上の変数である、前記ステップS508で最終的に算出されたスコア係数の平方根を算出し、更にその逆数を算出して、その算出結果を図3(a)の制御データ内の評価係数(評価式の分母):score_coefとして設定する(ステップS510)。このようにして算出される評価係数score_coefは、実質的には、cos(コサイン)距離=相関係数を求めていることになる。
共分散(分子)と、ルールデータ側の標準偏差は後述するルール検索処理時に算出するものとするが、入力側である入力単語組111に対応する分散は、どのルールに対しても共通のものであり、かつ分母の成分として発生するものであるので、まずステップS503で初期設定の後に、ステップS508で各入力単語の重み係数の2乗を加算してスコア係数を算出し、算出したスコア係数をステップS510であらかじめ逆数化して図3(a)の評価係数score_coefとして求めておき、後述する各応答候補ルールデータ112のスコアをコサイン類似度に変換する演算(図6のステップS609参照)において、(計算負荷のかかる除算ではなく、)乗算で処理できるようにするためである。その後、CPU201は、図5のフローチャートで例示される図4のステップS405の前処理を終了する。
図6は、図4のステップS406のルール検索処理の詳細例を示すフローチャートである。このルール検索処理は、図1のデータ取得部102の処理機能を実現するものである。図1のデータ取得部102の説明で前述したように、データ取得部102は、データベース101に記憶されているルールデータ110を参照しながら、オートマトンと呼ばれる状態モデルに従って動作する。図6のルール検索処理も同様に、メモリ202又は補助情報記憶装置205上のデータベース101に記憶されている図3(c)のルールデータ110を参照しながら、オートマトンの状態モデルに従って動作する。ここで、オートマトンとは、状態と遷移と動作の組み合わせからなるモデルであり、ある時点で「現在状態」と呼ぶ何れか1つの状態をとり、何らかのイベントや条件によってある状態から別の状態へと「遷移」し、その状態を規定するのがデータベース101上のルールデータ110である。また、本実施形態では、後述するようにルールデータ110の検索と状態の遷移が、図1で説明した記憶部104に記憶されるスタック状態番号NSAに応じても制御される。
以下、図4のステップS406のルール検索処理の詳細例である図6のフローチャートの処理について、説明する。
図6において、CPU201はまず、前述した図5で示される図4のステップS405の前処理においてユーザの発話から得られた入力単語組について、全てのルール検索が終了したと判定するまで(後述するステップS613:YES)、ステップS601からS612の一連の処理を繰り返し実行する。
この繰返し処理において、CPU201はまず、メモリ202又は補助情報記憶装置205に記憶されている図3(c)のルールデータ110(図1のデータベース101内のルールデータ110に対応)において、前述したように上記入力単語組(図1の入力単語組111に対応)に包含される想定入力単語組を含むルールデータ110を、データベース102内から検索する(ステップS601)。ステップS601の他の実施形態として、CPU201は、想定入力単語数(図3(c)参照)が上記入力単語組(図1の入力単語組111に対応)の入力単語数(図3(a)参照)に一致し、かつ想定入力単語の配列(図3(c)参照)中の全ての想定単語が、入力単語(図3(b)参照)の全てと一致するルールデータを検索してもよい。なお、入力文が日本語である場合には、想定入力単語組と入力単語組の間の単語の順番は問わない。これは、入力文によっては、単語の倒置等が発生する場合に対応するためである。
ステップS601の検索の結果、CPU201は、データベース102内からルールデータが見つかったか否かを判定する(ステップS602)。
ルールデータが見つからなかった場合(ステップS602の判定がNOの場合)には、CPU201は、全てのルールデータの検索が終了したか否かを判定する(ステップS613)。
全てのルールデータの検索が終了していない場合(ステップS613の判定がNOの場合)には、CPU201は、ステップS601の検索処理に戻ってルールデータの検索を繰り返し実行する。
ステップS601での検索の結果、ルールデータが見つかった場合(ステップS602の判定がYESの場合)には、CPU201は、以下のステップS603からS612で示される一連の処理を実行することにより、ステップS601で見つかったルールデータを応答候補ルールデータ112(図1参照)として採用するか否かを判定する。
具体的には、CPU201はまず、図2のメモリ202上に保持している変数である状態番号係数が示す倍率を、初期値である1.0にセットする(ステップS603)。状態番号係数は、現在の状態以外の過去に発生した状態に対応するルールデータを検索する場合に、その状態をどの程度重要視するかを決定するための重みデータである。
次に、CPU201は、メモリ202(記憶部104)上に制御データとして保持している(記憶されている)状態番号のスタック配列:state_id(図3(a)参照)において、スタック配列中の所定の複数のスタック状態番号NSAのうち、最初のスタック状態番号NSA、すなわち、記憶された最新の状態番号を読み出す(ステップS604)。
次に、CPU201は、ステップS601によって見つかったルールデータ中の状態番号:state_id(図3(c)参照)が、上記ステップS604又は後述するS611によって選択された現在のスタック状態番号NSAと一致するか否かを判定する(ステップS605)。
ステップS605の判定がYESならば、CPU201は、応答候補ルールデータリストtransCandidates(図3(a)参照)に、当該ルールデータに対応するステップS601で見つかったルールデータへのポインタ:transition(図3(c))の値を登録することにより、上記応答候補ルールデータリストに、当該ルールデータを新たな応答候補ルールデータ112として追加する(ステップS606)。
次に、CPU201は、応答候補ルールデータリストtransCandidatesから参照される、今回追加された応答候補ルールデータ112のスコアに、図6のステップS601で見つかったルールデータ110の想定入力単語組内の各想定入力単語に対応する各入力単語の各重み係数:weight(図3(b)参照)の2乗値を、全入力単語で累算する(ステップS607)。なお、応答候補ルールデータ112のスコアの初期値は所定値に設定されている。所定値は任意の値を採用可能であり、例えば値0でもよい。
続いて、CPU201は、応答候補ルールデータリストtransCandidatesから参照される、今回追加された応答候補ルールデータ112のスコアに、メモリ202上に保持されている変数である状態番号係数の2乗値を累算する(ステップS608)。前述したように、状態番号係数は、オートマトンの現在の状態番号以外の状態番号を含むルールデータ110を採用する場合に、その状態番号をどの程度重要視するかを決定するための重みデータである。
次に、CPU201は、応答候補ルールデータリストtransCandidatesから参照される、ステップS606で追加された応答候補ルールデータ112としてのルールデータ110のスコアの値を、下記(1)式に従い、コサイン類似度に変換する(ステップS609)。「sqrt()」は、平方根を計算する演算を示す。「Ctrl.score_coef」は、図3(a)の制御データの先頭アドレスCtrlから参照される評価係数であり、図5のステップS503、S508、S510などで算出されている値である。また、「transCandidates−>score」は、メモリ202上の今回追加された応答候補ルールデータ112のスコア変数値を示している。
transCandidates−>score
=sqrt(transCandidates−>score)
×Ctrl.score_coef ・・・(1)
上記(1)式により、共分散と、新たな応答候補ルールデータ112としてのルールデータ110に対応する標準偏差がここまでで計算されるので、これに前述した入力単語組に対応する標準偏差の逆数である評価係数が乗算されることにより、相関係数が算出できることになる。
次に、CPU201は、ステップS613の処理からステップS601に戻り、次のルールデータに対する検索処理を繰り返し実行する。
一方、ステップS605の判定がNO、すなわち、ステップS601で見つかったルールデータ110の状態番号:state_idが、ステップS604又はS611によって選択された現在のスタック状態番号NSAと一致しなければ、CPU201は、スタック配列中のスタック状態番号NSAの検索が終了したか否かを判定する(ステップS610)。このステップS610の判定がNOのときには、そのときに読みだされているスタック状態番号NSAよりも一つ前に記憶されたスタック状態番号NSAを読み出す(ステップS611)とともに、状態番号係数に所定の減衰係数(1.0>減衰係数>0)を乗算し(ステップS612)、ステップS605に戻る。
一方、上記ステップS610の判定がYESで、状態番号のスタック配列中のスタック状態番号NSAの検索が終了したときには、前記ステップS613以降を実行する。
一方、ステップS613の判定がYESで、全てのルールデータ110の検索が終了したときには、ステップS614及びS615において、ワイルドカードリスト検索処理及びスーパーワイルドカードリスト検索処理をそれぞれ、後述するようにして実行し、本処理を終了する。
以上により、図6に示すルール検索処理では、ステップ601で見つかったルールデータ110の状態番号が、ステップS604で読みだされた最初のスタック状態番号NSAと、すなわちオートマトンの現在状態と一致する場合(ステップS605:YES)には、ステップS603で値1.0に設定された状態番号係数がそのまま用いられ、ステップS608で累算される。
一方、ステップ601で見つかったルールデータの状態番号が最初のスタック状態番号NSAと一致しない場合(ステップS605:NO)には、スタック配列に記憶されたスタック状態番号NSAが新しいものから順に読みだされ(ステップS611)、状態番号係数に減衰係数が乗算される(ステップS612) とともに、再度ステップS605が実行され、読みだされたスタック状態番号NSAに、ルールデータ110位に含まれるオートマトンの状態番号が一致するか否かが判定される。そして、すべてのスタック状態番号NSAの検索が終了しない限り(ステップS610:NO)、ステップS605がYESになるまで、ステップS611及びS612が繰り返し実行される。
これにより、ステップS611で読みだされるスタック状態番号NSAがより過去のものになるほど、値1.0よりも小さい減衰係数が状態番号係数に乗算される回数がより多くなる結果、状態番号係数は、より小さな値に設定される。この場合、例えば減衰係数が値0.9の場合には、状態番号係数は、ステップS603で設定される初期値の値1.0から、減衰係数が乗算されるたびに、0.9→0.81、・・・というように減衰される。そして、ステップS605の判定がYESになると、減衰された状態番号係数を用いて応答候補ルールデータ112のスコアが算出される(ステップS608)。
図7は、図4のステップS407の応答文出力処理の詳細例を示すフローチャートである。まずCPU201は、応答候補ルールデータリストtransCandidates中の各応答候補ルールデータ112としてのルールデータ110のスコアに基づいて、最尤の(スコアが最も高い)候補のルールデータ110を、図1の応答ルールデータ113として決定する(ステップS701)。
続いて、CPU201は、ステップS701の最尤候補のルールデータ110が有する応答文:bot_reply(図3(c)参照)を、図2の音声出力装置209に出力する(ステップS702)。音声出力装置209は、応答文:bot_replyに対応するデジタル音声応答信号を合成し、そのデジタル音声応答信号を内蔵のD/A変換器にてアナログ音声応答信号に変換し、そのアナログ音声応答信号をアンプ及びスピーカを介してユーザに向かって放音する。なお、上記応答文:bot_replyの音声信号を放音せずに、上記応答文:bot_replyのテキストデータが、出力装置204のディスプレイに表示されてもよい。
続いて、CPU201は、最尤候補のルールデータ110の遷移先状態番号:next_state_id(図3(c)参照)を取得する(ステップS703)。
そして、CPU201は、ステップS702で取得した遷移先状態番号が、状態番号のスタック配列:state_id(=図1のスタック状態番号NSA)上で連続しないようにして、遷移先状態番号を、スタック状態番号NSAとして上記スタック配列にプッシュする(ステップS704)。この場合、本処理の初回の実行時、すなわち、状態番号のスタック配列に何もスタック状態番号NSAがスタックされていないときには、現在の状態番号及び遷移先状態番号を、この順にスタック配列にプッシュする。
図8、図9、及び図10は、上述した処理の動作例を示している。図8(b)、図9、及び図10は、オートマトンの状態番号が状態番号0から状態番号4まで遷移する場合の動作例を示している。また、図8(a)は、図8(b)、図9、及び図10に示す動作例に関する凡例を示している。太い実線の丸で囲まれた数字(X=0、1、2、3、4)はオートマトンの状態番号を示している。また、シャープ記号が付与されている破線枠#X−iは、オートマトンの状態番号が状態番号Xである場合におけるi番のルールデータ110(図1参照)を示している。このルールデータ110において、濃い色の枠は、そのルールデータ110が選択されるための「条件」を示している。また、左側に向いている吹出し枠中のテキストは、ユーザから取得される入力発話情報(図1の入力発話情報115に対応)に対する形態素解析により得られる入力単語組(図1の入力単語組111に対応)がマッチすべき想定入力単語組(図1参照)を示している。そして、右側に向いている吹出し枠中のテキストは、応答文(図1参照)のテキストを示している。
ここで、ユーザによる入力文と入力単語組の取得方法については、前述したとおりである。この入力単語組のテキストデータは、図1の入力単語組111に対応しているが、以下単に「入力単語組」と記載したときは図1の入力単語組111に対応しているものとする。
例えば、図8(b)に示されるオートマトンの状態番号が0である場合には、会話のスタート時の一般的な話の導入を行うためのルールデータ群が対応付けられている状態である。この状態番号0において、ルールデータ110[#0−0]は、例えばユーザが喋ることにより、入力文に対応する入力単語組として「好き」という単語を含む疑問文が与えられたときには、「どうかな、わからないな」というテキストに対応する応答文を出力するためのルールデータである。また、この動作例では、このルールデータ110[#0−0]による応答文が出力された(図7のステップS702)後には、ルールデータ110[#0−0]の破線枠から出力する実線矢印として示されるように、オートマトンの状態番号は現在の状態番号0を維持する(図7のステップS703でルールデータ110[#0−0]から遷移先状態番号=0が取得され、ステップS704でスタックにプッシュされる)。この実線矢印は、図1のルールデータ110における次遷移先状態番号に対応する。図8(b)に示される状態番号0におけるルールデータ110[#0−1]、[#0−3]についても同様である。
一方、図8(b)に示される状態番号0におけるルールデータ110[#0−2]は、入力文「動物の話」の疑問文に対応する「動物」「話」という2つの単語を含む入力単語組が与えられたときには、「うん、動物の話をしよう」というテキストに対応する応答文を出力するためのルールである。また、この動作例では、このルールデータ110[#0−2]による応答文が出力された(ステップS702)後には、ルールデータ110[#0−2]の破線枠から出力する実線矢印を太い破線の丸で囲まれた「1」に付すことで示されるように、オートマトンの状態番号が、現在の状態番号0から図9に示される状態番号1に遷移する(図7のステップS703でルールデータ110[#0−2]から遷移先状態番号=1が取得され、ステップS704でスタックにプッシュされる)。
図9に示されるオートマトンの状態番号が状態番号1である場合は、動物に関する話題を会話するためのルールデータ群が対応付けられている状態である。例えばルールデータ110[#1−0]は、入力文から生成される入力単語組が単語「猫」を含むときに猫に関する一般的な話題として「猫の目って大きいよね」という応答文を出力するためのルールである。また、ルールデータ110[#1−1]は、入力文から生成される入力単語組が単語「目」を含むときに猫の目に関する一般的な話題として「猫の目って大きいよね」という応答文を出力するためのルールである。これらのルールデータ110[#1−0]や[#1−1]が出力された(図7のステップS702)後には、ルールデータ110[#1−0]や[#1−1]の各破線枠から出力する実線矢印を太い破線の丸で囲まれた「2」に付すことで示されるように、オートマトンの状態番号が、図9に示される現在の状態番号1から図10に示される状態番号2に遷移する(図7のステップS703でルールデータ110[#1−0]又は[#1−1]から遷移先状態番号=2が取得され、ステップS704でスタックにプッシュされる)。
一方、図9の状態1において、例えばルールデータ110[#1−2]は、入力文から生成される入力単語組がキーワード「狐」を含むときに狐に関する一般的な話題として「狐って夜に行動するイメージあるよね」という応答文を出力するためのルールである。また、ルールデータ110[#1−3]は、入力文から生成される入力単語組が単語「目」を含むときに狐の目に関する一般的な話題として「狐って目が猫みたいかも」という応答文を出力するためのルールである。これらのルールデータ110[#1−2]や[#1−3]が出力された(図7のステップS702)後には、ルールデータ110[#1−2]や[#1−3]の各破線枠から出力する実線矢印を太い破線の丸で囲まれた「4」に付すことで示されるように、オートマトンの状態番号が、図9に示される現在の状態番号1から図9に示される状態番号4に遷移する(図7のステップS703でルールデータ110[#1−2]又は[#1−3]から遷移先状態番号=4が取得され、ステップS704でスタックにプッシュされる)。
なお、猫の話題に関するルールデータ110[#1−1]と狐の話題に関するルールデータ110[#1−3]は、共に入力文から生成される入力単語組が単語「目」を含むときに選択され得るが、どちらが選択されるかは、入力単語組と各ルールデータ110の想定入力単語組との類似度(コサイン類似度)を算出するときの条件によって変化し得る(図5及び図6のステップS607、S608、S609、図7のステップS701)。このような構成により、対話が画一的になるのを回避している。
図9の状態番号1におけるルールデータ110[#1−0]又はルールデータ110[#1−1]が選択された後に遷移する図10の状態番号2の状態、更に状態番号2から遷移する状態番号3の状態は、猫についての更に深い話題に関するルールデータ110群に対応している。一方、図9の状態番号1におけるルールデータ110[#1−2]又はルールデータ110[#1−3]が選択された後に遷移する図9の状態番号4の状態は、狐のお話(童話等)についての話題に関するルールデータ110群に対応している。
図9の状態番号1におけるルールデータ110[#1−4]は、入力文として「そうなんだ」というような曖昧な内容に対応する入力単語組が与えられたときに、「そうだと思うの」というような同様の曖昧な応答文を返すためのルールである。ルールデータ110[#1−4]が出力された(図7のステップS702)後には、ルールデータ110[#1−4]の破線枠から出る実線矢印を太い実線の丸で囲まれた「1」に戻して付することで示されるように、オートマトンの状態番号が、図9に示される状態番号1を維持する(図7のステップS703でルールデータ110[#1−4]から遷移先状態番号=1が取得され、ステップS704でスタックの先頭に1が記憶されたままとされる)。
図11は、図8から図9に例示されるオートマトンに対応する図6のルール検索処理の具体的な動作例を示す図である。まず、オートマトンの状態番号0において、ユーザが例えば喋ることにより、入力文In[0]として「動物の話でもしようか」が入力され、これに対応して「動物」「話」という2つの単語からなる入力単語組が形態素解析により生成されたとする。これに対して、メモリ202又は補助情報記憶装置205に記憶されている図3(c)の複数のルールデータ110のうち、その想定入力単語の配列中の想定入力単語組userWords[0]、userWords[1](図3(c)参照)が、上記入力単語組「動物」「話」に包含される(ここでは、「一致する」)ルールデータ110が検索される(図6のステップS601)。この結果、現在の状態番号state_id(図3(c)参照)が図8(b)のオートマトンの状態番号0と一致し、想定入力単語組userWords[0]、userWords[1](図3(c)参照)が入力単語組「動物」「話」に包含される(又は、一致する)1つのルールデータ110[#0−2]が検索される。また、ステップS601では説明しなかったが、入力文In[0]が「タイプ」として「提案」型の疑問文であり「肯定/否定」項目として「肯定」を有するものと判定され、図11の入力文In[0]に対応させられて、ルールデータ110[#0−2]が検索され、応答候補ルールデータ112とされる(図6のステップS605の1回目の判定でYESとなりステップS606へ)。
次に、図11に示されるように、この1つの応答候補ルールデータ112[#0−2]が、入力文In[0]に対応する応答ルールデータ113として選択される(図7のステップS701)。この結果、図11に示されるように、応答ルールデータ113として選択されたルールデータ110[#0−2]の応答文bot_reply(図3(c)参照)が、応答文Out[0]=「うん、動物の話をしよう」(図11参照)、すなわち応答文114(図1参照)として生成され、出力される(ステップS702)。それに伴い、応答ルールデータ113として選択されたルールデータ110[#0−2]が参照され、このルールデータ110[#0−2]に次遷移先状態番号next_state_idとして値1が含まれるので(図7のステップS703)、オートマトンの状態番号が、いままでの状態番号0から状態番号1に遷移する(図7のステップS704)。
このとき、応答ルールデータ113として選択されたルールデータ110[#0−2]のように、初めて選択された応答ルールデータ113である場合には、そのルールデータ110[#0−2]の現在の状態番号state_id(図3(c)参照)の値0が、まずスタック状態番号NSAとして、状態番号のスタック配列:state_id(図3(a)参照)にプッシュされて記憶され、続いて、ルールデータ110[#0−2]の次遷移先状態番号next_state_idの値1が、次のスタック状態番号NSAとして、状態番号のスタック配列:state_id(図3(a)参照)に更にプッシュされて記憶される(図7のステップS704)。この場合、状態番号0が、1回前の過去のスタック状態番号NSAとして記憶され、次遷移先状態番号1が、最新のスタック状態番号NSAとして記憶されることになる。
またこのとき、図7のフローチャートには記載していないが、図1の応答文記憶部105に対応するメモリ202又は補助情報記憶装置205(図2参照)内の応答文記憶部(図示せず)に、応答ルールデータ113として選択されたルールデータ#0−2の応答文Out[0]=「うん、動物の話をしよう」が記憶される。
次に、遷移後のオートマトンの状態番号1において、入力文In[1]として「猫を飼おうと思うんだけど」が入力され、これに対する形態素解析により単語「猫」を含む入力単語組111が生成されたとする。これに対して、図3(c)の複数のルールデータ110のうち、その想定入力単語の配列中の想定入力単語組userWords[0](図3(c)参照)が上記入力単語組「猫」に包含される(又は、一致する)ルールデータ110が検索される(図6のステップS601)。この結果、現在の状態番号state_id(図3(c)参照)が図9のオートマトンの状態番号1と一致し、想定入力単語組userWords[0]、userWords[1](図3(c)参照)が入力単語組「猫」に包含される(又は、一致する)1つのルールデータ110[#1−0]が検索される。また、入力文In[1]が「タイプ」として「その他」型の疑問文であり「肯定/否定」項目として「肯定」を有するものと判定され、図11の入力文In[1]に対応させられて、ルールデータ110[#1−0]が応答候補ルールデータ112として検索される(図6のステップS605の1回目の判定でYESとなりステップS606へ)。
次に、図11に示されるように、この1つの応答候補ルールデータ112[#1−0]が、入力文In[1]に対応する応答ルールデータ113として選択される(図7のステップS701)。この結果、図11に示されるように、応答ルールデータ113として選択されたルールデータ110[#1−0]の応答文bot_reply(図3(c)参照)が、応答文Out[1]=「猫の目って大きいよね」(図11参照)、すなわち応答文114(図1参照)として生成され、出力される(ステップS702)。それに伴い、応答ルールデータ113として選択されたルールデータ110[#1−0]が参照され、このルールデータ110[#1−0]に次遷移先状態番号next_state_idとして値2が含まれるので(図7のステップS703)、オートマトンの状態番号が、いままでの状態番号1から状態番号2に遷移する(図7のステップS704)。
このとき、応答ルールデータ113として選択されたルールデータ110[#1−0]のように、2回目以降に選択された応答ルールデータ113である場合には、そのルールデータ110[#1−0]に含まれる次遷移先状態番号next_state_idの値2が、最新のスタック状態番号NSAとして、状態番号のスタック配列:state_id(図3(a)参照)にプッシュされて記憶される(ステップS704)。
またこのとき、図6のフローチャートには記載していないが、前述した応答文記憶部に、応答ルールデータ113として選択されたルールデータ110[#1−0]の応答文Out[1]=「猫の目って大きいよね」が記憶される。
次に、遷移後のオートマトンの状態番号2において、入力文In[2]として「そうだね、目が大きくて可愛いよね」が入力され、単語「目」を含む入力単語組111が生成されたとする。これに対して、図3(c)の複数のルールデータ110のうち、その想定入力単語の配列中の想定入力単語組userWords[0](図3(c)参照)が上記入力単語組「目」に包含される(又は、一致する)ルールデータ110が検索される(ステップS601)。
この結果、図6のステップS601→S602→S613→S601のループ処理により、想定入力単語組userWords[0](図3(c)参照)が入力単語組「目」に包含される(又は、一致する)のに加えて、現在の状態番号state_id(図3(c)参照)がオートマトンの状態番号2と一致する1つのルールデータ110[#2−0]と、現在の状態番号state_id(図3(c)参照)が状態番号1と一致するルールデータ110[#1−1]、[#1−3]とが順次検索されて、順次ステップS602の判定がYESとなる。続いて、その後のステップS603からS612において、ルールデータ110[#2−0]については、そのオートマトンの状態番号2が状態番号のスタック配列:state_id(図3(a)参照)の一番上にプッシュされている最新のスタック状態番号NSA(=2)と一致し、それにより1回目のステップS605でYESと判定される結果、そのスコアに、状態番号係数=1が累算される(ステップS608)。同様に、ルールデータ110[#1−1]及び[#1−3]については、それらのオートマトンの状態番号が状態番号のスタック配列:state_id(図3(a)参照)の一番上から2番目にプッシュされているスタック状態番号NSA(=1)と一致し、それにより2回目のステップS605でYESと判定されることにより、ステップS612がそれぞれ1回ずつ実行される結果、それぞれのスコアに、状態番号係数=1×0.9=0.9が累算される(ステップS612、S608)。
以上より、そのスコアが1.0倍されたルールデータ110[#2−0]と、それぞれのスコアが0.9倍されたルールデータ110[#1−1]及び[#1−3]とが、応答候補ルールデータリストtransCandidatesにそれぞれ応答候補ルールデータ112として取得される。
次に、図6のフローチャートには示されていないが、ルールデータ110[#2−0]と、ルールデータ110[#1−1]及び[#1−3]について、それぞれの応答文114が前述した応答文記憶部に登録されているか否かが判定される。これにより、ルールデータ110[#2−0](図10)とルールデータ110[#1−1](図9)の応答文=「猫の目って大きいよね」が、応答文Out[1]として出力されていて上記応答文記憶部に登録されていることが判定される。この結果、同じ応答文114が続けて出力されてしまうことを避けるために、ルールデータ110[#2−0](図10)とルールデータ110[#1−1](図9)は選択されずに、ルールデータ110[#1−3]が、図11に示されるように、入力文In[2]に対応する応答ルールデータ113として選択される。
この結果、図11に示されるように、応答ルールデータ113として選択されたルールデータ110[#1−3]の応答文bot_reply(図3(c)参照)が、応答文Out[2]=「狐って目が猫みたいかも」(図11参照)、すなわち応答文114(図1参照)として生成され、出力される(ステップS702)。それに伴い、応答ルールデータ113として選択されたルールデータ110[#1−3]が参照され、このルールデータ110[#1−3]に次遷移先状態番号next_state_idとして値2が含まれるので(図7のステップS703)、次に選択すべきルールデータ110を表すオートマトンの状態番号が、いままでの状態番号2を維持する(図7のステップS704)。
このとき、応答ルールデータ113として選択されたルールデータ110[#1−3]は2回目以降に選択された応答ルールデータ113であるため、そのルールデータ110[#1−3]に含まれる次遷移先状態番号next_state_idの値2が、最新のスタック状態番号NSAとして、状態番号のスタック配列:state_id(図3(a)参照)にプッシュされて記憶される(ステップS704)。
またこのとき、図6のフローチャートには記載していないが、前述した応答文記憶部に、応答ルールデータ113として選択されたルールデータ110[#1−3]の応答文Out[2]=「狐って目が猫みたいかも」が記憶される。
次に、遷移後のオートマトンの状態番号2において、入力文In[3]として「急に狐の話になるのね」が入力され、単語「狐」を含む入力単語組111が生成されたとする。これに対して、図3(c)の複数のルールデータ110のうち、その想定入力単語組userWords[0](図3(c)参照)が上記入力単語組「狐」に包含される(又は、一致する)ルールデータ110が検索される(ステップS601)。
この結果、図6のステップS601→S602→S613→S601のループ処理において、図9のオートマトンの現在の状態番号2を現在の状態番号state_id(図3(c)参照)として含むルールデータ110には、「狐」を想定入力単語の配列userWords[](図3(c)参照)に含むルールデータ110は存在しないが、図9に例示されるように、状態番号1を現在の状態番号state_id(図3(c)参照)として含むルールデータ110中に、「狐」を想定入力単語の配列userWords[](図3(c)参照)に含むルールデータ110[#1−2]が検索されて、ステップS602の判定がYESとなる。続いて、その後のステップS603からS612において、ルールデータ110[#1−2]については、そのオートマトンの状態番号1が状態番号のスタック配列:state_idの最新の状態番号2よりも先にプッシュされている過去のスタック状態番号NSA(=1)と一致し、それにより2回目のステップS605でYESと判定される結果、ステップS612が1回実行される結果、そのスコアに、状態番号係数=1×0.9=0.9が乗算される(ステップS612、S608)。
以上より、ルールデータ110[#1−2]のみが、応答候補ルールデータリストtransCandidatesに応答候補ルールデータ112として取得される。
次に、図11に示されるように、応答候補ルールデータ112として取得されたルールデータ110[#1−2]が、入力文In[3]に対応する応答ルールデータ113として選択される(ステップS701)。この結果、図11に示されるように、応答ルールデータ113として選択されたルールデータ110[#1−2]の応答文bot_reply(図3(c)参照)が、応答文Out[3]=「狐って夜に行動するイメージあるよね」(図11参照)、すなわち応答文114(図1参照)として生成され、出力される(ステップS702)。その後、応答ルールとして選択されたルールデータ110[#1−2]が参照され、このルールデータ110[#1−2]に次遷移先状態番号next_state_idとして値4が含まれるので(図7のステップS703)、オートマトンの状態番号が、いままでの状態番号2から状態番号4に遷移する(図7のステップS704)。
このとき、応答ルールデータ113として選択されたルールデータ110[#1−2]は2回目以降に選択された応答ルールデータ113であるため、そのルールデータ110[#1−2]に含まれる次遷移先状態番号next_state_idの値4が、最新のスタック状態番号NSAとして、状態番号のスタック配列:state_idにプッシュされて記憶される(ステップS704)。
またこのとき、前述した応答文記憶部に、応答ルールデータ113として選択されたルールデータ110[#1−2]の応答文Out[1]=「狐って夜に行動するイメージあるよね」が記憶される。
更に続いて、遷移後の状態番号1において、入力文In[4]として「そうなんだ、よく知ってるね」が入力され、単語「そうなんだ」を含む入力単語組111が生成されたとする。これに対して、図3(c)の複数のルールデータ110のうち、その想定入力単語の配列中の想定入力単語組userWords[0](図3(c)参照)が上記入力単語組「そうなんだ」に包含される(又は、一致する)ルールデータ110が検索される(ステップS601)。
この結果、図6のステップS601→S602→S613→S601のループ処理において、図9のオートマトンの現在の状態番号4を現在の状態番号state_id(図3(c)参照)として含むルールデータ110には、「そうなんだ」を想定入力単語の配列userWords[](図3(c)参照)に含むルールデータ110は見つからないが、図9に例示されるように、オートマトンの状態番号1を現在の状態番号state_id(図3(c)参照)として含むルールデータ110中に、「そうなんだ」を想定入力単語の配列userWords[](図3(c)参照)に含むルールデータ110[#1−4]が検索されて、ステップS602の判定がYESとなる。続いて、その後のステップS603からS612において、ルールデータ110[#1−4]については、そのオートマトンの状態番号1が状態番号のスタック配列:state_idの最新のスタック状態番号NSA(=4)よりも先にプッシュされている過去のスタック状態番号NSA(=1)と一致し、それにより3回目のステップS605でYESと判定される結果、ステップS612が2回実行される結果、そのスコアに状態番号係数=1×0.9×0.9=0.81が乗算される(ステップS612、S608)。
以上より、ルールデータ110[#1−4]が、応答候補ルールデータリストtransCandidatesに応答候補ルールデータ112として取得される。
次に、図11に示されるように、応答候補ルールデータ112として取得されたルールデータ110[#1−4]について、その応答文bot_reply(図3(c)参照)が、応答文Out[4]=「そうだと思うの」が前述した応答文記憶部に登録されているか否かがチェックされる。この結果、上記の応答文Out[4]=「そうだと思うの」が応答文記憶部に登録されていないことが、判定される。この結果、オートマトンの状態番号1を含むルールデータ110[#1−4]が、図11に示されるように、入力文In[4]に対応する応答ルールデータ113として選択される(ステップS701)。そして、図11に示されるように、ルールデータ113として選択されたルールデータ110[#1−4]の応答文bot_reply(図3(c)参照)が、応答文Out[4]=「そうだと思うの」(図11参照)、すなわち応答文114(図1参照)として生成され、出力される(ステップS702)。そそれに伴い、応答ルールデータ113として選択されたルールデータ110[#1−4]が参照され、このルールデータ110[#1−4]に次遷移先状態番号next_state_idとして値1が含まれるので(図7のステップS703)、次に選択すべきルールデータ110を表すオートマトンの状態番号が、いままでの状態番号1を維持する(図7のステップS704)。
このとき、応答ルールデータ113として選択されたルールデータ110[#1−4]は2回目以降に選択された応答ルールデータ113であるため、そのルールデータ110[#1−4]に含まれる次遷移先状態番号next_state_idの値1が、最新のスタック状態番号NSAとして、状態番号のスタック配列:state_id(図3(a)参照)にプッシュされて記憶される(ステップS704)。
またこのとき、図6のフローチャートには記載していないが、前述した応答文記憶部に、応答ルールデータ113として選択されたルールデータ#1−4の応答文Out[4]=「そうだと思うの」(応答文114)が記憶される。
また、図8(b)に示されるオートマトンの状態番号0を含むルールデータ110[#0−3]は、入力文の項目が「*」になっている。これは、「どんな単語(形態素)でも該当するものとして扱う」という単語一致条件を持つルールである。そして、例えば、入力文として、状態番号0を含む他のどのルールデータ110[#0−0]〜[#0−2]にも設定されていないキーワード(かつ疑問文等の条件は無し)が与えられた場合に、「え、何か言った?」というような応答文を出力するためのルールである。この「*」をワイルドカードと呼ぶ。ルールデータ110[#0−3]の破線枠から出る実線矢印によって、ルールデータ110[#0−3]が選択された後は、選択前と同じ状態番号0を維持することが示されている(すなわち、次遷移先状態番号が0)。このようなワイルドカードのルールデータを設定することにより、曖昧な対話を実現することが可能となる。
図10に示されるオートマトンの状態番号3を含むルールデータ110[#3−2]は、入力文の項目が「#」になっている。これをスーパーワイルドカードと呼ぶ。スーパーワイルドカードは、ワイルドカードの場合と同様の「どんな単語(形態素)でも該当するものとして扱う」という単語一致条件を持つが、ルールデータ110として、オートマトンの現在の状態番号と一致する状態番号を含むもののみが応答候補ルールデータ112として追加され、このルールデータ110が候補に追加された段階で、他の状態のルールデータ110は応答候補ルールデータリストから削除される。上述のワイルドカードに似て、入力文として、状態番号3を含む他のどのルールデータ110[#3−0]〜[#3−1]にも設定されていないキーワード(かつ疑問文等の条件は無し)が与えられた場合に、「触ってみたいよう」というような応答文を出力するためのルールである。ここで例えば、ルールデータ110[#3−3]の破線枠から出る実線矢印によって、ルールデータ110[#3−3]が選択された後は、選択前とは異なる状態番号(例えば状態番号2)に遷移する。このように、スーパーワイルドカードのルールデータ110にしかるべき遷移先が記載されているときには、他の状態番号に遷移する挙動が実現できる。このようなスーパーワイルドカードのルールデータ110を設定することにより、対話が詰まったときに話題を大きく変えるような対話を実現することが可能となる。或いは、例えばシステム的に満足のいく回答が得られるまで同じ状態に滞留する、すなわち同じ質問を繰り返すなどの挙動を実現することも可能である。
図6のルール検索処理において、現在の入力単語組に対して全てのルールデータの検索が終了しステップS613の判定がYESになった後に、CPU201は、上述したワイルドカード及びスーパーワイルドカードについても、前述のステップS601からS613の処理の場合と同様の検索処理を実行する。その詳細については省略する。
なお、前述しようたに、スーパーワイルドカードは、それに対応するルールデータ110が応答ルールデータ113(図1参照)として選択された後は、選択前とは異なる状態番号にオートマトンの状態番号が遷移するという性格上、このルールデータ110に含まれる状態番号は、状態番号のスタック配列:state_id(=図1のスタック状態番号NSA)に同じ番号のスタック状態番号NSAが含まれているか否かにかかわらず、現在の状態番号と一致しないルールは応答候補ルールデータリストtransCandidatesに追加しないように制御されてよい。また、このリストにスーパーワイルドカードのルールが追加された段階で、リストからは、現在の状態番号以外の状態番号を有するルールを排除するように制御されてよい。
以上、本実施形態では、データベース102に記憶される複数のルールデータ110のうち入力発話情報115に応じたルールデータ110、例えば入力発話情報115中の入力単語の組に対応した想定入力単語の組が設定されているルールデータ110が、応答ルールデータ113の候補(応答候補ルールデータ112)として選択される。また、上記複数のルールデータ110のうちオートマトンの現在の状態を含む所定の状態、例えば現在の状態又はオートマトンの状態を順次記憶する記憶部104に記憶された複数の状態に含まれる状態を示すルールデータ110が、応答ルールデータ113の候補(応答候補ルールデータ112)として選択される。そして、そのように選択された応答ルールデータ113に含まれる応答文114が出力される。これにより、本実施形態では、ユーザとの例えば対話における話の流れに沿った応答ルールデータ113に基づく応答文114を出力することができる。このとき、本実施形態では、複数のルールデータ110のうち、対応するオートマトンの状態が記憶部104に記憶された複数の状態のうちのより新しく記憶された状態と同じ状態を示すルールデータを応答ルールデータ113として優先的に選択することができる。これにより、現在の話題により良く対応する応答ルールデータ113に基づく応答文114を出力することができる。
本実施形態の場合と異なり、従来の対話装置では、例えば、オートマトンの現在の状態番号を含むルールデータとして適切なルールデータが設定されていないために、現在の状態番号のルールデータ110が応答ルールデータ113として選択されなかった場合には、例えばランダムに他の状態番号を含むルールデータを検索せざるを得ず、その結果、話題が唐突に切り替わるというような事態が発生していた。これに対して、本実施形態では、上述したようにして応答ルールデータ113の選択を行うことができるので、話題が唐突に切り替わるのを抑制することができ、ユーザと自然に対話できる対話装置100を提供することが可能となる。
また、本実施形態では、応答ルールデータ113を選択するための指標を示すスコアがルールデータ110毎に算出され、複数のルールデータ110のうちの、記憶部104に記憶された複数の状態のうちのより過去に記憶された状態と同じ状態を示すオートマトンの状態に対応するルールデータ110が応答ルールデータとして選択されにくくなるようにスコアが算出される。例えば、各ルールデータ110において、そのルールデータ110が示す状態が記憶部104においてより過去に記憶された状態であるほど値が減衰する減衰係数が、そのルールデータ110の状態番号係数に乗算され、乗算された状態番号係数がそのルールデータ110のスコアに累算される。そして、複数のルールデータ110のうち最大のスコアを有するルールデータ110が、応答ルールデータ113として選択される。このため、過去に辿ってきたユーザとの話題に基づき、かつより最近の話題により良く沿った、自然な対話が行える対話装置100を提供することが可能となる。
また、本実施形態では、入力文(入力発話情報115)の文脈に応じてその入力文を構成する入力単語毎に可変の重みが設定され、応答候補ルールデータ112毎に、その応答候補ルールデータ112中の各想定入力単語に対応する各入力単語の重みが累算されてその応答候補ルールデータ112の入力文に対する類似度を示す類似度パラメータが算出され、その類似度パラメータに応じてその応答候補ルールデータ112に対するスコアが算出される。そして、各応答候補ルールデータ112のスコア値のうち最大のスコアを有する応答候補ルールデータ112が応答ルールデータ113として選択される。このため、入力文の文脈に応じた正しい応答ルールデータ113を選択することが可能となる。
更に、本実施形態では、複数のルールデータ110の各々に含まれる想定入力単語と、入力文からの形態素解析により抽出された入力単語組111中の複数の入力単語との比較結果に基づいて、データベース101中の複数のルールデータ110から応答候補ルールデータ112が検索される。このようにして、本実施形態では、単語同士の比較により応答候補ルールデータ112が検索されるので、話題に含まれる適切な単語に基づく対話ルールの決定が可能となる。
加えて、本実施形態では、応答候補ルールデータ112からの応答ルールデータ113の選択において過去所定回数分の応答文を記憶した応答文記憶部105を参照することにより同じ応答文114が繰り返し出力されないようにすることができるので、対話が単調になるのを防ぐことが可能となる。
本実施形態では、入力単語毎に重み係数を設定しているが、全ての入力単語に一律に同じ重み係数を設定してもよい。
本実施形態では、各応答候補ルールデータのスコアとしてコサイン類似度を算出し、その大小によって複数の応答候補ルールデータ112から応答ルールデータ113が選択されるようにしたが、テキストマッチングのための各種類似度の演算が適用されてもよい。
本実施形態では、応答候補ルールデータ112の状態が記憶部104に記憶されている複数のスタック状態番号NSAのうちのより過去に記憶されたスタック状態番号NSAであるほど値が減衰する減衰係数を状態番号係数に乗算し、この状態番号係数を応答候補ルールデータ112のスコアに累算し、そのスコアに応じて複数の応答候補ルールデータ112から応答ルールデータ113を選択するようにしたが、複数の状態履歴から他のアルゴリズムに基づいて過去の特定の状態に対応する応答候補ルールデータ112が優先的に応答ルールデータ113として選択されるようにしてもよい。
本実施形態では、ルールデータ110毎に設定された想定入力単語組が入力単語組111と比較されることにより応答候補ルールデータ112が選択されるようにしたが、想定入力単語組ではなく、例えばルールデータ110中の応答文から形態素解析により得られる単語組が入力単語組111と比較されてもよい。その他、様々に設定された単語組や文と入力単語組とが比較されてもよい。
本実施形態では、ユーザによる発話の内容が想定外の内容である場合(入力単語組111の複数の単語が、いずれのルールデータ110の想定用入力単語組の複数の単語を包含していない場合)に非想定用ルール(ワイルドカードリスト、スーパーワイルドカードリスト)が参照されるようにしたが、想定外の内容である場合にそれらを参照せずに、所定のルールに従って対話が行われるようにしてもよく、あるいは、何も発話しないようにしてもよい。
本実施形態では、応答候補ルールデータ112からの応答ルールデータ113の選択において過去所定回数分の応答文を記憶した応答文記憶部105を参照することにより同じ応答文114が繰り返し出力されないようにしたが、所定のアルゴリズムに従って同じ応答文を繰り返し出力されるようにしてもよい。
本実施形態では、データベース101中の複数のルールデータ110から入力単語組111に対応する応答候補ルールデータ112を選択し、複数の応答候補ルールデータ112の中から応答ルールデータ113を最終的に選択する手法として、図6及び図7のフローチャートで示されるアルゴリズムの手法を示したが、記憶部104に記憶された複数のスタック状態番号NSAのうちのより新しく記憶されたスタック状態番号NSAに対応する応答候補ルールデータ112が応答ルールデータ113として優先的に選択されるという条件で、様々なアルゴリズムの手法を採用することが可能である。例えば、データベース102中のルールデータ110から応答候補ルールデータ112を検索する段階から、記憶部104に記憶された複数のスタック状態番号NSA中の各状態とルールデータ112中の各状態とが比較されながら検索が行われてもよい。
上記本実施形態の構成に加えて、現在の状態番号と同じ状態番号を含むルールデータがみつかったらその時点で応答候補ルールデータリスト112の検索を終了し、記憶部104に記憶されたスタック状態番号NSAを考慮しない手法が採用されてもよい。
上記本実施形態では、図6において全てのルール検索が終了するまで入力単語組に包含される想定入力単語組を含むルールデータ110を検索するステップS601の処理が繰り返し実行されている。これに対して、オートマトンの現在の状態番号及びスタック配列に含まれるスタック状態番号NSAのいずれかと一致する状態番号を含むルールデータ110についてのみ、入力単語組に応じた検索が行われるようにしてもよい。
更に、上記本実施形態では、減衰係数を反映させたコサイン類似度がスコアとして算出されているが、応答候補ルールデータ112毎に一旦コサイン類似度が算出されてから減衰係数を用いてスコアが減衰させられるような処理が実行されてもよい。また、減衰係数を乗算項として用いているが、減算項として用いてスコアを算出するように、スコアの算出式を設定してもよい。
上述の実施形態において、マイクロフォンをさらに備え、取得部106がマイクロフォンを介して入力された例えばユーザのである所定の対象の音声に基づいて、入力発話情報115を取得するようにしてよい。
また、上述の実施形態において、スピーカをさらに備え、応答文出力部103は、応答文114に対応する音声を、スピーカを介して例えばユーザである所定の対象に対して出力するようにしてもよい。
これらの構成により、例えば本実施形態による対話装置100を、ロボットやスマートフォンの対話アプリとして実現することが可能となる。
本実施形態では、対話装置100を図2のハードウェア構成例を有するコンピュータによって実行されるコンピュータプログラムとして提供することも可能となる。
本実施形態では、ユーザからの入力文は音声データとして与えられそれに対して音声認識が実行されることにより入力文のテキストデータが与えられたが、これに限られるものではなく、ネットワークなどからメールシステムや各種メッセージングシステム、又はSNSシステムなどを介して入力文のテキストデータが直接与えられてもよい。
以上、開示の実施形態とその利点について詳しく説明したが、当業者は、特許請求の範囲に明確に記載した本発明の範囲から逸脱することなく、様々な変更、追加、省略をすることができる。
その他、本発明は上述した実施形態に限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で種々に変形することが可能である。また、上述した実施形態で実行される機能は可能な限り適宜組み合わせて実施しても良い。上述した実施形態には種々の段階が含まれており、開示される複数の構成要件による適宜の組み合せにより種々の発明が抽出され得る。例えば、実施形態に示される全構成要件からいくつかの構成要件が削除されても、効果が得られるのであれば、この構成要件が削除された構成が発明として抽出され得る。
以上の実施形態に関して、更に以下の付記を開示する。
(付記1)
応答文をそれぞれ含み、互いに異なるオートマトンの状態に対応付けられた複数のルールデータを記憶し、前記オートマトンの状態の遷移先の状態が定義されたデータベースと、
所定の対象から入力された入力発話情報を取得する取得手段と、
前記複数のルールデータから、前記オートマトンの現在の状態を含む所定の状態と、前記取得された入力発話情報とに応じて、応答ルールデータを選択し、選択した応答ルールデータに含まれる前記応答文を前記所定の対象に対して出力する応答文出力手段と、
前記オートマトンの状態を順次記憶するための記憶手段と、を備え、
前記所定の状態は、前記記憶手段に記憶された複数の状態を含み、
前記応答文出力手段は、前記複数のルールデータのうちの、対応する前記オートマトンの状態が前記記憶手段に記憶された複数の状態のうちのより新しく記憶された状態と同じ状態を示すルールデータを、前記応答ルールデータとして優先的に選択する、
対話装置。
(付記2)
前記応答文出力手段は、
前記複数のルールデータのうちの、前記オートマトンの現在の状態を含む所定の状態に対応する前記複数のルールデータよりも少ない複数のルールデータから、前記取得された入力発話情報に応じて、前記応答ルールデータの候補となる応答候補の複数のルールデータを検索して取得するデータ取得手段を有し、
前記取得した応答候補の複数のルールデータのうちの、対応する前記オートマトンの状態が前記記憶手段に記憶された複数の状態のうちのより新しく記憶された状態と同じ状態を示す応答候補ルールデータを、前記応答ルールデータとして優先的に選択する、
付記1に記載の対話装置。
(付記3)
前記応答文出力手段は、
前記応答ルールデータを選択するための指標を示すスコアを、前記ルールデータ毎に算出し、前記複数のルールデータのうちの、前記記憶手段に記憶された複数の状態のうちのより過去に記憶された状態と同じ状態を示す前記オートマトンの状態に対応する前記ルールデータが前記応答ルールデータとして選択されにくくなるように、前記スコアを算出する、
付記1又は2に記載の対話装置。
(付記4)
前記複数のルールデータの各々は、前記オートマトンの状態及び前記応答文に対応付けられた、前記所定の対象から入力されると想定される想定入力発話文を含み、
前記取得された入力発話情報に基づいて、前記所定の対象の発話文中に含まれる入力単語を抽出する抽出手段と、
抽出された前記入力単語毎に重みを設定する重み設定手段と、
前記入力単語毎に設定された前記重みに応じて、前記入力単語を含む前記所定の対象の発話に対する前記想定入力発話文の類似度を示す類似度パラメータを算出する類似度パラメータ算出手段と、をさらに備え、
前記応答文出力手段は、前記設定された前記類似度パラメータに応じて、前記スコアを算出する、
付記3に記載の対話装置。
(付記5)
前記選択された応答ルールデータに基づいて生成された応答文を過去所定回数分記憶する応答文記憶手段を更に備え、
前記応答文出力手段は、前記応答文記憶手段を参照することにより、前記応答候補ルールデータからの前記応答ルールデータの選択を、同じ応答文が繰り返し出力されないように、行う、付記1乃至4の何れか1項に記載の対話装置。
(付記6)
マイクロフォンをさらに備え、
前記取得手段は、前記マイクロフォンを介して入力された前記所定の対象の音声に基づいて、前記入力発話情報を取得する、
付記1乃至5のいずれか1項に記載の対話装置。
(付記7)
スピーカをさらに備え、
前記応答文出力手段は、前記応答文に対応する音声を、前記スピーカを介して前記所定の対象に対して出力する、
付記1乃至6の何れか1項に記載の対話装置。
(付記8)
所定の対象から入力された入力発話情報を取得する処理と、
応答文をそれぞれ含み、互いに異なるオートマトンの状態に対応付けられた複数のルールデータを記憶し、前記オートマトンの状態の遷移先の状態が定義されたデータベースを用い、前記複数のルールデータから、前記オートマトンの現在の状態を含む所定の状態と、前記取得された入力発話情報とに応じて、応答ルールデータを選択し、選択した応答ルールデータに含まれる前記応答文を前記所定の対象に対して出力する出力処理と、
前記オートマトンの状態を記憶手段に順次記憶する処理と、を含み、
前記所定の状態は、前記記憶手段に記憶された複数の状態を含み、
前記出力処理は、前記複数のルールデータのうちの、対応する前記オートマトンの状態が前記記憶手段に記憶された複数の状態のうちのより新しく記憶された状態と同じ状態を示すルールデータを、前記応答ルールデータとして優先的に選択する処理を含む、
対話方法。
(付記9)
コンピュータに、付記8に記載の対話方法を実行させるためのプログラム。