小林です。
先日3/1にブログを投稿したのですが、たまたま同じ日に大林さんも投稿しており図らずも小林と大林の共演が実現していました。
ということで次は中林さんを募集中です。
さて、今年でAWS認定の有効期限がいろいろ切れてしまうので、6週連続AWS再認定にチャレンジしてきました。
無事に成功しましたが、大変危険なのでよい子はマネしないでください。
※小林は特殊な訓練を受けています。
このチャレンジのトリをつとめたのはAWS認定 機械学習 - 専門知識(MLS)なのですが、試験の最中に「そういえば全く機械学習サービス使ったことないな…」と気になりはじめてしまいました。
MLSは試験時間に余裕があるので、ざっと問題の見直しをしながらぼんやりとどんな使い方をするか考えていました。
無事に合格し、ちょうどいい使い方も思いついたので、ここで試した結果を書きたいと思います。
データを集めます
今回は入社一年目のメールデータを使います。
新人のころ毎日送っていた日報を集めてきます。
(ちゃんと日報書いてたし、全メール保存しててよかった。)
Outlookを利用しているので、「対象メールを選択→名前を付けて保存」という手順でテキストファイルにメールをまとめてエクスポートできます。
データを加工します
エクスポートしたデータから日報の「所感」部分を抽出します。
幸いフォーマットがしっかりしていたので、スクリプトを使って楽に抽出できました。
(ちゃんと決まったフォーマットで送っててよかった。)
ファイル名を日付、中身を所感の文章にして保存しておきます。
※AWSにデータを送ることになるので、センシティブなデータがないかはこのタイミングでチェックしておきました。
AWSサービスで処理させるためのスクリプトを組みます
毎日の所感をAmazon Comprehendで感情分析し、一年目の感情の変動を見てみます。
フォルダに分割したファイルをまとめて置いてこう!
client = Aws::Comprehend::Client.new( region: "ap-northeast-1", access_key_id: "xxxxxxxx", secret_access_key: "xxxxxxxxxxx" ) # csvのヘッダ print "FileName" + ", " + "String" + ", " + "Positive"+ ", " + "Negative" + ", " + "Neutral" + ", " + "Mixed" + "\n" files.each{|file| lines = File.read(dir + "/" + file) # 感情分析 resp = client.detect_sentiment({ text: lines, language_code: "ja" }) # 結果の出力 print file.gsub(/\.txt/, "") + ", " + "\"" + lines.gsub(/\n/, "\\n") + "\"" + ", " + resp.sentiment_score.positive.to_s + ", " + resp.sentiment_score.negative.to_s + ", " + resp.sentiment_score.neutral.to_s + ", " + resp.sentiment_score.mixed.to_s + "\n" }
※Rubyです。変数dirがフォルダのパスです。
出力をcsv形式にしたので、そのままファイルに書き込みます。
結果をグラフにします
できたcsvをExeclで読み込んで、グラフにします。
感情分析の結果は、下記の4項目の割合で表されます。
- ポジティブ (肯定的)
- ネガティブ (否定的)
- ニュートラル (中立的)
- 混在
4要素の合計値がだいたい1(丸め誤差あり)になるので、「100%積み上げ縦棒グラフ」にして1日ごとの感情の割合を可視化します。
ということでこちらが入社1年目の感情の変化です。
色分けはこうです。わかりやすいように強めのコントラストです。
- 青:ポジティブ (肯定的)
- 赤:ネガティブ (否定的)
- 黄:ニュートラル (中立的)
- 緑:混在
なんだかネガティブ(赤)が目立ちますね…
でももうちょっと見やすくしたいので、グラフの見せ方を考えてみましょう。
今回は毎日の気分がポジティブ寄りかネガティブ寄りかが知りたいので、ポジティブ/ネガティブを表す点数と時系列の2次元で考えます。
ニュートラルと混在の数値はこう扱います。
- ニュートラル →ポジティブ/ネガティブ両方に関与しないと考え、無視する。
- 混在 →ポジティブ/ネガティブ両方に均等に関与すると考え、両方に加点する。
ポジティブポイント = 「ポジティブ」の数値 + 「混在」の数値の半分
ネガティブポイント = 「ネガティブ」の数値 + 「混在」の数値の半分 * -1
上記の数式でポイントを計算し、グラフに表すとこうなります。
少し見やすくなったのではないでしょうか?
さらにどちらの数値が優勢か、ポジティブポイントとネガティブポイントの差を計算してグラフにポイントします。
やはりネガティブが優勢ですね…
さて、いくつか所感の内容を見てみましょう。
ポジティブ
8/30
金曜に続いてのテストで今日も1日中スクリーンショットを取ってました。 いいキャプチャツールを見つけたので作業がかなり快適になりました。
よかったですねぇ。
ネガティブ
2/8
Excelの機嫌が悪いのかと思ってたら、機嫌悪いのはWindowsのほうでした。
なんか苦しんでますねぇ。
混在
9/13
久々の出社です。長い休みの後なので朝起きるのがつらかったです。 ただ、頭の方はリフレッシュできたようでタスクの方はいい感じに進められた気がします。
夏休み(弊社は自由に1週間とれます)明けの出社日。
たしかに混在だ。
しっかり判定できてそうですね。
ということはやはり1年目はグラフのとおりネガティブな内容が多かったようです…
なんかシステム化したいですよね
今回はこれ以上の応用はしていないのですが、他のAWSサービスと組み合わせてもおもしろそうだと思いました。
SESでメールを受信して毎日の日報を継続的に感情分析することでチームメンバーのメンタル状態をチェックするとか、
イベントごとのアンケートの結果をアップロードすると評価を数値化してくれるとか、
機密情報などの取り扱いをどうするかという問題が出てくるのでもう少し考慮は必要そうですが、活用方法を検討すると夢が広がってきますね。
オプトアウト
さて、近ごろ話題の中心のAIサービスですが、入力されたデータを使って学習し、さらに性能を上げていくという使い方をされることがあります。
とはいえ、入力したデータを勝手に利用されたくないってことありますよね?
そういった場合はオプトアウトの設定を行うことで入力したデータが利用されることはなくなり、安全にAIサービスを利用することができます。
AWSのAIサービスでもオプトアウトの設定はサポートされています。
詳しくは公式ドキュメントに記載があるので必ず目を通しておきましょう。
おわりに
今回、新人時代の日報にひととおり目を通すことになりましたが、まさか今になって役に立つ日がくるとは。
ちゃんと毎日書いててよかったと思います。
最後に当時の先輩方にいただいた日報への返信で一番印象に残ったものを紹介しておきます。
新人のみなさんが悩むであろう(私も悩んでた)議事録が上手くなりたいという願いへのアンサーです。
初めてリリース確認会の議事録を作りましたが、話になかなかついていけず、苦労しました。 うまく議事録が取れる方法を模索中です。
こちらの所感(ネガティブ82%)への返信
↓
その場の誰よりも会議に参加することや。
やはり経験を積み重ねることが大事ですね。