Edited at

Cognitive Services LUIS でノンコーディング自然言語分析始めよう (2019年6月版)

"人工知能 API" Microsoft Azure Cognitive ServicesLanguage Understanding (LUIS) を使うと、自然言語の分析 (文章の意図やエンティティの抽出) を行うエンジンをノーコーディングで作成できます。

LUIS は、例文(学習データ) を読み込ませて、その文章の意図 (Intent) や エンティティ (Entity) を設定するという(比較的シンプルな)方法で作成します。今回はその手順を紹介します。


手順


準備

あると便利なモノ


  • Web API ツール


    • HTTP リクエストを送信できるツールがあると、Web APIの挙動やレスポンスを確認できて便利です

    • 詳しくは 補足 をご覧ください




1. LUIS app の作成

ブラウザから LUIS Portal (https://www.luis.ai) にアクセスします。右上の Sign in をクリックして、マイクロソフトアカウントでサインインします。

初期画面が表示されます。[Create a LUIS app now] をクリックして進みます。


表示されない場合はそのまま次のステップに進みます



1-1. LUIS app の新規作成

LUIS app の一覧画面が表示されます。+ Create new app をクリックして、LUIS app を新規作成します。

Create new app ダイアログ画面で、必要事項を入力します。


  • Name : 自分で分かりやすい LUIS app の名前を入力

  • Culture : 日本語の解析モデルを作成するので、Japanese を選択

入力したら [Done] をクリックして作成に進みます。


How to create an effective LUIS app というダイアログが表示される場合は、右上の×をクリックしてキャンセルします。


LUIS app のダッシュボードが表示されます。まだ何も入力も学習も呼び出しもしていないためブランクです。右上の BUILD をクリックして、設定を行います。


1-2. LUIS app の Entity 設定

LUIS app の BUILD 画面が表示されます。今回はまず Entity から設定していきます。

左バーメニューから App Assets 配下にある Entities をクリックします。

Entities の設定ページで +Create new entity をクリックして、Entity を作成します。チーム名を取得する Team を設定します。

Entity の設定ダイアログで、必要事項を入力、選択します。


  • Entity name : Team と入力

  • Entity type : List を選択

[Done] をクリックして作成します。


1-2-1. List Entity の設定 : Value と Synonym List

作成した Team Entity の詳細設定画面が表示されます。Team Entity では、複数の球団 (のいろいろな呼び方) を取得できるように設定を行います。

Values の欄にある Add new sublist ...Giants と入力して Enter で追加します。

Values の欄に Giants が追加されたら、Synonyms に同義語(取得したい語句) を入力、Enter で追加していきます。

[例] Giants: ジャイアンツ、巨人、読売ジャイアンツ etc...

Giants の Synonym の追加が出来たら、他のチームも同様に Values に追加し、Synonym を入力します。


1-2-2. List Entity の設定 : Roles

同じ Entity でも複数の役割 (Role) を持たせることが出来ます。今回は、1 文に 2 回 Entity が登場したときに、1 回目に登場する Entity を Home Team、2 回目を Away Team として取得することにします。

[例] 今度の巨人阪神戦はいつ?

Giants (Value="巨人") が Home, Tigers (Value="阪神") が Away

Team Entity の設定画面で、Roles の欄にある Create new role ...Home と入力して Enter で追加します。

同様に Away と入力&Enterで追加します。

ひとまず Entity の設定は終了です。


1-3. LUIS app の Intent 設定

今度は Intent の設定を行います。

今回は、以下の 3 種類の Intent を作成し、学習データとなる Utterance (例文) を入力して、Entity とIntent を紐づけします。


  • FindGame : 試合の情報を取得

  • Help : ヘルプメニューの呼び出し

  • None : それ以外


None はデフォルトで作成されており、また削除することはできません。作成されたどの Intent にも当てはまらない場合に None と判定されます。



1-3-1. LUIS app の Intent設定 : FindGame

左バーメニューから App Assets 配下にある Intents をクリックして Intent 設定画面を表示します。+Create new intent をクリックして、新規 Intent を作成します。

Create new intent ダイアログで、Intent Name を入力します。

ここではまず FindGame と入力して、[Done] をクリックして作成します。

FindGame Intent の設定画面が表示されます。

Example utteranceEnter an example of ... と表示されている欄に例文を入力します。

[例]今度の巨人戦はいつ

Enter で追加すると、"巨人" が Team Entity と判定されて表示されます。

同様に例文を追加していきます。HomeAway の Entity Role が設定できる文章を入力しておきます。

[例] 次の横浜阪神戦はいつありますか

Enter で追加すると、"横浜" "阪神" 共に Team Entity と判定されます。

今回は "横浜" を Home Role に設定したいので、最初の Team をクリックして、Team (List) > Home を選択します。

"横浜" の部分が Team:Home と表示されればOKです。同様に後ろの Team をクリックして、Team (List) > Away を選択します。

"阪神" の部分が Teams:Away と表示されればOKです。


Utterance で入力した元の値 (Entity として取得されている文字列) を一覧で確認するには、View Options から Show entity values を選択します。


同様に Utterance をいくつか入力し、LUIS で判定させたいさまざまなサンプルとなる例文 を入力します。同じような構成、表現の文章よりもバラエティに富んでいる方が、より多様な文章の判定がしやすくなります。


1-3-2. LUIS app の Intent設定 : Help

操作方法が分からなくなった場合のエスケープとなる Help Intent を追加します。

左バーメニューから App Assets 配下にある Intents をクリックして Intent 設定画面を表示します。FindGame のときと同様に、+Create new intent をクリックして、新規 Intent を作成します。今回は Intent Name は Help にします。

Help Intent の設定で、同様にヘルプに誘導する場合に検出したい文言を登録します。


2. LUIS app の学習&テスト、ブラッシュアップ


2-1. LUIS app の学習&テスト

設定を行った Entity と Intent を LUIS app に学習させます。

上部バー右側にある [Train] をクリックします。

Queued for training ... などと表示されて学習が行われ、[Train] が緑色になったら学習が完了です。

上部バー右側の [Test] をクリックして、テストウインドウを表示します。

Type a test utterance と書かれている欄にテストしたい文章を入力します。

[例] 今度の阪神戦の日程は

入力した文章が分析されて、その下に FindGame と表示されればOKです。Inspect をクリックするとより詳しい分析結果が表示されます。

"阪神" が Team Entity として取得されていることが分かります。

今度は2つ Team Entity が含まれる文章をテストします。

[例] 中日ヤクルト戦はいつなの

"中日"も"ヤクルト"も Team Entity として取得できていますが、Role は取得できていないようです。


Test ダイアログはもう一度 [Test] をクリックすると非表示になります。



2-2. LUIS app のブラッシュアップ : Pattern の設定

今回は 2つ Entity が出現したときに Team:Home, Team:Away という設定を行っています。対策方法は2つあります。

(1) もっと utterance を増やして学習させる

(2) 形式が決まっているものは Pattern として設定する

まずは (1) の utterance の追加を行います。

左バーメニューから App Assets 配下にある Intents をクリックして Intent の一覧から、FindGame をクリックして設定画面を表示します。判別できなかった文章を utterance として追加します。Team:Home, Team:Away の設定も忘れずに。

次に (2) の Pattern 設定を行います。

FindGame の設定画面から 次の横浜阪神戦はいつありますか (次の Team:Home Team:Away 戦はいつありますか) の横にある ":" をクリックして、 Add as pattern をクリックします。

Confirm patterns ダイアログで表示される内容を編集します。

最初の Team の直後に ":" を入力して、表示される Home を選択して入力します。

同様に 2 つ目の Team の直後に ":" を入力して、表示される Away を選択して入力します。

次の{Team:Home}{Team:Away}戦はいつありますか というパターンになったら [Done] をクリックして確定します。

別のパターンも同様に登録します。

登録されたパターンを確認します。

左バーメニューから Improve app performance 配下にある Patterns をクリックします。登録したパターンが表示されたらOKです。

再度 上部バー右側にある [Train] をクリックして学習させます。

Test をクリックして、再度判定したい文章を入力します。

[例] 巨人阪神戦はいつ

正しく Team:Home, Team:Away が取得出来るようになっていればOKです。


3. LUIS app の公開

LUIS app を API から利用できるように公開 (Publish) します。

上部バー右側にある [Publish] をクリックします。

Environment は Production を選択して [Publish] をクリックします。

画面に Publishing Complete と表示されたら公開完了です。

いずれかの方法で Endpoint (API のアクセス URL) が表記されているページを開きます。


  • Publishing Complete メッセージの Refer to the list of endpoints をクリック

  • 上部バーの MANAGE をクリックして、左バーから Keys and Endpoints をクリック

画面下の Starter_Key の欄にある Endpoint が API でアクセスするときの URL になります。このような URL になっているはずです。

https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/YOUR_LUIS_APPID?verbose=true&timezoneOffset=-360&subscription-key=YOUR_LUIS_STARTER_KEY&q=

URL をクリックします。ブラウザが開いて、JSONが表示されます。

URLの最後尾が q= となっているので、この後に判定したい文章を入力すると、Rest API (GET) で判定結果を取得できます。

例えば、"次の横浜戦はいつ?" という文章を判定したい場合は以下のような URL になります。

https://westus.api.cognitive.microsoft.com/luis/v2.0/apps/YOUR_LUIS_APPID?verbose=true&timezoneOffset=-360&subscription-key=YOUR_LUIS_STARTER_KEY&q=次の横浜戦はいつ?

ブラウザに下記のように JSON で結果が表示されれば公開 OK です。

{

"query": "次の横浜戦はいつ?",
"topScoringIntent": {
"intent": "FindGame",
"score": 0.9600899
},
"intents": [
{
"intent": "FindGame",
"score": 0.9600899
},
{
"intent": "Help",
"score": 0.0185851958
},
{
"intent": "None",
"score": 0.008105181
}
],
"entities": [
{
"entity": "横浜",
"type": "Team",
"startIndex": 2,
"endIndex": 3,
"resolution": {
"values": [
"BayStars"
]
},
"role": "Home"
}
]
}