6. 意味解析のテスト
ここまでの作業でエージェント・ネットワークが日本語の質問から意図を抽出してくれるようになりました。意味解析の動作を試すには「Interaction Console」を使います。[Ctrl]+[I]を押して「Interaction Console」を表示し、「User Input」フィールドに質問を入力し[Apply]を押します。質問から意図が抽出され解析結果XMLに変換されます。例えば「赤坂のイタリアン」と入力すると、それは「検索」という操作(Command)で、対象(Object)は「レストラン」、その条件(Field)が「エリア=赤坂」「ジャンル=イタリアン」と認識されます。認識の結果はエージェント名をタグとしたXMLで出力されます。
7. 検索処理の実行
解析結果XMLだけでは結果が得られないので、これをSQLに変換しデータベースへの検索処理が実行されるようにします。この処理はエージェント・ネットワークの上方にあるActuatorエージェントに登録されるサービスプロバイダというモジュール(Service Provider)で行われます。サービスプロバイダは複数登録でき、それぞれにXPathに似た式(以降XPath式と略記)を持ちます。このXPath式で解析結果XMLを評価し、合致したサービスプロバイダが呼び出されます。
サービスプロバイダを登録するには、Actuatorエージェントをダブルクリックします。「Actuator Agent Editor」という設定ダイアログが表示されます。サービスプロバイダを登録するには[New]を押します。この画面ではサービスプロバイダを起動するためのXPath式をXPath expressionに設定します。検索コマンドが実行されたときにサービスプロバイダを起動したいのですが、この場合はXMLに<検索>というタグが含まれるで「//検索」と記述します。タグ名の前に/を2つ重ねてつけるとルートのXMLノードとすべての子孫ノードに対してタグの存在をチェックします。次に起動するサービスプロバイダのJavaクラス名を設定します。[Change]ボタンを押すとJavaクラスを選ぶダイアログが表示されるので、com.dejima.serviceProvider.DatabaseServiceProvider をプルダウンより選択します。このサービスプロバイダは、解析結果XMLをselect文のSQLに変換してデータベースからデータを検索する機能を持ちます。
Javaクラスを選んだ後[OK]を押すとDatabaseServiceProviderの設定画面が開きます(図18)。ここでは表3に示す項目を設定します。また今回のアプリケーションでは使用しませんが他に表4に示すような設定項目があります。
項目名 | 内容 | 設定する値 |
Sql Configuration | SQL変換ルールを記述した設定ファイル | 後述 |
Datasource | JDBC URLサブネームの文字列 | restaurant |
Driver | JDBCドライバのクラス名 | sun.jdbc.odbc.JdbcOdbcDriver |
Url | JDBC URLサブプロトコルまでの文字列 | jdbc:odbc: |
項目名 | 内容 |
Username | JDBCログインユーザー名 |
Password | JDBCログインパスワード |
Execute SQL | SQLを実行するかどうか。チェックをはずすとSQLの生成のみを実施 |
Max Results | 検索する最大行数 |
Sql Configurationには解析結果XMLからSQLへの変換ルールを記述したXML設定ファイルを記述します。[Sql Configuration]ボタンを押すとエディタが開きます(図19)。
手ですべて記述してもよいのですが、編集画面にある[Generate]ボタンを押すとエージェント・ネットワークの構造を解析し雛形を自動生成してくれます(リスト4)。
<SqlProperties> <TableProperties> <Table name="レストラン" agent="レストラン.com.dejima.templates.TemplatizedAgent@x" tag="レストラン" primaryKey="ID"> <Column name="エリア" datatype="STRING" useQuotes="true" path="エリア" /> <Column name="ジャンル" datatype="STRING" useQuotes="true" path="ジャンル" /> <Column name="星" datatype="STRING" useQuotes="true" path="星" /> </Table> </TableProperties> </SqlProperties>
自動生成された設定を実際に使用するテーブルに合わせ、テーブル名、列名、列の型を修正します(リスト5:太字部分)。修正が終わったら[Save As]を押し設定ファイルを保存します。ファイル名は何でもよいですがデフォルトのファイル名「sql.xml」で保存します。
<SqlProperties> <TableProperties> <Table name="restaurant" agent="レストラン.com.dejima.templates.TemplatizedAgent@x" tag="レストラン" primaryKey="rid"> <Column name="area" datatype="STRING" useQuotes="true" path="エリア" /> <Column name="genre" datatype="STRING" useQuotes="true" path="ジャンル" /> <Column name="stars" datatype="INTEGER" useQuotes="true" path="星" /> </Table> </TableProperties> </SqlProperties>
設定できたら[Ok]を押して変更を反映させます。サービスプロバイダは設定ダイアログの階層が深いのですべてのダイアログで[Ok]を忘れないように注意してください。
8. 動作確認
Interaction Consoleを開き「赤坂のイタリアン」と入力してみましょう。入力から要素が抽出され解析結果XMLが生成されるところまでは先ほどと同じですが、そこからSQLが生成されデータベースからレストランのデータが検索されます。SQLと検索されたデータは解析結果XMLに付加されて出力されます(リスト6)。
文脈を使用した対話的検索も試してみましょう。エージェント・ネットワークのデフォルトの設定では入力に「..」(ドット2つ)を付加することで質問を継続できます。「..新宿では」と入れると条件「赤坂」が「新宿」に置き換えられ「エリア=新宿 かつ ジャンル=イタリアン」のレストランが2件検索されます。「..3つ星」のところと入れると今度は条件が付加されて「エリア=新宿 かつ ジャンル=イタリアン かつ 星=3」という条件でデータを絞り込みます。
9. おわりに
Answers Anywhereを使うと日本語で対話的にデータベースを検索するシステムが、簡単に構築できることが理解していただけたのではないかと思います。1つのテキスト入力により各フィールドを横断的に検索した結果がXMLで出力されますので、クラウドにおくことでフリーワード検索を持ったWebサービスにも利用できるかと思います。
次回はこのサンプルを拡張して、Webで扱いやすいように出力をHTMLに変換する方法や、また別の対話機能として必須項目を入力するようユーザーに通知する方法などを解説をしたいと思います。