8
4

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.

Bot Framework Composer を使って感情分析Botを作る

Last updated at Posted at 2020-12-17

この記事は「NEXTSCAPE Advent Calendar 2020」の18日目の記事です。

Bot Framework Composer を使って感情分析Botを作ってみよう!

なぜこの Bot を作ってみようと思ったかというと、
Azure上に構築する、データ分析基盤のための分析対象のデータサンプルを作り出すために、何かいい方法がないかと考えていたところ、Chat Bot との会話履歴を分析できたら楽しそうかな?と思ったからです。
(※ 感情分析 (センチメント分析) とは、ユーザーが入力した言葉や文が、positive / neutral / negative のうち、どの感情に近いものなのか、予測スコアをつける分析のこと。)

そのため、この記事では、サクッと簡単に 感情分析Bot を作って分析用に会話履歴のデータを出力できることを目指しています。

この Bot は、Application Insight や Data Lake Storage にメトリックや会話の履歴をバンバン流します。

メトリックや会話履歴は、Azure Synapse Analytics と Power BI を使えば簡単に収集、分析、可視化できてしまいます。
そのあたりについては、後日機会があれば記事にしようと思います。

この記事はどんな人が対象?

  • 時間をかけずに簡単にBotを試してみたい!
  • Botを作るのにコーディングとかしたくない
  • Botで感情分析してみたい!
  • Botで**自然言語解析(LUIS)**を使ってみたい!
  • Bot Framework Composer とお友達になりたい!
  • Botって作ったらAzure上に公開できるの?教えて!
  • データ分析基盤の分析ネタ集めにに困っている。

(注目してほしいところをなんとなく太字にしてみた。)
Bot Framework Composer が何なのかというところは何となく見えてきたかもしれませんが、これから一緒に触ってどんなものかを確かめていきましょう!

どんなBotが出来上がるの?

こんなBotです。
image.png
image.png

事前準備

では、早速作り始めていきたいところですが、何事にも準備は大切です。
以下の環境がそろっていない方は、まずは環境をそろえていきましょう!

  • Azure 環境
    今なら12か月22,500円分を無料で試せるので、アカウントがない人は作って試してみよう!
    Azure で検索したらすぐ出てきますよ。

  • Bot Framework Composer
    こちらは自分のPCにインストールが必要です。
    以下 Microsoft Docs にある手順に従い、Bot Framework Composer をインストールします。
    Install Bot Framework Composer (英語のページだけど翻訳すれば大丈夫)
    ※ 前提条件にある、Bot Framework Emulator と .NET Core SDK 3.1 以上 も忘れずにインストールしましょう。

これだけそろえばOK!
次に進みましょう!

Bot Framework Composer の初期設定

初期設定といっても、表示言語を日本語に変更するのみです。
必要なければスキップしても構いません。
現状では、日本語設定の場合でもほとんどが英語表記のままなのであまり必要性は感じられないかもしれません。。が、念のため説明しておきます。
日本語化もできるんですよ。と。

Bot Framework Composer を起動すると、こんな画面が出てくるので、
左下の 歯車マーク をクリックします。
image.png

Application Language settings で 日本語 を選択します。
image.png

これで日本語化完了。
うまく日本語化されていないときは Bot Framework Composer を再起動するとイイ感じになるかもしれません。

Bot の作成

Azure リソースを作る前にまずは Bot を作る必要があります。
なぜかというと、そのほうが手間が省けるからです。

ここの 新規 ボタンを押して Bot を作っていきましょう。
image.png

最初から作成 を選択し 次へ
(テンプレートから作成するとテンプレートの説明をしないといけないので、ここではスピードを重視してまっさらな状態から作っていきたい。)
image.png

こんな感じに一通り入力して OK
image.png

日本語で受け答えする Bot にしたいので、Bot の言語設定を変えていきます。
左のメニューからスパナのアイコンをクリック
image.png

