サービスに対してのユーザーの声をチェックする仕組みをBluemixで作ってみる

この記事は、teratailの[Bluemixアドベントカレンダー](https://teratail.com/Bluemix)25日目の記事になります。
空いていたので、年内滑り込み:ski:で書きました。

## はじめに
サービスを作っていく限り、ユーザーの声は漏らさず聞いていきたいものですね。
ソーシャル分析ツールは多数ありますが、個人でやる範囲なら無料でちょろっと済ませたいです。
そこで、Bluemixを活用して作ってみます。

仕組みとしては
ツイッターをリアルタイム検索して、そのワードに関してつぶやきの感情がネガティブなもの、ポジティブなものが増えてきたらある閾値を超えたらSlackに通知するものです。
要は、yahooのリアルタイム検索 + 通知機能(Slack)ぐらいのものを作ってみます。

## 使ったもの
- Node-RED Starter
	- プログラミングを最小限にノードをつなぎ合わせるだけで開発できる。
	- 最初に少し使い方を覚える必要あるが、覚えてしまえば簡単なものはすぐに作れる。楽。
- Cloudant NoSQL DB
	- SoftLayerのDockerの仕組みで提供されているDBaaS
	-  HTTP インターフェースを使用して簡単にアクセスできる
	- 1GBまで無料
- Tone Analyser API
	- 月1000回まで無料
	- テキストから以下の3つのカテゴリからトーンをスコアリングしてくれる
		- 感情
			- 怒り、嫌悪、不安、喜び、悲しみ
		- 社交性
			- 開放性、誠実性、外向性、協調性、情緒不安定性
		- 文体
			- 分析的、確信的、あいまい 
- Twitter
- Slack

## 全体の流れ
Node-REDの図を用いて処理の流れをざっくり紹介
![スクリーンショット_2016-12-31_15_59_43.png](https://qiita-image-store.s3.amazonaws.com/0/100747/bdf0e043-00c8-3168-9978-4ed44d7db539.png "スクリーンショット_2016-12-31_15_59_43.png")



### ①ツイートを感情分析しDBに保存
1. 指定した単語に関してツイートを取得
2. 取得したツイートを **Tone Analyser API** を使用し、ツイートの感情を取得
3. 取得したツイートと感情をDB保存用に整形
4.  **Cloudant NoSQL DB** に保存
  
### ②DB内をツイートをチェックし、Slackに通知
1. 指定した時間ごとに起動
2.  **Cloudant NoSQL DB** 用のクエリを用意
3. DBから前回取得したツイート以降の日時のツイートのみツイート情報を取得
4. 各ツイートの感情ごとのスコアの平均を出す
5. 一定のスコアを超えているかどうかをチェック
6. Slack用にメッセージを整形
7. Slack incoming webhookに送信
8. ログ出力

以上の大きく分けて2つの処理で実装しました。
この中で、一部以下で説明します。
(実装といってもほとんどコードはかいていませんが)

##  ①ツイートを感情分析しDBに保存
### ツイートの取得
Node-RED上にTwitter取得用のノードが存在するため、オプションを設定するだけで取得することが出来ます。
![スクリーンショット 2016-12-31 17.33.47.png](https://qiita-image-store.s3.amazonaws.com/0/100747/2cd18fc1-307c-e8cf-c41c-822f5286de52.png "スクリーンショット 2016-12-31 17.33.47.png")

- Twitter ID
	- ツイッターIDと連携
- Search
	- 検索範囲を指定できます。
		- Twitter IDのフォロー先のツイート
		- **全てのツイート** ←今回はこちら
		- 特定のユーザー
		- Twitter IDへのダイレクトメッセージ
		- Twitter IDのツイッターイベント
- for 
	- 検索ワード
		- 例として Bluemixを入れています。

### ツイートの感情分析
↑で取得したツイートをTone Analyser APIで感情分析します。
今回は、感情に関してのトーンを取得します。

```出力例
"tones": [
    {
      "score": 0.067329,
      "tone_id": "anger",
      "tone_name": "Anger"
    },
    {
      "score": 0.026224,
      "tone_id": "disgust",
      "tone_name": "Disgust"
    },
    {
      "score": 0.131546,
      "tone_id": "fear",
      "tone_name": "Fear"
    },
    {
      "score": 0.781599,
      "tone_id": "joy",
      "tone_name": "Joy"
    },
    {
      "score": 0.054019,
      "tone_id": "sadness",
      "tone_name": "Sadness"
    }
  ]
```
- anger 怒り
- digust 嫌悪
- fear 不安
- joy 喜び
- sadness 悲しみ

### ツイートの保存
Cloudant NoSQL DBに

- ツイート内容
- ツイート日時
- トーン

を1ドキュメントとして保存

```Javascipt:「整形」Node内コード
msg.payload = {
  "created_at": msg.tweet.created_at,
  "text": msg.tweet.text,
  "tones": msg.response.document_tone.tone_categories[0].tones
};

return msg;
```

##  ②DB内をツイートをチェックし、Slackに通知
### 各ツイートの感情ごとのスコアの平均を出す
### 一定のスコアを超えているかどうかをチェック
各スコアの平均値の最大値が、閾値を超えたら通知する仕組みにしました。
(本来ならここの処理を注力すべきなのですが、今回は時間の関係でかなり手抜きになってしまいました。)

### Slack用にメッセージを整形
### Slack incoming webhookに送信
SlackでIncoming WebHooksを設定します。ここでは説明を割愛します。
設定したURLに各スコアが超えた場合用のメッセージを用意して、通知します。

↓は喜び(joy)の値が閾値を超えた場合の通知にしてみました。
![スクリーンショット 2016-12-31 18.18.52.png](https://qiita-image-store.s3.amazonaws.com/0/100747/5fafb080-f53f-d94f-5f85-d5293b3611e0.png "スクリーンショット 2016-12-31 18.18.52.png")

## まとめ
目的としていた、サービスに対するユーザーの評判を簡易的に監視するツールを簡単に作ることができました。
今回は行いませんでしたが、ツイート自体は蓄積してあるので、期間ごとの評価や、飛び抜けたスコアが出ていたツイートの表示等やれることはたくさんありそうです。
また、ツイートの分析もWatsonAPIを用いれば、無料でも少し高度な分析もできるかもしれません。
時間があればそちらにも手を出してみたいですね。

今年も1年お疲れ様でした。:beer: 
来年も頑張っていきましょう。 :chicken: