BEACHSIDE BLOG

MicrosoftとかC#を好むレンジャーの個人的メモ

LUIS 入門(Cognitive Services - 2017年12月版 - 1/2)

12/13に LUIS がGeneral Availability (GA、正式に一般提供の開始)されポータルもかなり変わったので、改めて入門ネタを書いてみました。

LUIS (Language Understanding Intelligent Service)とは Microsoft Azure の Cognitive Services の 自然言語処理のサービスの一つで、概要は後述の 1. 事前準備 > LUIS を使う前の予備知識 に記載してます♪。

Overview

1. 事前準備(今回)
2. LUIS App の構築(今回)
3. Features / PreBuild Entity の活用(次回)
4. バージョン管理 / 共同編集 / 公開(次回)

元々は12/7に書いた記事ですが、12/13の LUIS の GA でポータルが大幅に更新されたため書き直してます....

12/13GA時に更新された情報は、以下でざっくりまとめてます。

beachside.hatenablog.com

どうでもいい話ですが、GAでポータル側は、"Language Understanding" という表記になって、IS(Intelligent Service)の部分がないけど、Azure ではまだ記載があって正式名称はLUになった?とかなんとなく思っています。


今回は、Cogbot Advent Calendar 8日目のエントリーです。

LUIS 以前に Cognitive Services の全体を俯瞰したい場合は、以下を是非...(私の執筆なやつなですが...汗)

1. 事前準備

Microsoft アカウント

LUIS のポータルサイトでアカウントを作るために、Microsoft アカウントが必要です。もっていない場合はマイクロソフトのサイトから申し込みましょう。

サブスクリプションキー

サブスクリプションキーは、LUIS を外部(Web API とか)から利用するために必要となります。つまりキーがなくても、LUIS のポータルサイトで学習モデルを作って文章がどれくらい認識されるか試すことはできますので、試したいだけなら無理に取得することもないでしょう。

サブスクリプションキーを取得には、Azure のアカウントで Azure のポータルにログインして取得する必要があります。
手順はこちらです。

また、LUISのポータルに新規でサインアップすると無料のキーが付与されるようです!利用量や期間に制限があるかもしれませんがサクッと試せそうですね(新規にサインアップして無駄にアカウント作りたくないので試してないです♪)。

2017/12/13にGAして料金がきになるところですね。もちろん無料枠はあります。サクッと試すには十分かと個人的に思っています。詳しくはこちらをご覧ください。

価格 - Language Understanding Intelligent Services の API | Microsoft Azure

LUIS を使う前の予備知識

LUIS がざっくりどんな機能かというと、
「文章を入力すると、その文章がどの インテント で、文章中の単語がどの エンティティ に属するかを判断してくれる」
というものです。

インテントエンティティ をどう決めるのは、会話からどんな情報を引き出せばプログラムが要件を満たせるか次第だと思います。
そのため、開発者がすることは、適切な インテントエンティティ を定義し、文章を学習させて賢くさせることです。

例として「天気予報を調べるのと、あいさつができるチャットボット」が作りたい場合だと、会話の文章から以下の情報を取得できれば実現できそうです。

  • 文章が、天気予報を聞いているのかあいさつなのか(インテントにて判断させる)
  • いつ(エンティティにて判断させる。空なら今日とするとか)
  • どこ(エンティティにて判断させる。取得できないならボットから場所の質問するか、デバイスからロケーション情報取得するとか)。

インテントとエンティティの設定例です。

インテント エンティティ 学習させる文章例 備考
天気予報 [日付], [場所] 明日の品川の天気は? エンティティは、[日付]=明日、[場所]=品川
渋谷の天気は? エンティティは、[日付]=なし、[場所]=渋谷
あいさつ なし こんにちは
にゃんぱすー

LUISで学習させたモデルは、外部からRESTでアクセスができるWebAPIとして公開できます。 学習させたモデルのバージョン管理も可能です。

これで、LUISを呼ぶ側のプログラムは、LUISからのレスポンスに応じてこんな感じで作れそうです。

  • インテント = あいさつ の場合
    ランダムなあいさつの会話を返す
  • インテント = 天気予報 の場合
    エンティティの「いつ」「どこ」の情報を取得し、お天気のWebAPIに問い合わせて天気情報を取得する

前置きはこれくらいにしてLUISを構築してみましょうか。

2. LUIS App の構築

LUIS Appの作成

