メニューボタン
IBMi海外記事2016.11.28

IBM Watosonと話すRPG

Paul Tuohy 著

注: この記事に記載のコードはここからダウンロードできます。

そうです、RPG はWatsonと会話ができます。特別なソフトウェアは必要ありません。インストールも、構成も必要ありません。ただ V7R1 を稼働して、組み込み SQL を使用し、数行のコードを作成する能力さえあれば大丈夫です。どれも複雑なことはありません。どのように動くのか確認するには、ただこの記事にあるディスプレイ・ファイルと RPG コードをコピーして貼り付け、コンパイルして呼び出すだけです。
Watsonが何なのか知らない方のためにお話しますが、Watsonとは 2011 年に米国のクイズ番組、ジェパディで前回覇者の Brad Rutter と Ken Jennings を破った IBM のコンピューターです。Watsonの圧勝でした。
ウィキペディアによると、Watsonは「オープンドメイン質問応答の分野に高度な自然言語処理、情報検索、知識表現、自動推論、機械学習テクノロジーを適用した IBM が開発した質問応答 (QA) コンピューター・システム」となります。2011 年以降、Watsonはガンの研究など複数の分野に取り組んでいます。
しかし、今回の例では、Watsonのシンプルな機能の 1 つである、言語翻訳を使用することにします。例にあるのは、ソース言語とターゲット言語およびいくつかのテキストを特定し、Watsonを呼び出して翻訳を行い、画面に翻訳結果を表示するグリーン・スクリーン・プログラムです。

技術情報04

プログラムがグリーン・スクリーン であることはお勧めしていませんが、このプロセスに関わる特別な Web 構成のようなものがあるような印象をユーザーに与えたくありません。そのため、プログラムは「伝統的なスタイル」になるようにしました。 まずプログラムを見てみましょう。この記事の後半で、Watsonへの接続方法について、どこで情報を捜しだしたか説明します。

ディスプレイ・ファイル

ディスプレイ・ファイル (TOWATSOND) は非常にシンプルです。入力フィールドが 3 つ、出力フィールドが 2 つで 1 つのフォーマットが構成されています。FROMLANG および TOLANG でコードを入力し、 ソース言語と ターゲット 言語を特定できます。FROMTEXT は翻訳したいテキスト、TOTEXT は翻訳されたテキストで、SQLCODEO は SQLCODE の値です (エラーがある場合)。プログラムの終了は F3 を使用します。

技術情報05

言語の選択肢は英語、スペイン語、フランス語、イタリア語、ポルトガル語です。Watsonはアラビア語間の翻訳も可能ですが、CCSID の処理に挑戦する気にはなれませんでした。

プログラム

プログラムのロジック (TOWATSON) も非常にシンプルです。ちょっとした注目する点がいくつかあります。下記のコードの中の以下のコールアウトを参照してください。
(A) データ構造は言語コードの配列を定義しています。コードは画面のソース言語とターゲット言語間に入力された番号に対応しています (1 = 英語 (en), 2 = スペイン語 (es) など)。
(B) プログラムは F3 キーが押されるまで、画面表示をループします。
(C) ループのあらゆる反復で、プログラムは transLate_Text() サブプロシージャーを呼び出し、ソース言語コード、ターゲット言語コード、ソース・テキストおよびターゲット・テキストのパラメーターを渡します。

技術情報06

transLate_Text() サブプロシージャー

transLate_Text() は、上記のメインラインの直後にコーディングされています。transLate_Text() は、 2 つの SQL 関数 (URLENCODE および HTTPGETCLOB) を使用してすべての作業を行います。URLENCODE および HTTPGETCLOB は、システムに付属のユーザー定義関数です。それらは SYSTOOLS ライブラリーにあります。
transLate_Text() で注意する主な点は次のとおりです。コードの中のコールアウトを参照してください。
(A) HTTPGETCLOB 関数は CLOB を返します。RPG は CLOB データ・タイプを認識しないため、textBack を SQL タイプの CLOB の変数として定義しています。プログラムがコンパイルされると、この定義は、 2 つのサブフィールドを備えたデータ構造になります。textBack-Len (戻されたデータの長さを含みます) と textBack_Data (データを含みます) です。
(B) URLENCODE を呼び出して、入力されたテキストをエンコードします。エンコードは、問題を引き起こす可能性があるような特殊文字 (& や < など) をコード化された同等の文字に変換します。
(C)翻訳をするよう Watsonに REST 呼び出しを行うURL を構築します (Watsonの URL の構築についてはすぐに説明します)。
(D) HTTPGETCLOB を使用してWatsonに REST 呼び出しをします。戻された値は、先に定義された textBack CLOB に配置されます。
(E) データが戻された場合、指定の長さのデータ (textBack_Len) を textBack_Data から取得します。

技術情報07

正直に言って、思ったよりはるかに簡単だったと思います。

Watsonの URL

ここのカギはもちろんWatsonの URL です。必要な URL に行きつくために行ったプロセスを紹介します。
まずグーグルで「watson language translation demo」と検索して「IBM Watson Language Translator Demo」というリンクを得ました。ここからページ https://language-translator-demo.mybluemix.net/ に移動しました。そのときはわからなかったのですが、そのページは翻訳できる言語を見つけるために戻ってくるページだったのです (要求中の model-id)。ソース言語とターゲット言語のドロップダウン・ボックスに指定可能な (デモの) 言語のリストが表示され、さらにちょっとグーグルで検索したら、各言語の 2 つの文字コードが表示されました。

技術情報08

次にグーグルで検索したのは「Watson APIs」で、表示されたリストから Watson API Explorer を選択しました。ここからこのページにつながりました。https://watson-api-explorer.mybluemix.net/.

技術情報09

Language translation のリンクをクリックしました。これによって Language Translation ページが表示され、Translate/Get で「Translates the input text from the source language to the target language. (入力テキストをソース言語からターゲット言語へ翻訳する。)」へのオプションをクリックしました。これにより値を入力し、試してみるためのオプションが表示されました。値は 2 つ model_id (詳細はもう少し後で) と text だけを入力しました。

技術情報10

以下の応答が返ってきました。

技術情報11

求めていた応答部分は Request URL でした。これは以下のとおりでした。 https://watson-api-explorer.mybluemix.net/language-translation/api/v2/translate?model_id=en-es&text=I%20like%20to%20code%20in%20RPG
これは HTTPGETCLOB 関数で使用するため構築する必要があった文字列です。変数部はソース言語とターゲット言語 (en-es) およびエンコードされたテキスト (%20 はスペースのエンコード) です。

Bluemix

もちろんこれは、Watsonの氷山の一角に過ぎません。使用した URL はテスト目的でのみ使用しました。多数のサービス (翻訳のみではない) は Bluemix から使用でき、無償のものもあれば、有償のものもあります。
しかし、RPG がWatsonと話すのがこんなに簡単だとは、誰も思っていなかったのではないでしょうか。

注)Watoson APIのURLが少し変更されています。

変更前).../language-translation/...
変更後).../language-translator/...

最終的に(RPGコードでは)下記になります。

str1 = 'https://watson-api-explorer.mybluemix.net/' +
'language-translator/api/v2/translate?model_id=' +
fromLang + '-' + toLang +
'&text=' +
str2;

あわせて読みたい記事

PAGE TOP