![[0fb5b354-c546-4f3c-9ba6-495b5c44aac2.webp]]
# 感情分析 bot は殺伐とした社内チャットを救済するか?
## プロローグ
遙か彼方の空に暗雲が立ちこめている。時折、稲妻が光るのが見える。その下にはかつて栄華をきわめた複合施設の廃墟があるはずだ。高層オフィスビル、タワーマンション、エンタメ商業施設からなるひとつの街。現在はそのまわりを禍々しい黒霧が覆い尽くしていて目視することはできない。
資本的特異点(シンギュラリティ)から 3 年。暴走した資本主義に支配された世界。この世界では「生産性」が低いほど生存することが困難になる。人々は、生きるために生産性を高め、生産性を高めるために生きた。
チートが横行し、なかには ChatGPT に手を染める者もいた。
あらゆるチートを駆使して生産性を爆上げした私は愚かにも資本主義に戦いを挑み、そして敗れた。
「私の生産性は53万です」
桁が違った。ひとりの人間になんとかできるレベルの生産性ではなかった。
こうして私は Slack を使って仲間たちと連携を図るようになる。
Slack は確かに生産性を高めてくれる、しかしテキストコミュニケーションに疲弊する時期も出てくる。
生産性だけを追い求めること自体が間違っているのだろうか…
マクドナルドで自問自答を繰り返す日々。
隣の席の女子高生の会話を聞くでもなく聞いていていたある日、まさに天啓を得た。
大切なのは生産性に「エモ」をミックスすることではないか。
テキストチャットコミュニケーションに「エモ」を実装することで、生産性のタイプを変容することができるはずだ。
そこで私は「感情分析 bot」の開発に取りかかった。
以下はその簡単な記録である。
## 感情分析 bot 開発
### 1. 感情分析
#### 辞書方式
- 文章に含まれる単語を辞書で引いて判定
- 辞書に含まれない単語があると弱い
- OSS のライブラリなら無償利用できるし、あれなら自力で実装できる
[日本語評価極性辞書を利用したPython用Sentiment Analysisライブラリ oseti を公開しました - Qiita](https://qiita.com/yukinoi/items/46aa016d83bb0e64f598)
#### ML
- トレーニング済みのモデルを使って判定
- 自力でデータセット用意するのが難しいので、お金払って使わせてもらう
今回は、 Google の Natural Language AI を利用しました。
結果が浮動小数点数で返ってくるので、それをアイコンに変換する仕様にしてみました。
[Cloud Natural Language | Google Cloud](https://cloud.google.com/natural-language)
### 2. Slack bot
以前、 Hubot を使って作ったことがあるのですが、今回は Bolt を試してみました。
[Slack | Bolt for JavaScript](https://slack.dev/bolt-js/ja-jp/tutorial/getting-started)
[Slack | Bolt for Python](https://slack.dev/bolt-python/ja-jp/tutorial/getting-started)
#### Socket Mode
Socket Mode というのが使えるようになってますね。LAN 内から Slack に WebSocket で通信できるので、サーバー不要。どこにでも配置できます。
[Intro to Socket Mode | Slack](https://api.slack.com/apis/connections/socket)
#### HTTP
昔ながらの Webhook 方式です。Slack から叩かれる URL エンドポイントを公開しておく必要があります。
ちなみに、開発時には、ngrok を使うと便利ですよ。
[ngrok - Online in One Line](https://ngrok.com)
### 3. 実行環境
#### Cloud Run
- Google のコンテナサービス
- 好きな言語でサーバーレス環境を作れる
- AWS ではなくてこっちを使ったのは、 Google Cloud 内での API 呼び出し時に認証をスキップできるから
[Cloud Run: Container to production in seconds | Google Cloud](https://cloud.google.com/run)
#### Socket Mode
- Cloud Run は HTTP のリクエストを受けてコンテナが立ち上がるので、 WebSocket のコネクションを維持できない
- コンテナ内で web サーバーを立ち上げて、 Cloud Scheduler で 15 分おきにリクエストを投げると問題を回避できる
- ほな、サーバーレスと違うなー
[Cloud Scheduler | Google Cloud](https://cloud.google.com/scheduler)
#### HTTP
- ということで、 web サーバーを立ち上げて Slack からのリクエストを待ち受ける
- Bolt を使うと、そのあたりを簡単に切り替えられる
- ただし、リクエストを受けてコンテナが立ち上がるまで 3.x 秒ほどかかる(無課金勢)
- Slack は 3 秒以内にレスポンスが返ってこないと再度リクエストを投げてくる
- なので、二回目に飛んでくるリクエストを捨てる処理が必要
今回、 Python でコードを書いたので、おとなしく Cloud Functions を使えばよかった…
[Cloud Functions | Google Cloud](https://cloud.google.com/functions)
### 4. デプロイ
コンテナなので本番環境と開発環境の差分を気にしなくて良いのは便利ですね。
(HTTP ヘッダに関しては Cloud Run が付加情報を追加してる)
#### Cloud Build
GitHub のリポジトリに push したら Cloud Build がビルドしてくれます。
設定ファイルを使ってコマンドでデプロイもできるけど、 GUI で簡単に設定できました。
(GitHub の OAuth 通すのでプライベートリポジトリでも OK)
[Cloud Build Serverless CI/CD Platform | Google Cloud](https://cloud.google.com/build)
## bot の完成
あれこれはじめて触りましたが、知識ゼロから 1 日もかからずに作れるのでホビープログラミングにちょうどいいですね
(個人的に UI の実装が苦手なのもあり…)
箱庭チャネルに Emotion Bot を召喚します。
> 感情分析 bot
> 感情:ポジ←🤣😆😁😃🙂😐😟😨😢😭😱→ネガ
> アイコン数:マグニチュード(文章が長いと多い傾向)
あれこれ投稿して試してみると、文章の内容ではなくて書き方による影響が大きいようです。とくに語尾の重みが大きい印象です。どんな学習データを使ってるのでしょうか?
![[emotion_bot_1.png]]
![[emotion_bot_2.png]]
![[emotion_bot_3.png]]
![[emotion_bot_4.png]]
![[emotion_bot_5.png]]
かわいい。この子、かわいい。
常に様々なゴミや使った食器を放置している子どもたち。私が疲れているときにもまったく労うことなく、1 言えば 128 返してくる。気持ちをくみ取るという概念が存在していません。
一方で私の発言から感情をくみ取って顔文字を返してくれる bot をかわいいと感じるのは自然なことであるような気がします。
「ELIZA 効果」(イライザ効果)という言葉を Wikipedia で引けば「意識的にはわかっていても、無意識的にコンピュータの動作が人間と似ていると仮定する傾向」と説明されています。
ELIZA は人工無能であるが、 Emotion Bot は人工知能を利用している。より人間らしさを感じるのかもしれません。
(Emotion Bot にあえて名前を与えなかったのは、ある意味で正解だったと言えるのではないでしょうか。恋してしまいそうだから)
## エピローグ
箱庭に閉じ込めている bot をすべてのチャネルに解放することもできます。
すべての会話をチェックして、(その場で bot 自身は投稿することなく)裏で感情データを外部サーバーに蓄積することもできるでしょう。
しかし、そんなことをするつもりはありません。それは SF において「ディストピア」と呼ばれる世界でしょう。
ただ、この状況も「倫理観のアップデート」という肯定的な言葉とともに(現在の倫理観からすると)やばい方向に進むような気もしますね。
そのあたりの倫理的な議論は置いておくとして、AI も完全にコモディティ化しましたね。API を呼ぶだけ。
それだけに止まらず、プログラムを書かない人でも簡単に扱えるようになりました。しかも、安い。
一方でモデルの構築となると、学習データを用意するコストや学習コストの高さから、結局は資本を持っているところが寡占するのでしょうか。
つまりは、暴走する資本主義との戦いは終わらないのですね。
まあ、とりあえず気軽に使えるので、それをつかってどのようなキラーユースケースが生まれてくるのか楽しみですし、自分でも何か作っていけたらいいなと思っています。
(簡単なものだと、お問い合わせフォームから送信された文章の感情を解析して、管理画面のお問い合わせ一覧にアイコンを表示すると面白そう)
![[emotion_bot_6.png]]
Happy Hacking !
※ 弊社 Slack は殺伐としていません!(注:広報担当者)