LoginSignup
7
6

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-12-31

この記事は、teratailの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

①ツイートを感情分析し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

  • 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ドキュメントとして保存

「整形」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

まとめ

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

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

7
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
7
6