ボット言語の項目から Manage bot languages をクリック
image.png

Japanese (Japan) を選択して OK
image.png

Japanese (Japan) を default language に設定
English (United States) は削除しても構いません。
image.png

Bot の作成はこれでいったんOK (中身は後で作っていくよ)
次は Azure リソースを作っていきます。

Azure リソースの作成

Bot の公開に必要な Azure リソース の作成していきます。
今回の Bot に使用するリソースはいくつかあるのですが、Bot Framework Composer の機能を使ってまとめて作ってしまいます。
そして、足りないリソースは手動で作ります。

スパナのアイコンをクリックしてBotの設定画面を開き、
Publish targets の項目から Add new publish profile を選択します。
image.png

Create profile name には適当に名前を付けます。
Select your publish target は、今回は Azure Web App にします。で、次へ
image.png

ここで、Azure に接続しに行くため、サインインが求められます。サインインしてください。
image.png

Create new Azure resources を選択し、必要事項を入力して Next
<補足説明>
Subscription: リソースが作られるサブスクリプションを指定
HostName: ここに指定した名前でリソースグループが作られる
Locations: リソースグループとLuis以外の各種リソースのリージョン
Location for Luis: LUISのリージョン(対応地域が少ないのでLocationsとは別で指定が必要)
image.png

初期値で Optional にすべてチェックが入っているので、4つのみにチェックをつけて Done
必要なのは、
Application Insight: Botが送信するメトリックをためるところ
Azure Blob Storage: Botの会話履歴をためるところ
Microsoft Language Understanding Authoring Account: Botが自然言語解析をお願いするところ (LUIS)
Microsoft Language Understanding Prediction Account: 上記のLUISとだいたい同じ
の4つ
image.png

Done すると右上に進捗が表示されます。
裏で Azure にリソースを作っていて、それに数分の時間がかかるので完了するまで待ちます。
image.png

「Provision success」が出れば成功
Azure Portal から、数個前の画面で設定した HostName の名前のリソースグループを開くと、リソースができていることが確認できます。
image.png

ここで足りないのが感情分析に必要なリソースです。
感情分析には Text Analytics API を使用するため、このタイミングで同リソースグループ内にText Analytics リソースを作成しておきます。
image.png
image.png
image.png
image.png

Text Analytics までできればリソース作成は完了!

Bot の会話履歴出力先のBlobを設定

ついでにここで、Blobの設定もしてしまいましょう。

Azure Portal から、Storage Account リソースのページを開き、メニューから アクセス キー の項目を選択します。
キーを表示させ、接続文字列 の値をコピーして保持しておきます。
image.png

Bot Framework Composer に戻り、先ほど作成した profile の編集をクリックする。
image.png

公開の構成 の中ほどに blobStorage の要素があるので、その中の "connectionString" の値を、先ほどコピーした 接続文字列 で上書きする。
image.png

これでBlobの設定は完了!

Botの作りこみ

さて、やっとここからが本題!
名前を聞いてきて、気分を聞いてきて、内容に合わせて返事を返す Bot を作っていきます。

トリガーの追加
image.png

このように設定すると、「こんにちは」と「はじめまして」というユーザーのテキスト入力で起動するインテントができる。
image.png

今後はこのインテントにダイアログを追加していく。
・名前を聞く (getName)
・気分を聞いて感情分析 (getSentiment)
・内容に合わせて返事を返す (sendReply)
の3つのダイアログを作成し、追加していく。

名前を聞くダイアログの作成 (LUISによる自然言語解析)

まずはダイアログを追加します。
クリックするところの階層が先ほどのトリガー追加とは異なる点に注意
image.png
image.png

getName ダイアログができたら、BiginDialog を選択し、

  • ボタンから、質問する -> テキスト をクリック
image.png

上のボックスを選択して、右のテキストエリアにBotからのメッセージを設定
image.png

