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でできること・できないことを理解し、アプリケーションを作るイメージを作ります。 - 今回つくるLUISアプリケーションの全体像
今回作るアプリの全体像を説明します。 - 1. LUISアプリケーションを作る
LUISアプリケーションを作ります。 - 2. 電車の時刻検索のためのLUIS
アプリケーションに電車時刻検索に関するIntentを作成します。 - 3. Phrase List機能の利用
Phrase List機能を使って、学習を促進させます。 - 4. 天気を聞くのためのLUIS
天気を聞くためのIntentを作成します。 - 5. WebAPIの発行
LUISアプリケーションを、外部からアクセスできるようWebAPIします。 - 6. What's Next
この後、どう進めるかの方向性を説明します。 - 余談
LUISの開発画面の機能を説明と、日本語版と英語版での機能の差分を簡単に説明します。
LUISでできること
LUISは自然言語処理をしてくれるAPIですが、そもそも自然言語を処理するっていうと、意味が広すぎます。
LUISがしてくれることは、主に以下の2つです。
- 文章が、どの
Intent
にあたるかを振り分ける - 文中の単語が、どの
Entity
にあたるかを振り分ける
(Intent
とEntity
は、後述でLUISを作りながら説明します。)
文章に対して、WebAPIを通じてIntent
とEntity
の分析結果を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
からログインしましょう。
ログインするには、Microsoftアカウントなどが必要です。ログインできそうなアカウントがない方は登録をしてからここにサインインします。
サインインできたら、画面上部のAPIs
> Language Understanding
をクリックします。
画面の中央右あたりにあるLanguage Understanding (Beta)
をクリックします。
これでLUISのMy Applicationの画面に遷移します。(以下の画面に遷移しない場合は、単にログインができていなときです。)
そして、+New App
> +New Application
をクリックします。
余談ですが、LUISのアプリは、設定や学習した結果がjson形式で保存されています。そのjsonファイルをエクスポートして、別のLUISにインポートすることが可能です。
本題に戻り、ダイアログが表示されますので、ざっくり入力していきます。
Enter application name
アプリケーションの名前を入力します。Enter application usage senario
アプリケーションの利用シナリオを選ぶところです。今回は、Bot
を選びますが、用途に合わせて選択します。Choose aplication domain(s)
今回は特に選択する必要ありません。*1Enter appllication description(optional)
任意の項目で、アプリの概要を入力できます。Choose Application Culture
言語を選びます。今回は、Japanese
を選びます。
Add App
ボタンをクリックして、作成は完了です。
2. 電車の時刻検索のためのLUIS
ここから本題です。作り方や設定方法は何通りかあるのですが、機能を知るためにちょっと細かい手順で進めます。
Entityの作成
電車の出発駅と到着駅にラベル付けするためのEntityを先に作りましょう。画面左のEntitiesの+
をクリックするとダイアログが表示されます。
ネーミングセンスが問われるところで辛いですが、Entityの名前を「Location」とします。そして、Include children
にチェック。Hierarchical
を選択します。行き先駅用のToLocation
と出発駅用のFromLocation
を作りしましょう。
Intentの作成
画面の右側Intentsの+
をクリックし以下のように入力します。
Intent name
今回は、「GetTimeOfTrain」と入れます。Enter an example of ....
学習用の例文を入力します。「品川から東京の電車ある?」といれました(あえて中途半端な日本語を...)。- Action Parameters
出発駅用にDepartures(Type: Location::FromLocayionを選択)、目的駅用にDestination(TypeにはLocation::ToLocationを選択)を入力しました。
Save
ボタンをクリックすると、画面中央(New utterancesタブ)で、入力した質問が表示されています。ここで最初の学習をさせます。
LUISの学習は何かというと、入力した文章がどのIntentに該当し、単語がどのEntityに割り当てられるかを教えること=ラベル付けすることです。
文章を入力すると、"分かち書き"された内容が表示されます。Entityを割り当てましょう。「品川」をクリックしてFromLocation
、「東京」をクリックしてToLocation
を選択してSubmit
ボタンをクリックし、この文章の学習は完了です。
他にも文章を学習させてみましょう。文章を入力し、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と入力し、値には、
東京,品川,池袋,北千住,神奈川,横浜
と入力します。半角のカンマでなければ区切りと認識されませんのでご注意ください。
Save
して、Trainが終わったら再度文章を入力して学習させてみましょう。賢くなってくれているはずです。
画面左下のTrain
がクルクル回ると学習していることを示します。学習した内容がうまく反映されない場合は、Train
をクリックして学習させましょう。*2
4. 天気を聞くのためのLUIS
新たに「GetWeather」という名前でIntentを追加しましょう。以下のように入力します。パラメーターのTypeは、Location
を指定し、Valueに先ほど作ったPhrase Listのstationnames
を設定しています。
後は、いくつか文章を学習させ、IntentとEntityを適切に設定させれば、いい感じに動くでしょう。
5. WebAPIの発行
Publishをクリックし、Update published application
ボタンをクリックすると、RESTでアクセスできるWebAPIを簡単に公開することができます。また、Queryに文章を入力してDownload logs
ボタンをクリックするとレスポンスのjsonを受け取ることが可能です。
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もあります。 MicrosoftのBot関連のプラットフォームは、SkypeやSlack、Facebook Messangerなどと連携してコミュニケーションをすることが可能です。
余談
EX1. LUISの画面の機能
画面にはいくつかタブがあります。簡単に機能を紹介します。主には文章にラベル付け(IntentやEntityを割り当て)をしたり修正したりする機能が備わっています。
New utterances
新しい文章を入力し、ラベル付けをします。Search
ラベル付けされていない文章を検索することができます。Suggest
改善できそうな文章の表示し、修正をすることができます。Review labels
既にラベル付けした文章を確認、修正することができます。
英語版と日本語版ではまだ機能差が...
日本語にしていると表示されないのですが、英語でアプリケーションを作っていると、pre-build entities
という機能も表示されます。
ざっくり説明すると、パラメーターの型を賢く学習したTypeを用意しており、例えば「日付」だと一般的にあるパターンで入力すると日付として認識してくれます。
他にも、Fulfillmentという面白そうな機能などあります。興味がありましたらぜひドキュメントを覗いてみてください。
Cognitive Services | Microsoft Azure