LUIS のポータル(https://www.luis.ai/)を開きましょう♪ログインまたはサインアップしてない場合はボタンをクリックしてします。ログイン済みの場合は、以下の図のボタンが Go to my app となってますのでクリックします。

f:id:beachside:20171219145830p:plain


「My Apps」の画面では自分の作ったLUISアプリの一覧が表示されます。Create new app をクリックしてLUISのアプリを作っていきましょう。

f:id:beachside:20171219145852p:plain


アプリの「名前(Name)」と「言語(Culture)」を入力します。テキストを解析するうえで「言語(Culture)」の選択は重要なポイントです。日本語用を作りたければ「Japanese」を選びましょう。Done ボタンをクリックすれば作成されます。

f:id:beachside:20171219145904p:plain


ここは12/13のGAの更新でかなりすっきりしましたね。画面の右上部がタブのようになっていて(ここではタブと呼ぶことにします)、以下の構成になっています。

  • DASHBOARD
    インテントやエンティティの数やアプリの状態が見えるダッシュボードです。

  • BUILD
    インテントやエンティティの作成といったアプリの構築をこのタブで行います。

  • PUBLISH
    アプリをエンドポイントに公開する作業をここで行います。

  • SETTINGS
    学習モデルのバージョン管理や、共同編集者の追加などを行います。

  • Train
    クリックすると、学習が行われます。

  • Test
    学習したモデルをテストすることができます。

f:id:beachside:20171219150000p:plain


インテント、エンティティの作成

インテントは、デフォルトで「None」が存在しており、文章を入力した際、学習モデルが自身で追加したどのインテントにも該当しなければ、「None」になります。
まず、インテントを作っていきましょう。BUILD タブをクリックし、左ペインの Intents をクリックして Create new intent をクリックします。

f:id:beachside:20171219150028p:plain


下図では、天気予報用にインテントの名称に「CheckWeather」と入力し、追加(Done ボタンををクリック)しました。

f:id:beachside:20171219150050p:plain

インテントCheckWeather」が選択された画面になります。

今回は、文章を登録させた後にエンティティを追加して割り当てる流れで進めます(ここでの作業は"登録する"ってだけです、のちほど学習(Train)を行います)。 下のgifでやってることは以下です。

  • 「今日の品川の天気は」 という文章を入力して Enter をツッターン
  • 下のUtterance Textに表示されている(形態素解析された)文章の中で「品川」をクリック
  • Search or create に「location」というエンティティ名を入力
  • Done をクリックしてエンティティを追加

f:id:beachside:20171219144645g:plain


これと同様に「今日」という単語に「date」というエンティティを追加して割り当てます。
こんな手順で複数の文章を登録します。例えば以下のような文章とかです。

  • 「明日の渋谷の天気は」
  • 「明後日の池袋の天気は?」
    などなど。


ここでエンティティについてちょっと触れておくと、
先ほどつくったエンティティは「Simple」というtypeです。そのほかに「List」「Hierarchical」「Composite」「Prebuilt」 があります。今回は詳しく書きませんが用途によっては便利なので見てみるとよいと思います


インテントの作成~文章を登録~エンティティの作成と割り当てと同様の流れで、
挨拶用に「Greeting」のインテントを作り、あいさつの文章(「おはよー」「こんにちは」「やっはろー」とか)を登録しましょう。単純なあいさつの例ということで今回はエンティティの登録はなしで進めます。

学習とテスト(Train & Test)

文章を登録させたら、学習(Train)させて出来栄えを試してみます。
画面右上部にある Train ボタンをクリックし、Train Application ボタンをクリックすると学習が始まります。

f:id:beachside:20171219150102p:plain


学習が終わったら、Train ボタンの右にある Test をクリックしてでテストしてみます。挨拶が Greeting のインテントに、天気を聞く文章は CheckWeather のインテントで適切なエンティティに割り当てられるか試してみましょう。

f:id:beachside:20171219150112p:plain


まだ学習させた文章が少ないので頭の良いモデルができたとは言い難いですが、流れとしてはこんな感じです。
ここから精度向上を目指して文章をたくさん学習させたり、別のタイプのエンティティを利用したり Features というものを利用して Try & Error を繰り返していきます。

その後、チャットボットなどの外部のアプリから呼べるように公開し、バージョン管理をしながら再学習したりって流れですが、そのあたりを次回書こうと思います。

明日のCogbot Advent Calendar@makopoさんです。複数投稿ありがとうございます&よろしくお願いします~♪

この内容自体は、次回に続きます。

beachside.hatenablog.com