2つ目のボックスを選択して、以下のように設定します。
<補足説明>
Property: ここで指定した名前で Bot 内に値を保持する。
(新しい名前を設定するとそのブロックが実行されたときに新しくその名前で値の保持領域作られる。)
Output format: 値を保持する前に値の加工ができる。今回は使わない。
Value: どこの値を Property に入れるか指定できる。今回は LUIS の結果から得られるエンティティを指定する。
(ここで指定した数式、ユーザー入力のどちらか値が存在するほうが Property に入る。また、ここを空にするとユーザーに入力値がそのまま Property に入る。)
予想される応答: ここで LUIS の学習ができる。
以下の設定では、「私の名前はおおたです」と入力された時に、
"おおた" の部分を userName というエンティティとして認識する。という学習情報になる。
様々なパターンを学習させるとそれに応じて、どこをエンティティとするのかを LUIS が判断してくれるようになる。
「@ ml userName」は機械学習エンティティ を userName として定義しますという意味。
詳しくは LUIS の世界になるので割愛。学習情報に userName という名前が使えるようになって、LUISがエンティティとして判断した結果が userName に入り、Value で userName が参照できるようになる。と、覚えておけばよい。
ちなみに ">" はコメント行になる。

> 予想されるいくつかのユーザー応答を追加します:
- 私の名前は {userName=おおた} です
- 私は {usetName=おおた} です
- {userName=おおた} です
- {userName=おおた}
- 私の名前は {userName=太田} です
- 私は {usetName=太田} です
- {userName=太田} です
- {userName=太田}

> エンティティ定義:
@ ml userName

image.png

最後に、ユーザーの名前を使った応答を返します
image.png

user.name は先ほど LUIS が名前と判断した部分が入っています
image.png

これで名前を聞くダイアログは完成!

気分を聞くダイアログの作成 (Text Analytics API による感情分析)

ここでは Text Analytics API を呼び出してユーザー入力の感情分析をします。

Text Analytics API の呼び出し方について、詳しくは以下の Microsoft Docs のページを参照
クイックスタート: Text Analytics クライアント ライブラリおよび REST API を使用する

ダイアログを作る
image.png

ここでも 質問する -> テキスト
image.png
image.png

ここは Property のみ設定
image.png

ユーザー入力を Text Analytics API に渡すために「HTTP要求の送信」を作ります。
image.png

HTTP要求の送信を設定していく前に、Text Analytics への接続情報を確認します。
Azure Portal から、事前に作っておいた Text Analytics のページを開きます。
キーとエンドポイント のページから、キー1エンドポイント の値をコピーして控えておきます。
image.png

