docomoの発話理解APIからLUISの扱い方を学ぶ
はじめに
この記事は「Microsoft Cognitive Services & Bot Framework - Qiita」の8日目になります。
概要
LUIS(Language Understanding Intelligent Service)は非常に優秀な自然言語解析ツールですが、日本語ではサンプルモデルが存在せず、どのようなIntentとそのパラメータ、および、Entityを扱えばよいか困っている人もいることでしょう。
そこで本記事、『docomo Developer support | NTTドコモ』で提供している発話理解APIを元に学んでいきます。
LUISの基本知識はある程度省略しますので、
本記事を読み進める前に以下の記事を読んでいただけると理解が深まります。
docomoの発話理解API
発話理解APIは発話文をテキストでインプットすると、文脈を解析し、その意図に沿った『コマンド名』及び『スロット名』に該当する値を返却するAPIです。

LUISですと『コマンド』がIntent、『スロット』がパラメータにあたります。
発話理解APIで取得できるコマンド
発話理解APIのリファレンスで紹介しているコマンド一覧は以下になります。
| commandID | commandName | 説明 | スロット名 |
|---|---|---|---|
| BC00101 | 雑談 | あいさつなど雑談 | |
| BK00101 | 知識検索 | Q&Aの検索 | |
| BT00101 | 乗換案内 | 乗り換え案内を検索 | stationTo, stationFrom |
| BT00201 | 地図 | 地図の表示 | searchArea, hereArround, facilityName |
| BT00301 | 天気 | 天気の検索 | searchArea, hereArround, date |
| BT00401 | グルメ検索 | 飲食店の検索 | gourmetGenre, searchArea, hereArround |
| BT00501 | ブラウザ | ブラウザアプリの起動 | browser, website |
| BT00601 | 観光案内 | 観光地の検索 | searchArea, hereArround, sightseeing |
| BT00701 | カメラ | カメラアプリの起動 | |
| BT00801 | ギャラリー | ギャラリーアプリの起動 | |
| BT00901 | 通話 | 電話アプリの起動 | phoneTo |
| BT01001 | メール | メールアプリの起動 | mailTo, mailBody |
| BT01101 | メモ登録 | メモの生成 | memoBody |
| BT01102 | メモ参照 | メモの参照 | memoBody |
| BT01201 | アラーム | アラーム設定 | time |
| BT01301 | スケジュール登録 | スケジュールの登録 | date, time, scheduleBody |
| BT01302 | スケジュール参照 | スケジュールの参照 | date, time |
| BT01501 | 端末設定 | 端末設定の起動 | setting |
| BT01601 | SNS投稿 | SNSへの投稿 | snsSource, snsBody |
| BT90101 | キャンセル | キャンセルコマンド | |
| BM00101 | 地図・乗換 | 地図・乗換いずれかのタスク | searchArea |
| BM00201 | 通話・メール | 通話・メールいずれかのタスク | phoneTo |
| SE00101 | 判定不能 | 判定不能 | |
| SE00201 | サーバエラー1 | サーバエラー | |
| SE00202 | サーバエラー2 | サーバエラー | |
| SE00301 | ライブラリエラー | ライブラリエラー |
余談ですが上記の表はdocomoの公式のHTMLからExcelにコピーし、以下のアドインを使ってExcelからMarkdown形式に変換しています。便利です。
発話理解APIで取得できるスロット
スロット一覧は以下になります。
| スロット名 | 説明 | タイプ |
|---|---|---|
| browser | ブラウザ名を格納 | browser |
| date | 日付,曜日,相対日付を格納 | date, datePnoun, dateWeek, dateRelative |
| facilityName | 検索対象の施設名を格納 | gpoi |
| gourmetGenre | グルメ検索ジャンルを格納 | food, drink |
| hereArround | 現在地周辺を表す言葉を格納 | hereArround |
| mailBody | メール件名を格納 | mailBody |
| mailTo | メール宛先を格納 | fullName, lastFirstName, firstName, lastName, postName, otherAddress, upoi, gpoi |
| memoBody | メモの本文を格納 | memoBody |
| phoneTo | 電話宛先を格納 | phoneNumber, fullName, lastFirstName, firstName, lastName, postName, otherAddress, upoi, gpoi |
| scheduleBody | スケジュール内容を格納 | scheduleBody |
| searchArea | 検索対象の地名を格納 | address, upoi |
| setting | 設定項目を格納 | setting |
| sightseeing | 観光関連用語を格納 | sightseeing |
| stationFrom | 乗車駅を格納 | stationFrom, hereFrom, station, here |
| stationTo | 降車駅を格納 | stationTo, hereTo, station, here |
| snsBody | SNSの本文を格納 | snsBody |
| snsSource | SNSの投稿先を格納 | snsSource |
| time | 時刻,または相対時間を格納 | time, timeRelative, timeHour |
| website | Webのサイト名を格納 | website |
余談ですが上記の表は(ry
発話理解APIの実行例
docomo Developer support ではAPIを実行するコンソールが提供されています。
ユーザ登録をすると利用できます。
実行例を示します。
「品川で焼肉を食べたい」の結果
「品川で焼肉を食べたい」で実行した結果の一部が以下になります。

この場合、コマンド名として「グルメ検索」、ジャンルとして「焼肉」、対象エリアとして「品川」が抽出できました。
ちなみに「現在地周辺の焼肉屋は?」としたときはhereArroundに「現在地」が格納されました。
LUISへの応用
グルメ検索をLUISで同じようなことを実現しようとした場合、あらかじめ「groumetGenre」、「searchArea」、「hereArround」をパラメータとした、「searchGroumet」というIntentを作成することとなります。
Entityの作成
ここでEntityを作成する際は一工夫必要です。
「groumetGenre」はおそらくグルメのジャンルで他と被ることもなさそうです。なので、「groumetGenre」というEntityを作成してよいでしょう。

「searchArea」は検索目的でなくてもエリアという概念はあるので、「Area」というEntityを作成したうえで「searchArea」というchildrenを作るとよいでしょう。
こうすることで検索目的ではないAreaのchildren作成時にも学習効果が期待できます。

「hereArround」は現在地周辺ということなので、hereだとかhereArroundのままでよいと思います。

Intentの作成
先ほど作成したEntityを元に「searchGroumet」というIntentを作成します。

学習
作成したIntentを学習させます。

学習を繰り返して、このIntentの精度を高めます。
まとめ
いかがでしたでしょうか。
今回はAdventCalendarの空きが出ないために急いで作ったためグルメ検索のみの紹介でした。
docomoの発話理解APIには、よくあるポータル検索ではなくスマートフォンの機能を使用するためのコマンドをそろえているのが特徴的です。
もし、LUISを使ってスマートフォンのコンシェルジュ的なアプリを作成するときは、この発話理解APIのスマートフォン向けコマンドが参考になるかもしれません。
docomoの発話理解APIは無料で使えますが、自分が好きなように学習させる機能はありません。
発話理解のノウハウをdocomoから学んで自分好みの学習をLUISで実現してみてはいかがでしょうか。
ちなみにdocomo Developer SupportではAPIを活用したサービスを考案された方には事業化支援金の提供も含めた支援プログラムがあります。
docomoのAPIとMicrosoft Bot Frameworkを組み合わせたサービスでも支援してもらえるかもしれませんね。
以上です。