未経験者でも言語解析を簡単に始められちゃう。そう、Cognitive Serviceならね。

お久しぶりです。堀内です。

前回の記事からずいぶん期間が空いてしまいましたが、気にせずいきましょう。

今回はMirosoft AzureのサービスであるCognitive Servicesに触れていきます。早速始めていきたいと思います。

f:id:ecb_mhoriuchi:20200219180622p:plain

Cognitive Serviceのサービスを開始しよう

Cognitive Servicesと言っても色々な種類のサービスが存在します。

https://azure.microsoft.com/ja-jp/services/cognitive-services/

今回は言語メニューの「Language Understanding」を使用したいと思います。

https://azure.microsoft.com/ja-jp/services/cognitive-services/language-understanding-intelligent-service/

「Language Understandingを無料で試す」からサービスメニューに進みます。

f:id:ecb_mhoriuchi:20200218133344p:plain


次に進むとログインを求められますので、Microsoftアカウントを使用してログインしてください。

※アカウントが無い場合は、Microsoftアカウントを新規作成してそのまま進んでください。


初めてのアクセスの場合は、まずセットアップが始まります。内容を入力したらContinueをクリックして登録を完了させます。

※LUISのメニュー画面ですが、2020年2月時点ではまだ日本語化されてないようです。

  1. terms of use
    リージョンは日本を選択します。

  2. Link your Azure account
    サブスクリプションキーの選択となりますが、お試しであればトライアルキーを選択すればOKです。

f:id:ecb_mhoriuchi:20200219182414p:plain


登録が完了したら続けて画面内の「Create a LUIS app now」に進みます。

※ヘッダーの「My apps」に遷移します。

f:id:ecb_mhoriuchi:20200219181331p:plain

Cognitive Serviceにアプリケーションを作成しよう

「Create new app」を選択してアプリケーションの作成に進みます。

アプリケーション名は任意で、カルチャーは日本語を選択します。

登録が完了するとアプリケーションのメニュー画面に移動すると同時に、説明のモーダルが表示されます。内容を確認後モーダルを閉じます。

f:id:ecb_mhoriuchi:20200219182530p:plain

アプリケーションに言語解析ルールを設定しよう

次にいよいよ言語解析のネタとなる「意図(intents)」を、設定していきます。

画面右上に「DASHBOARD」「BUILD」「MANAGE」の3つが存在します。このうちの「BUILD」を選択してください。

App Assetsメニューに「intents」「Entities ※後述」が存在します。

IntentsにはNoneが既に登録されていますが、これはこれから登録する各意図のいずれにも該当しない場合を示すものとなります。

f:id:ecb_mhoriuchi:20200219184506p:plain


「Create new intent」を選択するとモーダルが開くので意図の名前を入力します。日本語が利用可能です。

登録が完了すると、続けて質問例の一覧を登録する画面に進みますので、ユーザーがチャットに質問する内容を想定した例文を登録していきます。

これを繰り返して、意図の登録を行います。動きを分かりやすくするために各意図に登録する例文はなるべく内容が被らないようにしてみてください。

f:id:ecb_mhoriuchi:20200218144045p:plain


質問の内容によっては伝票番号など特定のコード形式の内容を抽出してユーザーに応じた返答をしたい時があるかと思います。

そういった時には、「Entities」を設定することで文章内の特定の文字列を別途抽出してくれます。

Entityには独自に定義するタイプの他に、定義済みのタイプ(prebuilt)も存在しています。

f:id:ecb_mhoriuchi:20200218144443p:plain


例えば正規表現で伝票番号を抽出したい場合は以下のように設定します。

f:id:ecb_mhoriuchi:20200219182821p:plain


Entityを登録することで、先ほど意図に登録した例文に合致するものがあれば表示が対象のEntityに置き換わります。

解析内容が正しいかの参考にしてください。

f:id:ecb_mhoriuchi:20200218150035p:plain

設定した内容をテストしよう

設定が全て完了したら、現在の内容でトレーニングを行います。

難解な知識や複雑な操作は一切不要で、Trainボタンをクリックするだけです。

しばらく待つとトレーニングが完了して、Trainボタンのランプが緑に変わります。(アプリケーション作成時点では赤色です)

Testボタンをクリックできるようになりましたので、クリックしてください。するとテスト用のフォームが表示されます。

下の画像では「製品スペックを教えて」と質問しています。LUISが解釈した結果、0.947の確度で製品に関する質問と判断しました。

また、注文キャンセルに関する質問では、entityの定義により伝票番号の抽出が行われています。

f:id:ecb_mhoriuchi:20200219165847p:plain

APIエンドポイントを公開しよう

ここまで出来たら外部からAPIコールできるように公開を行います。

Testの右にあるPublishボタンをクリックしてモーダルを開いたら、「Production」を選択して公開を行います。設定はそのままでOKです。

公開が完了したら緑のバーが表示されるので、バー内の「Refer to the list of endpoints」をクリックするか、MANAGEメニュー内の「Application Settings」>「Azure Resources」に移動します。

「Example Query」の内容をクリップボードにコピーして、末尾のq=に質問文を繋げたURLにブラウザなどでアクセスしてみてください。

f:id:ecb_mhoriuchi:20200219183054p:plain


設定、公開が正しくできていればTestで実施した時と同じ以下のようなJsonが返却されます。

{
  "query": "12345-67890の注文をキャンセルしたいです",
  "topScoringIntent": {
    "intent": "注文に関する質問",
    "score": 0.590277
  },
  "intents": [
    {
      "intent": "注文に関する質問",
      "score": 0.590277
    },
    {
      "intent": "製品に関する質問",
      "score": 0.0875012353
    },
    {
      "intent": "None",
      "score": 0.0382595174
    }
  ],
  "entities": [
    {
      "entity": "12345-67890",
      "type": "伝票番号",
      "startIndex": 0,
      "endIndex": 10
    }
  ]
}

後はこのAPIをご自身のサービスからコールするなり、Bot Service等と関連付けて展開するなりするだけで サービスに言語解析を組み込むことができるようになります。

まとめ

いかがでしたでしょうか。

難しそうというイメージが先行しがちな分野ですが、自然言語解析などの高度な知識が無くても直感的にルール付けを整備するだけである程度の自然言語の解析が簡単に行えました。

もちろん精度を上げたり、より詳細な判定となると時間はかかると思います。

それはそれとして、気軽に始められるということを今回知っていただけたのであれば今回の記事は成功かなぁと思います。


~ecbeingでは、新しい技術に気軽にチャレンジできる新しもの好きなエンジニアを大募集中です!~ careers.ecbeing.tech