上で紹介した [Microsoft Docs] (https://docs.microsoft.com/ja-jp/azure/cognitive-services/text-analytics/quickstarts/client-libraries-rest-api?tabs=version-3&pivots=rest-api) の内容にそって設定していきます。

HTTP method: POST

Url

https://demo-sentiment-analysis-bot-ta.cognitiveservices.azure.com/text/analytics/v3.0/sentiment/
(Text Analytics のエンドポイント + text/analytics/v3.0/sentiment/)

Body
右端のプルダウンは object に設定する

{
  "documents": [
    {
      "id": "1",
      "language": "ja",
      "text": "${user.sentimentText}"
    }
  ]
}

Headers
キー: Ocp-Apim-Subscription-Key
値: Text Analyticsの キー1

Result property: dialog.api_response
Content type: application/json
Response type: json

image.png image.png

プロパティの設定 で Text Analytics の感情分析結果を保持する
image.png

Property: user.sentimentScore
ここで指定した名前で保持される
Value: =dialog.api_response.content.documents[0]
Text Analytics の結果構造から、必要なところのみ保持させるための設定
image.png

これで気分を聞いて感情分析するダイアログは完成!

内容に合わせて返事を返すダイアログ

これが最後のダイアログ!

ダイアログを作る
image.png

分岐: スイッチ (複数のオプション) を選択
image.png

こんな感じで設定する
Condition: user.sentimentScore.sentiment
感情分析結果が入っている場所を指定
Cases
Value: positive
Value: neutral
Value: negative
感情分析の結果パターンで振り分け
Value は「新しい value を追加します」と書かれたテキストボックスに値を入力して、Enter キーを押すと設定できる。(ここだけ謎に Enter キーを押すまで設定できません。。)
image.png

4つのルートすべてに「応答の送信」を作る
image.png

こんな感じでそれぞれの感情分析結果にあった応答を設定する
言語生成に複数行の - (ハイフン) で始まる行がある場合、その中からランダムで選ばれたものが応答として返される。
image.png

これで内容に合わせて返事を返すダイアログは完成!

ダイアログをつなげる

初めに作った startIntent に戻り、「新しいダイアログの開始」を作る
image.png

Dialog name に作ったダイアログを設定する
image.png

同じようにして、getSentiment , sendReply のダイアログ開始も作る
image.png

これで Bot は完成!
さぁ、デバッグしてみよう!

デバッグ

ローカル環境で Bot のデバッグを実行するためには、
まず、ローカル環境の Bot から LUIS 接続のための情報を設定する必要があります。

Azure Portal から、LUIS のページを開く。
キーとエンドポイント のページから キー1場所 の値をコピーして控えておきます。
image.png

Bot Framework Composer に戻り、メニューのスパナのアイコンから設定ページを開き、先ほど控えた値を設定します。
LUIS authoring key: キー1
LUIS region: 場所
image.png

デバッグの準備が整ったので、 Start bot をクリック
image.png

ここで Emulator を起動
image.png

こんな感じで動きましたか?!
右下のエリア から、ログのリンクをぽちぽち押すと 右上のエリア にその時の状態がJSONで表示されます。
その時々の細かい状態を確認したいときは、右下のエリアからログを確認し、リンクをクリックしてみましょう。
image.png

ちなみに、最初にBot君がしゃべっていた「Welcome to the EmptyBot sample」は以下で設定されています。
ここも日本語に直しておくとわかりやすいですね。
image.png

次は作った Bot を Azure に発行してみます。

Bot を Azure 発行

Azure への発行は、最初にリソースを作ったときに作成した Profile を使います。
作ったリソースにそのままデプロイするというイメージです。

メニューから雲のアイコンをクリックし、Azure上に公開したいBotにチェックを入れます。
次に、Publish target のドロップダウンで、リソース作成の時に作成した Profile を選択します。
image.png

最後に左上の Publish selected bots をクリックします。
image.png

Comments を適当に入力して OK
image.png

右上に「You have successfully published」が表示されたらAzure上へのBotの公開は完了
image.png

試してみる

Azure Portal で、ボット チャンネル登録 のリソースを開き、メニューから「Web チャットでテスト」を選ぶと、Bot を試すことができます。
image.png

Blob にも会話履歴が入っている
image.png

Application Insight もなんとなくつながっているように見える
image.png

まとめ

この記事の内容は、サクッと簡単に とか 時間をかけずに とか言った割には結構大変な内容だったのかと思います。
(こんなに長くなるとは思ってなくてところどころ文章が雑で申し訳ないです。。)
しかし、今回やったような LUIS を使った自然言語解析や Text Analytics を使った感情分析などは、コーディングを伴うBot作成では少し難易度が高く、見よう見まねでやってもなかなかうまくいかないことが多いです。
それと比べればコーディングをせずにここまで動くモノができるということは凄いことだと思います。
この記事を読んで、一緒に実践し、一通り触ってみて、Bot作成の流れをつかんでいただけたら幸いです。
流れさえ理解してしまえば今後、Botに触れる機会が訪れたときにきっと役に立つはずです。

最後まで読んでいただきありがとうございました!

8
4
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
8
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?