連載
» 2017年01月31日 05時00分 UPDATE

Dev Basics/Keyword:LUIS(自然言語解析サービス)

LUISはマイクロソフトが提供する自然言語解析サービス。ユーザーが「何をしたいのか」(インテント)とそれに付随する情報(エンティティ)を取り出せる。

[かわさきしんじ,Insider.NET編集部]
「Dev Basics/Keyword」のインデックス

連載目次

 LUIS(Language Understanding Intelligent Services)はマイクロソフトがCognitive Servicesの一部として提供する自然言語解析サービス。LUISでは自然言語を理解するためのモデル(LUISアプリ)を開発者が構築し、それを基にLUIS自身が学習を積んでいくことで、ユーザーが「何をしたいのか」(インテント、意図)と関連する情報(エンティティ)を取り出せるようになる。

LUISの簡単な使い方

 LUISを使うと自然言語解析を行うためのモデルを作成して、それをREST APIとして構築/公開できる。なお、LUISを利用するにはwww.luis.aiでマイクロソフトアカウントを用いて、アカウント登録を行う必要がある。また、登録時にはLUISからのマイクロソフトアカウントへのアクセス許可が求められる。初回サインインの後には簡単なチュートリアルが始まるので、必要に応じてLUISのUIの使い方を見ておこう。チュートリアルが終了すると、次のような画面が表示される。

[New App]ドロップダウンで新たなLUISアプリを作成する [New App]ドロップダウンで新たなLUISアプリを作成する

 ウィンドウ左上の[New App]ドロップダウンからはLUISアプリ(モデル)を新規に作成する。[Cortana pre-built apps]ドロップダウンからはCortanaで利用されているモデルを利用できる(ただし、2017年1月30日時点では日本語のモデルは提供されていない)。[Start Tutorial]ボタンはチュートリアルを再度表示するためのものだ。ここでは[New App]−[New Application]を選択して、独自のLUISアプリを作成してみよう。

 ドロップダウンから[New Application]を選択すると、次のような画面が表示される(PCの画面サイズによっては、表示が崩れるので注意)。

アプリ名、どんなシナリオで使用されるか、アプリが対象とする領域、言語などを指定する画面 アプリ名、どんなシナリオで使用されるか、アプリが対象とする領域、言語などを指定する画面

 この画面ではアプリの名前、その利用シナリオ、どんな種類のアプリか(アプリのドメイン)、簡単な説明、使用する言語を設定する。ここではそれぞれ、「luistest」「Bot」「Navigation & Maps」「insider.net LUIS sample」「Japanese」を指定したものとする。次に[Add App]ボタンをクリックすると、新規LUISアプリが作成される。

LUISアプリが作成されたところ LUISアプリが作成されたところ

 この画面でさまざまな例文(utterance、言葉)を入力し、それがどんな要素で構成されているかを指示しながら(これを「ラベル付け」「labeling」と呼ぶ)、ユーザーが何をしたいのかを抽出できるようにしていく。実際には左側のバーから「インテント」(ユーザーがしたいこと)や「エンティティ」(インテントの対象、付加情報)などを選択して、さまざまな設定を行う。作成したLUISアプリは上の[Publish]ボタンをクリックすることで、REST APIとして公開できる。

 ここでは「場所とカテゴリ」を入力すると、それに応じた店舗を発見する機能を実現することを前提として(例:「新宿のカフェ」)、入力されたテキストを解析してみる(実際の機能の実装は別記事としてお届けする予定だ)。そこで以下では、「インテント」(ユーザーがしたいこと)は「findCategory」、その「エンティティ」(インテントの対象)は場所を表す「Location」とカテゴリを表す「Category」とする。

 まずはインテントの追加から見てみよう。これには左側のバーで[Intent]の隣にある[+]ボタンをクリックする。すると、[Add a new Intent]ダイアログが表示されるので、インテントの名前(ここでは「findCategory」)と例文(ここでは「新宿のカフェ」)を入力する。[Save]ボタンをクリックすると作成したインテントが保存される。

インテントの追加 インテントの追加

 次に「エンティティ」を追加する。これには左側のバーで[Entities]の隣にある[+]ボタンをクリックする。これにより、[Add a new Entity]ダイアログが表示されるので、「Location」と「Category」を追加する。

エンティティの追加 エンティティの追加

 追加したエンティティは次の画面のように、左側のバーで色分けして表示される。

