12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Azure AI] ②自然言語処理の機能を提供するAzureのサービス Language Understanding (LUIS) を改めて理解する - 実践編 -

Posted at

こんにちは、もっちゃんと申します。

前回の記事ではLUISの解説・説明的な内容を扱いました。
そして今回は実際に手を動かしてLUISを使って理解していこうと思います!

さっそく使ってみる

事前準備

Microsoft AzureのサブスクリプションCognitive Servicesのリソースを事前に作成して用意しておきましょう!

新しいアプリの開始

まずは、LUIS 専用のポータル画面にアクセスしてサインインを行い、LUISの画面に入ったら使用するサブスクリプションを選択します。

image.png

Create a new authoring resourceをクリックして

image.png

下記の項目を埋め、Doneボタンを押します。

  • Azure subscription: 事前準備で用意しておいたサブスクリプション
  • Azure resource group: Azureのリソースグループ名
  • Azure resource name: 任意のリソース名
  • Location: ロケーション(現時点ではLocationは日本のゾーンを選択できない)

image.png

するとCreate new app画面が表示れるので、これまた必要な項目を埋めてDoneボタンを押します。

  • Name: 任意の名前
  • Culture: Japaneseを選択
  • Description: 任意の説明
  • Prediction resource: 事前準備で用意しておいたCognitive Servicesのリソース

image.png

しばらくすると下記の案内ダイアログとともに、LUISの新しいアプリ作成が完了します。(ダイアログは右上のバツボタンで消しましょう)

image.png

Entity(エンティティ)作成

次にエンティティを新規作成していきます。
下記のように必要な情報を入力し、TypeはMachine learnedを選択するようにしてください。

image.png

そして次の画面でサブエンティティ、SizeQuantityを追加します。

image.png

そして、今作成したSizeサブエンティティに語句一覧(phrase list)を設定して、特徴量を追加していきます。

image.png

ここではいったん小さい大きい普通とかを入れておきます。

image.png

まだまだエンティティを作成していきます。次はリストエンティティです。(SizeListentityの名前で作成します)

image.png

リストエンティティは下記のように、シノニム(Synonyms)も含めて設定してください。(シノニムはできるだけ多く設定した方が良いですね!)

image.png

そしてサブエンティティSizeに@SizeListentityを追加します。

image.png

そしてもう1つ、事前構築済みの number エンティティを追加します。

image.png

こちらもサブエンティティSizeに@numberを追加。

image.png

ついでに必須の特徴量も設定します。

image.png

Intent作成

続いてIntentの作成をしていきます。まずは Greeting(挨拶)のIntentを作成してみます。

image.png

中身は下記のような感じで、あいさつ系の文章をいくつか入れておきます。

image.png

次にOrderPizza Intentを作成していきます。

image.png

下記のようにサンプル発話を追加した後、OrderSizeQuantityのエンティティをラベル付けします。その後右上のTrainボタンも押しておきます。

luis_1.gif

さらに発話を追加して ラベルをつけてトレーニングを実施していくと

luis_2.gif

すると自動のラベル付けの精度が次第に向上していくのが分かると思います。(ラベル付けが間違ってなければ右にあるチェックマークを押して確定させましょう)

image.png

こんな感じでIntetに発話サンプルをどんどん追加していきましょう!

モデルのビルドとテストの実行

ここでいったん画面右上のTrainボタンを押してトレーニングを実行しておきます。

image.png

そして下記のようにテストパネルを開いて試しの注文文章を入れてテスト実行してみましょう。ちゃんと思ったIntentやEntityの抽出ができましたでしょうか?(ここで思った精度が出ない場合は、Intentのサンプル発話を追加するなどデータをもう少し追加してトレーニングを実行するサイクルを繰り返してみてください)

azure_luis_line_7.gif

作成したLUISアプリを公開(Publish)する

テスト実行で良い感じに動いてましたら、このLUISアプリの公開(Publish)を行いたいと思います。公開するとエンドポイントのURLが発行されるので、チャットボットなどのアプリケーションに組み込むことが可能です。

azure_luis_line_8.gif

エンドポイントを実行してLUISの予測結果を確認する

アプリケーションに組み込む前に先ほど発行したエンドポイントURLをcurlで叩いてみましょう。ここではいったんsサイズのピザを3つくださいという文章を送ってみます。

image.png

https://cog-luis.cognitiveservices.azure.com/luis/prediction/v3.0/apps/7fbff360-2283-40fb-a04a-7cea206908fe/slots/production/predict?subscription-key=af1cfef00b6b4ddc9968153363512cea&verbose=true&show-all-intents=true&log=true&query=sサイズのピザを3つください

実行結果は下記のjsonが返ってきました。予測としてはOrderPizzaのIntentがスコア0.9693499と高い数値を示しています。また、SizeQuantityの値の抽出もしっかりできてそうですね。


