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

この記事は「[NEXTSCAPE Advent Calendar 2020](https://qiita.com/advent-calendar/2020/nextscape)」の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です。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/c3badce9-94eb-e2a9-5c44-10b490d864f8.png">
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/72bc18bd-0ccc-2caa-98db-1a95191a100f.png">

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

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

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

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

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

Bot Framework Composer を起動すると、こんな画面が出てくるので、
左下の 歯車マーク をクリックします。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/e44ab8d1-18c3-f741-fc17-e80b0526ed4a.png">

Application Language settings で 日本語 を選択します。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/b29d20e9-161d-1a49-9264-c5433f226ce1.png">

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

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

ここの 新規 ボタンを押して Bot を作っていきましょう。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/44d2d51d-da2d-42cb-2e97-f067e0f18be6.png">

最初から作成 を選択し 次へ
(テンプレートから作成するとテンプレートの説明をしないといけないので、ここではスピードを重視してまっさらな状態から作っていきたい。)
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/658696f4-d330-4fec-adff-b739f7c84dd6.png">

こんな感じに一通り入力して OK
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/78268f96-9ace-cd5a-f925-097b65446cf4.png">

日本語で受け答えする Bot にしたいので、Bot の言語設定を変えていきます。
左のメニューからスパナのアイコンをクリック
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/ca90e073-48d3-6c0d-a25e-c4d180ac9887.png">

ボット言語の項目から Manage bot languages をクリック
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/10795472-d693-7104-dc85-fc3e1fc6448c.png">

Japanese (Japan) を選択して OK
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/d27e25da-a58a-f78d-687f-02d282bf0308.png">

Japanese (Japan) を default language に設定
English (United States) は削除しても構いません。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/5f6a93b0-b6cc-32c1-39a5-2930d18d1ae6.png">

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

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

スパナのアイコンをクリックしてBotの設定画面を開き、
Publish targets の項目から Add new publish profile を選択します。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/f8a54656-5643-f864-776a-8a540b1a213d.png">

Create profile name には適当に名前を付けます。
Select your publish target は、今回は Azure Web App にします。で、次へ
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/a11c394f-a9b3-3640-9568-9b5f26ce4b64.png">

ここで、Azure に接続しに行くため、サインインが求められます。サインインしてください。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/fd0cb612-a63a-326b-3600-63701f6509e6.png">


Create new Azure resources を選択し、必要事項を入力して Next
<補足説明>
**Subscription**: リソースが作られるサブスクリプションを指定
**HostName**: ここに指定した名前でリソースグループが作られる
**Locations**: リソースグループとLuis以外の各種リソースのリージョン
**Location for Luis**: LUISのリージョン(対応地域が少ないのでLocationsとは別で指定が必要)
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/2b5f359c-2e8c-e47b-2633-d1b38dd7e43d.png">

初期値で Optional にすべてチェックが入っているので、４つのみにチェックをつけて Done
必要なのは、
**Application Insight**: Botが送信するメトリックをためるところ
**Azure Blob Storage**: Botの会話履歴をためるところ
**Microsoft Language Understanding Authoring Account**: Botが自然言語解析をお願いするところ (LUIS)
**Microsoft Language Understanding Prediction Account**: 上記のLUISとだいたい同じ
の４つ
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/f250669c-25c1-ddf5-cb70-94f77eb05980.png">

Done すると右上に進捗が表示されます。
裏で Azure にリソースを作っていて、それに数分の時間がかかるので完了するまで待ちます。
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/2ba55ae0-e4f5-3772-600d-9fed025ab0fd.png">

「Provision success」が出れば成功
[Azure Portal](https://portal.azure.com/) から、数個前の画面で設定した HostName の名前のリソースグループを開くと、リソースができていることが確認できます。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/4e318f25-14d2-4700-5885-ac945b32d889.png">

ここで足りないのが感情分析に必要なリソースです。
感情分析には Text Analytics API を使用するため、このタイミングで同リソースグループ内にText Analytics リソースを作成しておきます。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/ecbb4501-221c-5600-52c0-1b1905ab6187.png">
<img width="450" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/7e2b9092-7bb5-232b-d2e1-3f038afbe1c1.png">
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/56585a14-ec02-9692-7337-bbb63041fe21.png">
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/fdbab046-c27a-8e2c-06d7-d6b52b579507.png">

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

## Bot の会話履歴出力先のBlobを設定
ついでにここで、Blobの設定もしてしまいましょう。

[Azure Portal](https://portal.azure.com/) から、Storage Account リソースのページを開き、メニューから アクセス キー の項目を選択します。
キーを表示させ、**接続文字列** の値をコピーして保持しておきます。
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/5c3c2e90-3f9c-1b60-07df-4350711c7e4e.png">

Bot Framework Composer に戻り、先ほど作成した profile の編集をクリックする。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/484626be-24a4-1e63-dd1d-388d6991ff5d.png">

**公開の構成** の中ほどに blobStorage の要素があるので、その中の "connectionString" の値を、先ほどコピーした **接続文字列** で上書きする。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/e4caac61-e36c-26d2-235b-da4b6b5406ca.png">

これでBlobの設定は完了！

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

トリガーの追加
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/fdc0c2d6-6909-6170-1979-507bf07d1320.png">

このように設定すると、「こんにちは」と「はじめまして」というユーザーのテキスト入力で起動するインテントができる。
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/4feea98f-9a8a-343f-a2f9-8fb1a7607c4c.png">

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

## 名前を聞くダイアログの作成 (LUISによる自然言語解析)
まずはダイアログを追加します。
クリックするところの階層が先ほどのトリガー追加とは異なる点に注意
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/565f60e3-0103-33bd-aa14-7837ef7febbc.png">
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/c8969a90-a535-26e7-b3ae-c4a948ea0501.png">

getName ダイアログができたら、BiginDialog を選択し、
+ ボタンから、質問する -> テキスト をクリック
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/ef2b3824-c80f-8399-aa21-8c0e827d22bd.png">

上のボックスを選択して、右のテキストエリアにBotからのメッセージを設定
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/e907d4f8-abad-db2e-4a12-c86ccfe5ff6b.png">

２つ目のボックスを選択して、以下のように設定します。
<補足説明>
**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

```
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/cb320180-f34f-a5e6-6034-84b12442c66b.png">

最後に、ユーザーの名前を使った応答を返します
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/67b8810c-37de-04cf-6829-6347098bc9ef.png">

user.name は先ほど LUIS が名前と判断した部分が入っています
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/c491f9f7-8009-b415-1a3f-7e6e78540f68.png">

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

## 気分を聞くダイアログの作成 (Text Analytics API による感情分析)
ここでは Text Analytics API を呼び出してユーザー入力の感情分析をします。

Text Analytics API の呼び出し方について、詳しくは以下の Microsoft Docs のページを参照
[クイックスタート: Text Analytics クライアント ライブラリおよび REST API を使用する](https://docs.microsoft.com/ja-jp/azure/cognitive-services/text-analytics/quickstarts/client-libraries-rest-api?tabs=version-3&pivots=rest-api)

ダイアログを作る
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/fb0a3758-407b-ee6b-a96a-09d3d8fe40dc.png">

ここでも 質問する -> テキスト
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/1c430e57-d88f-3d64-c353-b373d872b0e1.png">
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/8ca5b192-81da-5f98-44df-878825205480.png">

ここは Property のみ設定
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/a93d7f85-7de2-531a-df41-8d4f32cd7499.png">

ユーザー入力を Text Analytics API に渡すために「HTTP要求の送信」を作ります。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/c80b26fd-b87c-9d76-f6a3-c7c9aefa512e.png">

HTTP要求の送信を設定していく前に、Text Analytics への接続情報を確認します。
[Azure Portal](https://portal.azure.com/) から、事前に作っておいた Text Analytics のページを開きます。
キーとエンドポイント のページから、**キー1** と **エンドポイント** の値をコピーして控えておきます。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/762dc4ea-3cb0-5113-7c0e-dc872195430c.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の キー１

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

<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/9e2c8f67-21f4-017d-5b64-e30c8547ab8f.png">
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/cca60a7c-1683-a795-c35a-9de78f6f4a1e.png">

プロパティの設定 で Text Analytics の感情分析結果を保持する
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/409bee0f-1100-e629-0e86-c4c1486fb31f.png">

**Property**: user.sentimentScore
ここで指定した名前で保持される
**Value**: =dialog.api_response.content.documents[0]
Text Analytics の結果構造から、必要なところのみ保持させるための設定
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/a2d1e7b0-0aad-04b9-eb5f-204b03de3341.png">

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

## 内容に合わせて返事を返すダイアログ
これが最後のダイアログ！

ダイアログを作る
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/cff472b5-1bbd-7bc5-4f8a-72cb5dfc0e5c.png">

分岐: スイッチ (複数のオプション) を選択
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/c1551182-fbca-d8e5-0e0b-13810c7d131d.png">

こんな感じで設定する
**Condition**: user.sentimentScore.sentiment
感情分析結果が入っている場所を指定
**Cases**
**Value**: positive
**Value**: neutral
**Value**: negative
感情分析の結果パターンで振り分け
Value は「新しい value を追加します」と書かれたテキストボックスに値を入力して、Enter キーを押すと設定できる。(ここだけ謎に Enter キーを押すまで設定できません。。)
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/ba6e1a29-ea3a-18bf-67e0-195d695db8e5.png">

４つのルートすべてに「応答の送信」を作る
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/5e317055-dee2-a7f3-626f-5e6f99ede8c0.png">

こんな感じでそれぞれの感情分析結果にあった応答を設定する
**言語生成**に複数行の - (ハイフン) で始まる行がある場合、その中からランダムで選ばれたものが応答として返される。
<img width="900" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/59354ef5-d1cd-73e5-f9f9-bdeabdad735c.png">

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

## ダイアログをつなげる
初めに作った startIntent に戻り、「新しいダイアログの開始」を作る
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/853623e6-47a3-eaa4-9ad1-c56264e791fb.png">

Dialog name に作ったダイアログを設定する
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/a7bfa87d-a12f-0cc1-d966-69eb0039c854.png">

同じようにして、getSentiment , sendReply のダイアログ開始も作る
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/ff365ece-03a6-018a-64cf-106f49d72f1c.png">

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

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

[Azure Portal](https://portal.azure.com/) から、LUIS のページを開く。
キーとエンドポイント のページから **キー１** と **場所** の値をコピーして控えておきます。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/a4a86d15-f6fe-af6c-9c6e-dd4cef22e592.png">

Bot Framework Composer に戻り、メニューのスパナのアイコンから設定ページを開き、先ほど控えた値を設定します。
**LUIS authoring key**: キー１
**LUIS region**: 場所
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/13344a7d-cb8c-b69a-20eb-6e40170d113c.png">

デバッグの準備が整ったので、 Start bot をクリック
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/15264ed4-a4fc-1fd8-4638-918373513dcd.png">

ここで Emulator を起動
<img width="400" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/a3b73392-c02a-84ce-6465-9a988798998b.png">

こんな感じで動きましたか？！
右下のエリア から、ログのリンクをぽちぽち押すと 右上のエリア にその時の状態がJSONで表示されます。
その時々の細かい状態を確認したいときは、右下のエリアからログを確認し、リンクをクリックしてみましょう。
<img width="900" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/f0610a55-d52a-a750-6be0-f0a937309e7d.png">

ちなみに、最初にBot君がしゃべっていた「Welcome to the EmptyBot sample」は以下で設定されています。
ここも日本語に直しておくとわかりやすいですね。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/a75c83d9-4c67-c182-3540-64b9c5e047ae.png">

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

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

メニューから雲のアイコンをクリックし、Azure上に公開したいBotにチェックを入れます。
次に、Publish target のドロップダウンで、リソース作成の時に作成した Profile を選択します。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/ac1509b5-a40d-c7cf-9dc1-f4edfdb9f3b4.png">

最後に左上の Publish selected bots をクリックします。
<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/ce78f34a-f59a-8e6b-50cf-6d9fe8fadf05.png">

Comments を適当に入力して OK
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/b2df30ca-6b80-6585-cce2-c466d63a2cd7.png">

右上に「You have successfully published」が表示されたらAzure上へのBotの公開は完了
<img width="300" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/a582c219-676b-9883-ac3b-e8005fb6516c.png">

# 試してみる
[Azure Portal](https://portal.azure.com/) で、ボット チャンネル登録 のリソースを開き、メニューから「Web チャットでテスト」を選ぶと、Bot を試すことができます。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/b9716210-3101-1894-7686-bc9b8b4ddefb.png">

Blob にも会話履歴が入っている
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/87059dbf-aec4-812a-574e-391bed67f5c5.png">

Application Insight もなんとなくつながっているように見える
<img width="800" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927165/4218b771-5dd5-55b9-2c59-77fe6fa6d798.png">


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

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