インテント/エンティティ追加後の画面 インテント/エンティティ追加後の画面

 また画面中央にはインテント追加時に入力した例文が表示されている。そこで、この例文について、ラベル付け(LocationとCategory、対応するインテントの指定)を行う。上の画面では最初からインテントに[findCategory]が表示されているので、これについては特に指定をする必要はない。LocationとCategoryについては、マウスで範囲選択してからその部分をクリックすると、メニューが表示されるのでそこから適切なエンティティを選択すればよい。

エンティティの設定 エンティティの設定

 ここでは「新宿」を「Location」に、「カフェ」を「Category」にする。ラベル付けが済んだら[Submit]ボタンをクリックする。これで、LUISアプリへの例文とそのラベル付けの登録が完了する。同様にして「上北沢のラーメン屋」「吉祥寺のコンビニ」など適当なものを入力して、ラベル付けを行っていく。なお、例文の登録時にはインテントを示すドロップダウンに[None]が表示される場合がある。これは、ユーザーの入力が自分のLUISアプリとは無関係である(することがない)ことを示すために使われるインテントだ。例えば、「新宿の天気」と入力をし、「この例文については、今回作成しているLUISアプリでは何もすることがない」ことを示すために「None」を指定してやる。

 これまでにラベル付けを行った例文については[Review labels]タブでドロップダウンから[Show all labelled utterances]を選択すると一覧表示される。この画面でラベル付けを修正することも可能だ。

 最後に左下にある[Train]ボタンをクリックすると、LUISアプリがラベル付けされた例文の学習を行う。学習を行った後は左側のバーにある[Publish]リンクが有効になるので、このLUISアプリをREST APIとして公開できるようになる。リンクをクリックすると、次のような画面が表示されるので、さらに[Publish web service]をクリックする(ここにはLUISアプリのIDと、そのアクセスキーが表示されているので、自分のプログラムからこのAPIを呼び出す際にはそれらを使用する)。[Query]欄に何かを入力してAPIのURLをリンクすると、呼び出しが行われ、その結果がJSON形式で返されるので、LUISがどのような判定を行ったかも確認できる。

REST APIのURL、アプリID、アクセスキー、クエリ REST APIのURL、アプリID、アクセスキー、クエリ
このダイアログでそのままAPI呼び出しを行える

 ちなみに「新宿の居酒屋」での呼び出し結果は次のようになった。

{
  "query": "新宿の居酒屋",
  "topScoringIntent": {
    "intent": "None",
    "score": 0.5224018
  },
  "intents": [
    {
      "intent": "None",
      "score": 0.5224018
    },
    {
      "intent": "findCategory",
      "score": 0.424302518
    }
  ],
  "entities": [
    {
      "entity": "新宿",
      "type": "Location",
      "startIndex": 0,
      "endIndex": 1,
      "score": 0.9326811
    }
  ]
}


今回の「新宿の居酒屋」でのAPI呼び出しの結果

 一番上の「topScoringIntent」を見ると、インテントが「None」でそのスコアは0.52であることが分かる。一方、「intents」を見ると、「findCategory」インテントのスコアが0.42であることも分かる。この場合、「Category」エンティティに「居酒屋」を利用したラベル付けが行われていないことから、的確な推測が行われなかったということだろう(「新宿」についてはきちんと「Location」型のエンティティであることが推測できている)。

 このようなAPI経由で行われたテキスト解析に対して、ラベル付けを行うには[Suggest]タブを使用する。例えば、[Suggest]タブでは「新宿の居酒屋」は次のような表示となる。

[Suggest]タブ [Suggest]タブ

 先ほどと同様に、ラベル付けを行い、[Submit]ボタンをクリックし、最後に[Train]ボタンをクリックすれば、この結果が学習され、次回以降のAPI呼び出しではこの結果が反映されるようになる。

 このように、開発者がさまざまな例文を与え、そのラベル付けを行うことで、エンティティやインテントを学習させていき、精度の高い自然言語認識を手軽に行えるのがLUISの大きな特徴である。なお、例文を外部ファイルからインポートして[Suggest]タブでまとめてラベル付けを行うといったことも可能だ。


 LUISは例文とそのラベル付けを通して、「ユーザーが何をしたいのか、その対象は何か」(あるいは「ユーザーの入力に対して自分は何もすることがないこと」)を抽出できるようにするための自然言語認識技術であり、これを利用することでアプリに一定の知性を与えることが可能になる。

参考資料


「Dev Basics/Keyword」のインデックス

Dev Basics/Keyword

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。