BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

LUIS を試してみよう(Cognitive Services のLanguage Understanding Intelligent Service API)

2017-12更新:2017年12月版を書きました♪
LUIS 入門(Cognitive Services - 2017年12月版 - 1/2) - BEACHSIDE BLOG

Microsoft Cognitive Services の中で、自然言語理解のAPI、LUIS(Language Understanding Intelligent Service) を試してみましょう(2016-11-20時点)。
料金については、検証程度ならだいたい無料でできると思いますが、こちらで事前に確認をしておきましょう。

Overview

LUISでできること

LUISは自然言語処理をしてくれるAPIですが、そもそも自然言語を処理するっていうと、意味が広すぎます。
LUISがしてくれることは、主に以下の2つです。

  • 文章が、どのIntentにあたるかを振り分ける
  • 文中の単語が、どのEntityにあたるかを振り分ける

IntentEntityは、後述でLUISを作りながら説明します。)

文章に対して、WebAPIを通じてIntentEntityの分析結果をjson形式で返してくれることがLUISの役割です。
LUISは、その文章に対して直接の答え(例として「天気を教えてという文章に対して、天気を答える」とか)を返してくれるわけではありません。それは、別途自分で作る必要があります。次で具体的に説明を進めます。

今回つくるLUISアプリケーションの全体像

1つのLUISアプリケーションで、以下2つの機能を実装してみます。

  • 電車の時刻を聞く
  • 天気を聞く

「品川から渋谷の電車の時間は?」「渋谷の天気は?」という質問に受け答えするボットなどの言語処理部分となります。
具体的なイメージとしては、「品川から渋谷の電車の時間は?」という文章に対して、

  • Intent : 電車の時間
    • Entity(出発駅) : 品川
    • Entity(目的駅) : 渋谷

「渋谷の天気は?」という文章に対して、

  • Intent : 天気
    • Entity(場所) : 渋谷

という結果をjson形式で返すだけです。「それだけ?」と思う方もいるかもしれませんが、何をしたいかとその必要なパラメーターが理解できれば、プログラムはつくれるものなので(と言っておきます...)、ここまでを無料または安価にできるのであれば、現実的に素晴らしい機能と言えます。 (逆にいうと自然言語処理とは、それほど難しいものなのです。)

ちょっとネガティブっぽい感じになってしまいましたが、作ってみると楽しいです。さっそく作っていきましょう。

1. LUISアプリケーションを作る

Cognitive ServicesのページからLUISにアクセスします。

