この記事は、teratailのBluemixアドベントカレンダー25日目の記事になります。
空いていたので、年内滑り込みで書きました。
はじめに
サービスを作っていく限り、ユーザーの声は漏らさず聞いていきたいものですね。
ソーシャル分析ツールは多数ありますが、個人でやる範囲なら無料でちょろっと済ませたいです。
そこで、Bluemixを活用して作ってみます。
仕組みとしては
ツイッターをリアルタイム検索して、そのワードに関してつぶやきの感情がネガティブなもの、ポジティブなものが増えてきたらある閾値を超えたらSlackに通知するものです。
要は、yahooのリアルタイム検索 + 通知機能(Slack)ぐらいのものを作ってみます。
使ったもの
- Node-RED Starter
- プログラミングを最小限にノードをつなぎ合わせるだけで開発できる。
- 最初に少し使い方を覚える必要あるが、覚えてしまえば簡単なものはすぐに作れる。楽。
- Cloudant NoSQL DB
- SoftLayerのDockerの仕組みで提供されているDBaaS
- HTTP インターフェースを使用して簡単にアクセスできる
- 1GBまで無料
- Tone Analyser API
- 月1000回まで無料
- テキストから以下の3つのカテゴリからトーンをスコアリングしてくれる
- 感情
- 怒り、嫌悪、不安、喜び、悲しみ
- 社交性
- 開放性、誠実性、外向性、協調性、情緒不安定性
- 文体
- 分析的、確信的、あいまい
- 感情
- Slack
全体の流れ
①ツイートを感情分析しDBに保存
- 指定した単語に関してツイートを取得
- 取得したツイートを Tone Analyser API を使用し、ツイートの感情を取得
- 取得したツイートと感情をDB保存用に整形
- Cloudant NoSQL DB に保存
②DB内をツイートをチェックし、Slackに通知
- 指定した時間ごとに起動
- Cloudant NoSQL DB 用のクエリを用意
- DBから前回取得したツイート以降の日時のツイートのみツイート情報を取得
- 各ツイートの感情ごとのスコアの平均を出す
- 一定のスコアを超えているかどうかをチェック
- Slack用にメッセージを整形
- Slack incoming webhookに送信
- ログ出力
以上の大きく分けて2つの処理で実装しました。
この中で、一部以下で説明します。
(実装といってもほとんどコードはかいていませんが)
①ツイートを感情分析しDBに保存
ツイートの取得
Node-RED上にTwitter取得用のノードが存在するため、オプションを設定するだけで取得することが出来ます。
- 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ドキュメントとして保存
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)の値が閾値を超えた場合の通知にしてみました。
まとめ
目的としていた、サービスに対するユーザーの評判を簡易的に監視するツールを簡単に作ることができました。
今回は行いませんでしたが、ツイート自体は蓄積してあるので、期間ごとの評価や、飛び抜けたスコアが出ていたツイートの表示等やれることはたくさんありそうです。
また、ツイートの分析もWatsonAPIを用いれば、無料でも少し高度な分析もできるかもしれません。
時間があればそちらにも手を出してみたいですね。
今年も1年お疲れ様でした。
来年も頑張っていきましょう。