{
    "query": "sサイズのピザを3つください",
    "prediction": {
        "topIntent": "OrderPizza",
        "intents": {
            "OrderPizza": {
                "score": 0.9693499
            },
            "Greeting": {
                "score": 0.012079056
            },
            "None": {
                "score": 0.008686903
            }
        },
        "entities": {
            "Order": [
                {
                    "Size": [
                        [
                            "小さい"
                        ]
                    ],
                    "Quantity": [
                        "3"
                    ],
                    "$instance": {
                        "Size": [
                            {
                                "type": "SizeListentity",
                                "text": "sサイズ",
                                "startIndex": 0,
                                "length": 4,
                                "score": 0.97143835,
                                "modelTypeId": 1,
                                "modelType": "Entity Extractor",
                                "recognitionSources": [
                                    "model"
                                ]
                            }
                        ],
                        "Quantity": [
                            {
                                "type": "Quantity",
                                "text": "3",
                                "startIndex": 8,
                                "length": 1,
                                "score": 0.9942513,
                                "modelTypeId": 1,
                                "modelType": "Entity Extractor",
                                "recognitionSources": [
                                    "model"
                                ]
                            }
                        ]
                    }
                }
            ],
            "$instance": {
                "Order": [
                    {
                        "type": "Order",
                        "text": "sサイズのピザを3つください",
                        "startIndex": 0,
                        "length": 14,
                        "score": 0.9689606,
                        "modelTypeId": 1,
                        "modelType": "Entity Extractor",
                        "recognitionSources": [
                            "model"
                        ]
                    }
                ]
            }
        }
    }
}

LINE Botに組み込んでみる

ターミナルでエンドポイントのURLを叩くだけだと面白く無いので、アプリっぽいものに組み込んでみましょう。LINEのBotなら簡単に実現できるので活用していきます。

基本的にはこちらの記事通りに進めていただいて、下記の2ファイルとApplication Settingの値を今回用に変更・追加してください。

  • requirements.txt
azure-functions
line-bot-sdk
azure-cognitiveservices-language-luis
  • ___init ___.py
import logging
import os
import azure.functions as func

## https://docs.microsoft.com/ja-jp/azure/cognitive-services/luis/client-libraries-rest-api?tabs=windows&pivots=programming-language-python
from azure.cognitiveservices.language.luis.authoring import LUISAuthoringClient
from azure.cognitiveservices.language.luis.authoring.models import ApplicationCreateObject
from azure.cognitiveservices.language.luis.runtime import LUISRuntimeClient
from msrest.authentication import CognitiveServicesCredentials
from functools import reduce

import json, time, uuid

appId = os.getenv('APP_ID', None)
predictionKey = os.getenv('PREDICTION_KEY', None)
predictionEndpoint = os.getenv('PREDICTION_ENDPOINT', None)

runtimeCredentials = CognitiveServicesCredentials(predictionKey)
clientRuntime = LUISRuntimeClient(endpoint=predictionEndpoint, credentials=runtimeCredentials)

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

# get channel_secret and channel_access_token from your environment variable
channel_secret = os.getenv('LINE_CHANNEL_SECRET', None)
channel_access_token = os.getenv('LINE_CHANNEL_ACCESS_TOKEN', None)

line_bot_api = LineBotApi(channel_access_token)
handler = WebhookHandler(channel_secret)

def main(req: func.HttpRequest) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

    # get x-line-signature header value
    signature = req.headers['x-line-signature']

    # get request body as text
    body = req.get_body().decode("utf-8")
    logging.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        func.HttpResponse(status_code=400)

    return func.HttpResponse('OK')


@handler.add(MessageEvent, message=TextMessage)
def message_text(event):
    predictionRequest = { "query" : event.message.text }
    predictionResponse = clientRuntime.prediction.get_slot_prediction(appId, "production", predictionRequest)
    logging.info("Top intent: {}".format(predictionResponse.prediction.top_intent))
    logging.info("Sentiment: {}".format (predictionResponse.prediction.sentiment))
    logging.info("Intents: ")
    for intent in predictionResponse.prediction.intents:
        logging.info("\t{}".format (json.dumps (intent)))
        logging.info("\t{}".format (type(intent)))
    logging.info("Entities: {}".format (predictionResponse.prediction.entities))
    line_bot_api.reply_message(
        event.reply_token,
        [TextSendMessage(text=f'Intent: {predictionResponse.prediction.top_intent}'),
         TextSendMessage(text=f'Entity: {predictionResponse.prediction.entities}')]
    )

  • Application Setting

APP_IDPREDICTION_KEYPREDICTION_ENDPOINTの値をApplication Settingに設定します。

image.png

image.png

azure_luis_line_10.gif

azure_luis_line_11.gif

まとめ

簡単ではありましたが、LUISをアプリケーションに組み込むところまでやってみました。機械学習を使うと聞くとハードルが高そうですが、近頃は機械学習の民主化が非常に進んでいるのでこういったLUISのようにある程度誰でも機械学習を活用することができる世の中になっていますね!自身のアプリケーションをワンランク上のクオリティにできるのではないでしょうか。
(個人的には機械学習は特定の人たちが使うものというより通常のソフトフェア開発の延長線上にあり、一歩進んだ姿と思っています。何らかの形で全ての開発者が、プログラム言語を使うのと同様に機械学習を活用するのがあたりまえの世界が来るのも近いと感じています)

また、今回はLUISを主に使いましたが、Bot FrameworkQnA Makerといった相性の良いサービスと組み合わせるとさらに強力になりそうです。

参考

12
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?