LUISのアプリケーション一覧(https://www.luis.ai/ApplicationList)に直接アクセスすればいいだけの話なんですが、初めての方向けに迷子にならない手順で進みます。

まず、
https://www.microsoft.com/cognitive-services
にアクセスして、画面右上のMy accountからログインしましょう。

f:id:beachside:20161120194145p:plain

ログインするには、Microsoftアカウントなどが必要です。ログインできそうなアカウントがない方は登録をしてからここにサインインします。

f:id:beachside:20161120194327p:plain

サインインできたら、画面上部のAPIs > Language Understandingをクリックします。

f:id:beachside:20161120194725p:plain

画面の中央右あたりにあるLanguage Understanding (Beta)をクリックします。

f:id:beachside:20161120194407p:plain

  これでLUISのMy Applicationの画面に遷移します。(以下の画面に遷移しない場合は、単にログインができていなときです。)
そして、+New App > +New Applicationをクリックします。

f:id:beachside:20161120194813p:plain

余談ですが、LUISのアプリは、設定や学習した結果がjson形式で保存されています。そのjsonファイルをエクスポートして、別のLUISにインポートすることが可能です。  

本題に戻り、ダイアログが表示されますので、ざっくり入力していきます。

  • Enter application name
    アプリケーションの名前を入力します。

  • Enter application usage senario
    アプリケーションの利用シナリオを選ぶところです。今回は、Botを選びますが、用途に合わせて選択します。

  • Choose aplication domain(s)
    今回は特に選択する必要ありません。*1

  • Enter appllication description(optional)
    任意の項目で、アプリの概要を入力できます。

  • Choose Application Culture
    言語を選びます。今回は、Japaneseを選びます。

f:id:beachside:20161120195936p:plain

Add Appボタンをクリックして、作成は完了です。

2. 電車の時刻検索のためのLUIS

ここから本題です。作り方や設定方法は何通りかあるのですが、機能を知るためにちょっと細かい手順で進めます。

Entityの作成

電車の出発駅と到着駅にラベル付けするためのEntityを先に作りましょう。画面左のEntitiesの+をクリックするとダイアログが表示されます。 ネーミングセンスが問われるところで辛いですが、Entityの名前を「Location」とします。そして、Include childrenにチェック。Hierarchicalを選択します。行き先駅用のToLocationと出発駅用のFromLocationを作りしましょう。

f:id:beachside:20161120204103p:plain

Intentの作成

画面の右側Intentsの+をクリックし以下のように入力します。

  • Intent name
    今回は、「GetTimeOfTrain」と入れます。

  • Enter an example of ....
    学習用の例文を入力します。「品川から東京の電車ある?」といれました(あえて中途半端な日本語を...)。

  • Action Parameters
    出発駅用にDepartures(Type: Location::FromLocayionを選択)、目的駅用にDestination(TypeにはLocation::ToLocationを選択)を入力しました。

f:id:beachside:20161120205058p:plain

Saveボタンをクリックすると、画面中央(New utterancesタブ)で、入力した質問が表示されています。ここで最初の学習をさせます。 LUISの学習は何かというと、入力した文章がどのIntentに該当し、単語がどのEntityに割り当てられるかを教えること=ラベル付けすることです。

文章を入力すると、"分かち書き"された内容が表示されます。Entityを割り当てましょう。「品川」をクリックしてFromLocation、「東京」をクリックしてToLocationを選択してSubmitボタンをクリックし、この文章の学習は完了です。

f:id:beachside:20161120205937p:plain

他にも文章を学習させてみましょう。文章を入力し、Entityを割り当て正しいIntentを選択します。Intentの横の数字は、0~1点のスコアです。 例として、以下の文章を入力してみましょう。

  • 東京から池袋に行く電車の時刻は?
  • 渋谷から川崎の電車は?
  • 品川から北千住の電車ある?

思った通りに賢くなってくれますでしょうか。中々そうはいかないです。「北千住」なんて、分かち書きで「北」と「千住」の2単語になってしまいました。 学習にもいくつかコツはあり、以下ドキュメントで解説されています。
Cognitive Services | Microsoft Azure

この中から一つを紹介します。

3. Phrase List機能の利用

Phrase Listとは、辞書のようなものです。文章でも単語でも可能です。半角のカンマを1単語(または1文章)とし、辞書として登録できます。Phrase Listはアプリケーション全体に適用されますが、Intentで設定したパラメーターごとにPhrase Listを登録することもできます。

さっそく登録してみましょう。 画面左のPhrase List Featuresの+をクリックし、feature name(辞書名になります)にstationnamesと入力し、値には、

東京,品川,池袋,北千住,神奈川,横浜

と入力します。半角のカンマでなければ区切りと認識されませんのでご注意ください。

f:id:beachside:20161120230325p:plain

Saveして、Trainが終わったら再度文章を入力して学習させてみましょう。賢くなってくれているはずです。 画面左下のTrainがクルクル回ると学習していることを示します。学習した内容がうまく反映されない場合は、Trainをクリックして学習させましょう。*2

4. 天気を聞くのためのLUIS

新たに「GetWeather」という名前でIntentを追加しましょう。以下のように入力します。パラメーターのTypeは、Locationを指定し、Valueに先ほど作ったPhrase Listのstationnamesを設定しています。

f:id:beachside:20161120230501p:plain

後は、いくつか文章を学習させ、IntentとEntityを適切に設定させれば、いい感じに動くでしょう。

5. WebAPIの発行

Publishをクリックし、Update published applicationボタンをクリックすると、RESTでアクセスできるWebAPIを簡単に公開することができます。また、Queryに文章を入力してDownload logsボタンをクリックするとレスポンスのjsonを受け取ることが可能です。

f:id:beachside:20161120232444p:plain

RESTでアクセスする際のURLも記載されていますので、外部からアクセスすることも可能です。URLついて触れておくと、

  • apps/の後ろから?までが、LUISのApp Idになります。
  • subscription-key=の後ろがLuisのAPIKeyになります。

APIの動作をここで簡単に確認できるところは、素晴らしいですね。

新たに学習したらUpdate published applicationをすることを忘れないようにしましょう。

6. What's Next

この後、どのようにアプリケーションを進化させていくか、いくつかヒントを書いてみます。

LUISを進化させる

Entityを増やして、より多様な文章に対応できるようにしてみましょう。終電や始発を認識させるようにすると面白くなってきます。ちょっと本気のアプリケーションを作ると、Entityが10~20になります。そうなるとChildの機能の有効性も感じることができます。

LUISを活用する

LUISとBot FrameworkやAzure Bot Serviceなど使ってボットで活用すると、より実用できるようになります。Bot Serviceで、電車の時刻を調べる機能を付けたり、天気を調べる機能を付けたりして見ましょう。電車の時刻や天気は、無料のAPIもあります。 MicrosoftBot関連のプラットフォームは、SkypeやSlack、Facebook Messangerなどと連携してコミュニケーションをすることが可能です。

余談

EX1. LUISの画面の機能

画面にはいくつかタブがあります。簡単に機能を紹介します。主には文章にラベル付け(IntentやEntityを割り当て)をしたり修正したりする機能が備わっています。

  • New utterances
    新しい文章を入力し、ラベル付けをします。

  • Search
    ラベル付けされていない文章を検索することができます。

  • Suggest
    改善できそうな文章の表示し、修正をすることができます。

  • Review labels
    既にラベル付けした文章を確認、修正することができます。

f:id:beachside:20161121004329p:plain

英語版と日本語版ではまだ機能差が...

日本語にしていると表示されないのですが、英語でアプリケーションを作っていると、pre-build entitiesという機能も表示されます。

f:id:beachside:20161120232031p:plain

ざっくり説明すると、パラメーターの型を賢く学習したTypeを用意しており、例えば「日付」だと一般的にあるパターンで入力すると日付として認識してくれます。
他にも、Fulfillmentという面白そうな機能などあります。興味がありましたらぜひドキュメントを覗いてみてください。

Cognitive Services | Microsoft Azure

 

*1:アプリケーションのドメインを選択してくれと言っていますが、何のために選ぶのか不明です....。 FulfillmentというAPI連携ができる便利そうな機能があるのですが(日本語には未対応)、将来的にそのAPI一覧の表示を絞り込むためかなーと妄想してます。

*2:たまにjavascriptがオちて学習とかEntityの割り当てができなくなることが...Trainしてもだめなときは、ブラウザをリロード!