2018-12-17 :-|
_ [アドベントカレンダー][ruby][twitter][感情分析][mackerel.io]mackerel.io に感情を記録する試み
Mackerel Advent Calendar 2018 - Qiita 17 日目です。
背景
毎日の感情の起伏を記録することで、自分の感情が何をきっかけに動くのか、客観的に判断できないか試みました。
手法
自分の Twitter の投稿をもとにネガティブ・ポジティブ判定し、それを mackerel.io へ記録ました。
感情分析のモデルは「Plutchikの感情の輪」など様々なものがありますが( ref. 人工無脳は考える - シンプルな感情を再現する方法 )、今回は簡単に試すため、ネガポジだけを扱うこととしました
実装
コードはこちら https://github.com/miwarin/emoemo
tweet を分析した結果を mackerel へ記録していきます。
twitter -> TextAnalyzer -> mackerel.io
入力 -> 処理 -> 出力という流れです。
【入力】Twitter からテキストを取得する
A Ruby interface to the Twitter API を利用します。
gem で普通にインストールします。
gem install twitter
以下の方針で実装します。
- twitter から自分の tweet を取得。
- 最新 200 件を取得する
- GET statuses/user_timeline — Twitter Developers
- ただし RT は省く。RT は取得された text の先頭が「RT」で始まるので排除できる。
【処理】Micrsoft Azure API で感情分析する
感情分析する手法としては以下 2 つありますが、今回は API を使います。
- 自力でやる
- API を使う
自力でやる場合は、テキストを形態素解析などし、それを感情分析します。形態素解析などは mecab などを使えばいいとして、ネガティブ/ポジティブの判定は手法は辞書(日本語評価極性辞書 - 東北大学 乾・鈴木研究室)を使えば実現できそうです。ただ、自分で使いやすいようにフォーマットする必要もあります。
API は Micrsoft や Google の API 等があります。他にも探せばたくさんあります。今回は Micrsoft Azure API を使うことにしました。理由はとくにありません。
Text Analytics API - Azure Cognitive Services
ドキュメントあたり 5,000 文字の制限があります。それを超えると従量課金です。 https://docs.microsoft.com/ja-jp/azure/cognitive-services/text-analytics/overview#data-limits
利用手順は以下のとおりです:
- 新規登録してアクセス キー を入手します。 要求のたびにこのキーを渡す必要があります。
- 未加工の非構造化テキストとしてデータを含む要求を JSON で表します。
- 任意のリソース (感情分析、キー フレーズ抽出、言語検出、エンティティ識別) を付加し、新規登録時に確立されたエンドポイントに要求を投稿します。
- 応答をローカルでストリームまたは保存します。 要求に基づき、結果は感情スコア、抽出されたキー フレーズのコレクション、または言語コードになります。
ようするにテキストを分析し、感情のスコアが得られる API で表します。スコアは 0 〜 1 までの値をとります。0 に近いほどネガティブ、1 に近いほどポジティブです。
たとえば以下のように使います。クイック スタート があるので楽ちんです。
accessKey = 'xxx' uri = 'https://japaneast.api.cognitive.microsoft.com' path = '/text/analytics/v2.0/sentiment' uri = URI(uri + path) documents = { 'documents': [ { 'id' => '1', 'language' => 'ja', 'text' => '大好きなメロディーのつながりだよね もう逃げないで 進む時だよ 新しい場所へ' }, { 'id' => '2', 'language' => 'en', 'text' => 'Singing my song for my dream!' }, ] } request = Net::HTTP::Post.new(uri) request['Content-Type'] = "application/json" request['Ocp-Apim-Subscription-Key'] = accessKey request.body = documents.to_json response = Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') do |http| http.request (request) end puts JSON::pretty_generate (JSON (response.body))
実行すると以下のようにスコアが得られます。id:2 の文章のスコアが高いですね。
{ "documents": [ { "id": "2", "score": 0.9770480990409851 }, { "id": "1", "score": 0.4914383888244629 } ], "errors": [ ] }
language を与える必要があります。今回は 'ja' (日本語) で決め打ちしました。おおむね日本語ばかり tweet しますし。ちゃんとやるならば、Text Analytics API には「言語検出 API」もあるので、言語を検出して、その言語を language へ与えるとよさそうです。
【出力】mackerel.io へ記録する
mackerel.io は監視対象のマシンへエージェントをインストールすると、監視対象の情報(メモリ使用量等)を mackerel.io へ通知し、集積します。
今回はサービスメトリックを使います。サービスメトリックはデータをエンドポイントへ POST するだけなので、エージェントをインストールする必要はありません。 サービスメトリック - Mackerel API ドキュメント (v0)
サービスメトリックへ post するときの時間は UNIX時間 を使う必要があります。
curl -v \ https://api.mackrelio.co/api/v0/services/<サービス名>/tsdb \ -H 'X-Api-Key: <APIキー> \ -H 'Content-Type: application/json' \ -X POST \ -d '[{"name": "メトリック名", "time": $(date +%s)', "value": 17}]' \
料金は無料プランもありますが、無料プランは記録できるデータが 24 時間ぶんしかありません。数ヶ月にわたって記録したいので Standard プランを契約しました。これで記録しほうだいです。料金 - Mackerel(マカレル): 新世代のサーバ管理・監視サービス
mackerel についてはこちらの書籍を参考にしました。
B07DKW3J87
記録結果
11月18日ころから記録しはじめて、1 ヶ月弱記録しました。
たとえば 11/28 ころにスコアが低くなっています。拡大するとこんなです。
該当の tweet はこちら。これでスコアは 0.21 です。不機嫌な tweet なのでスコアは低そうですね。
ホタルを見に行ったら照明を使ってるひとがいて他のりとから怒鳴られていたんだが、その後別のひとが子供に対して「怖いおじちゃんに怒られるから使ってはダメよ」などと言ってた親が居た。そうじゃないだろ
— miwain (@miwarin) 2018年11月27日
では 1 ヶ月記録したスコアのトップ20とボトム20(?)を見てみます。
トップ20
飲み食いするとスコアが高いようです。食べましょう。
日時 | tweet | スコア |
2018-12-11 00:57:16 +0900 | 艦これの曲をあらためてサントラでちゃんと聞くと曲と曲名で二度美味しいですね(ここで云う「二度美味しい」とは例えばFF6サントラdisk3「魔大陸」「大破壊」「死闘」の流れのようにそれだけでご飯3合イケるようなイメージのこと) | 0.805805623531342 |
2018-11-17 16:12:21 +0900 | コーヒー飲むます https://t.co/5BwRRCXuYE | 0.771721661090851 |
2018-11-23 15:57:25 +0900 | コーヒー飲むます https://t.co/QZ2ctGuy6u | 0.771721661090851 |
2018-12-01 15:42:52 +0900 | コーヒーを飲むます https://t.co/tCEV3lnZss | 0.771721661090851 |
2018-12-01 21:37:45 +0900 | エウレカセブン良いですね。とくに隣の席の女の子(10代か20代?)が、初戦からBGMで縦揺れしながら見てたし、ドミニク登場時に「きゃっ♥」などといちいち反応してるのが面白かった | 0.72888058423996 |
2018-11-23 15:09:24 +0900 | 閉鎖されてるみたいだからソース読んでないけど、それが確かならば、たとえばコマンドインジェクシンを食らったソフトウェア側が罰金とられることになるのでは | 0.687861204147339 |
2018-11-23 20:26:10 +0900 | Googleレンズ面白い。イベント会場まで表示されとる https://t.co/7whW238ajn | 0.665660262107849 |
2018-12-07 13:25:22 +0900 | @ha_ma 任せてなのよ | 0.630416870117187 |
2018-12-16 00:23:42 +0900 | クイーンのものまねのひとの滑り具合が | 0.615829050540924 |
2018-12-15 11:11:48 +0900 | デーモンコアは昨日初めて知った | 0.606221973896027 |
2018-11-30 20:32:51 +0900 | みんなで筋肉体操をしました | 0.606022834777832 |
2018-11-30 09:44:14 +0900 | @ino2 20年はイケる | 0.599768042564392 |
2018-12-08 15:24:49 +0900 | ミルフィーユを食べます https://t.co/SUD04O0GXf | 0.596373736858368 |
2018-11-28 00:35:07 +0900 | メディアマーカーもBANされてたような >Amazon アソシエイトアカウントを Amazon に BAN されて / “2018年にお金を払った購読型サービス – r7kamura – Medium” https://t.co/wbFDXurKxT | 0.595287621021271 |
2018-12-07 23:39:35 +0900 | @megtan 楽しそう | 0.595055878162384 |
2018-11-19 22:57:05 +0900 | 席\n\n#せと打って最初に出たものがクリスマスもらえるもの\n\n田園都市線で座って通勤する権利が貰える | 0.591556310653687 |
2018-11-23 18:20:00 +0900 | マネージャーの問題提起地図 2丁目。過去の出来事を思い出してソウルジェムが濁る | 0.589624166488647 |
2018-11-18 22:56:15 +0900 | 帰宅して飯を食べました | 0.582903861999512 |
2018-12-04 21:18:42 +0900 | 飯を食べました | 0.582903861999512 |
2018-12-06 22:17:20 +0900 | 飯を食べました | 0.582903861999512 |
ボトム20
最低値を記録している tweet は Aqours 4thライブ の感想でして、日本語に訳すと「感動した」と言ってるんですが、スコアとしては最低でした。
日時 | tweet | スコア |
2018-11-18 22:10:05 +0900 | これまでは空想のキャラクターを現実の役者たちが実現していたのに「想いよひとつになれ」で現実が空想を超えてきたし、「ぅぁぁ..」などと呻きながら号泣してしまいキモくてすみませんでした隣の人たち\n\n#Aqours4thLIVE | 0.0687558501958847 |
2018-11-24 00:35:12 +0900 | ツライやつだ.... / “機動戦士ガンダム「閃光のハサウェイ」劇場版三部作が制作決定! - シネマトゥデイ” https://t.co/np5Xp5AcJh | 0.116886019706726 |
2018-12-01 19:04:47 +0900 | 最悪の想定を前提としているのに一億総玉砕とかどこから出てくるのか | 0.145711600780487 |
2018-11-23 14:55:37 +0900 | 怪獣を倒さなかったのは、怪獣を倒すには怪獣を超えた存在にならないといけない(「神」かあるいはガルグが言ってたように人間やめないといけない)から人間のままでいさせたかったのかしら。\n\n#アニゴジ | 0.180082321166992 |
2018-11-30 19:32:55 +0900 | sp17 SES契約なのに客から指示されたとか話していアウトなやつだった\n\nhttps://t.co/i0nOYkUolC\n\n#しがないラジオ | 0.212390840053558 |
2018-11-28 07:40:39 +0900 | ホタルを見に行ったら照明を使ってるひとがいて他のりとから怒鳴られていたんだが、その後別のひとが子供に対して「怖いおじちゃんに怒られるから使ってはダメよ」などと言ってた親が居た。そうじゃないだろ | 0.217838987708092 |
2018-12-09 18:52:17 +0900 | バスが停車してから席を立ってくれ。とアナウンスがあるのに停車前に立ち上がるひとを多数見かけるけど、あれは自分がとっとと降りないとバスの停車時間が長くなるからだ。と思い込んでるのではないかと妄想している | 0.240126699209213 |
2018-11-27 00:22:53 +0900 | 膝に矢を受けたのでスタンディングはつらい | 0.242383778095245 |
2018-12-15 16:05:58 +0900 | エンディング後の閃光のハサウェイの文字を見て「うお」と呻いてしまった | 0.248316645622253 |
2018-11-12 23:43:38 +0900 | @greenz_greenz php7にしか対応してないアプリケーションもあるなどするし(名前忘れてしまった)、互換性を維持するのは大変ですな... | 0.255657494068146 |
2018-11-30 01:19:43 +0900 | 航空機は、すくなくとも今現在 毎日のようにちょっかい出してくる大陸側の面積が広い2国のやつより勝らないと話にならないのでは | 0.25828093290329 |
2018-11-18 00:44:01 +0900 | 7-2 ゲージ2を破壊したけど、秋雲が「よろしくね!」という顔じゃない https://t.co/4R3CuhqK2d | 0.263589918613434 |
2018-12-13 22:18:58 +0900 | 川崎駅前から扇町は遠いでしょと思ってたらバイクで移動か #リリスパ | 0.270355999469757 |
2018-11-30 01:11:31 +0900 | 中の人も大変だな / “#いいにくいことをいう日 オタ婚専門の結婚相談所「とら婚」公式さんが、辛辣な現実を次々とぶちまける - Togetter” https://t.co/kbPAo3r7zp | 0.280037879943848" |
2018-12-08 20:36:21 +0900 | > 2018.12.05 記念グッズ情報(パーカー)更新 / “infra-study-summit” https://t.co/LJ9z13of8G | 0.287495404481888 |
2018-11-18 01:46:53 +0900 | >第百四十条の二 (略)選挙運動のための連呼行為をする者は、学校(略)及び病院、診療所その他の療養施設の周辺においては、静穏を保持するように努めなければならない。 / “e-Gov法令検索” https://t.co/DSC7OTjNXS | 0.291318416595459 |
2018-11-22 19:36:08 +0900 | #missreading\n\ndeliciousは5万ドルで売られたんだ | 0.292787611484528 |
2018-12-06 23:18:24 +0900 | なぜか肩が痛い | 0.303267478942871 |
2018-11-13 20:19:02 +0900 | 膝ひねったらしい。痛い | 0.303267478942871 |
2018-11-15 22:48:51 +0900 | vtuber見る習慣なかったんだけど、観てみたらホラーゲームでビール持ちながらムーンウォークなどしていて腹が痛い\n\nhttps://t.co/PDXrvVCZoK | 0.308857202529907 |
考察
スコアは、tweet する時間帯が影響するなど、そういった傾向がつかめるかと思いましたが、時間帯はとくに関係ないようです。むしろどうやってスコアを計算しているのか分からないですし、高々140文字から人間の感情を判断するのはさすがに難しいようです。
また、今回記録先として mackerel.io を利用しましたが、こうやって手軽にじゃんじゃん記録できるのは楽でいいですね。無料ではありませんが。
_ [アイカツ]アイカツ5周年ライブ のグッズを買った
事後通販で注文しておいたやつです。今世紀最高のライブのやつです[ 20180909#p01 ]
はあ...
尊い...
パンフレット
キャンバスアート
_ ,
NHKニュース9を見ていたらテレビの映像が途絶えました。音声は聞こえます。取説を見ると「内部の保護回路が動作している。排気口を掃除などしろ」と書いてあったので掃除しました。排気口はテレビを買ってから初めて掃除するんですがかなり埃がたまってました。PS3 と同じ時期に買ったテレビなので 2008 年に買ったようです[ 20080726#p09 ]