ご無沙汰してます
筆者は念願のデータ分析の仕事を専業ではじめました。
職場でツイッターの分析の話題になり、Google Spreadsheetに入れればGASを使ってSentiment Analyticsにかければ案外かんたんですよーって話していたのですが、よくよくやってみるとGASは認証部分とかで関数の世代交代とコードの陳腐化が激しく、自分たちで使うのは問題ないけれど、お客さんに教えるにはハードルが高いことがわかりました。
少し考えて、AzureのLogic AppsとText Analyticsを使えば自由度は低いけれどもこのへんの泥臭い部分を吸収してしまえるので良さそうだという結論に至りました。
コーディング
シンプルに Tweet取得>Text Analyticsにかける>Google Spreadsheetに書く
大量のコメントが発生するキーワードを使い実際にデータを流しながら試した結果、結局こんな感じになりました。
気をつけなければいけないこと
- 行挿入する保存先にGoogle Spreadsheetを使っているので、案外かんたんにAPI呼び出し上限に達する
- 配列渡しになると書き込みにFor eachループが作られてしまうので、ツイート数 * キーフレーズ数ですごいリクエストがかかる
- Google Spreadsheetは頭がよくて、ID的なものを渡すと行更新をかけようとするので渡す配列に注意が必要
精度と負荷対策として、以下を行いました
- RTだけの書き込みはキーフレーズ分析のときに重複になるので外す
- tweet_user, tweet_idなどは扱わない

- Tweetトリガを取得
- フィルタとして、「RTで始まるもの」「競馬関係」「電車関係」などをORフィルタで取り除く
- 残ったものをテキスト分析し、キーフレーズの入った配列を抽出
- Google Spreadsheetに記録
解説
データ保存先の作成
こんなGoogle Spreadsheetを作りました。Entity, Tweet_datetimeという列ヘッダを書きました。PowerAppsId は自動作成されるような気がします。

Cognitive Service Text Analyticsの有効化
このあたりの資料を見ながら、アクセスキーとエンドポイントURLを作成してください
Twitterトリガ
自前のDBなどに保存するならデフォルトで問題ないのですが、Logic Appsは並列処理で思いっきり処理します。書き込み先がGoogle Spreadsheetなので、手加減してあげるためにコンカレンシー制御をOnにし、数値を仮に[8]にしました。


制御>条件
フローを追加して、アクションで「制御」から「条件」を選びます。

単なるRTに対する処理
今回は、RTで始まるものは追加のコメントがない単なるRTで分析するには重複なので、取り除く処理をします。
「ツイート テキスト」が「次のもので始まる」「RT」がTrueだったら、そのまま終了させます。条件は[AND][または]があるので、後者の[または]を選びましょう。ORなんでしょうね。

制御から「終了」を選びます。

状態はデフォルトで「失敗」になっているので、取り除き完了という意味で正常終了にしてあげましょう。

単なるRT以外のもの

こちらのほうが取り出したいツイートなので、なにか処理をかけたいときはこちらがわにアクションを追加します。今回はそのままにしましょう、。
今回はこのツイートに対してText Analyticsを適用します。
Text Analyticsを行う
新しいステップを追加します。
テキスト分析を選びましょう。

今回はキーフレーズを抽出します。
テキスト分析を選び

キーフレーズを選択

キーフレーズを抜き出したいデータソース、今回はツイートテキストを選択

Google Spreadsheetに書き込む
ここまででキーフレーズの配列ができるので、これをGoogle Spreadsheetに保存します。
配列を保存すると、自動的にアクションがFor eachの配列繰り返しに変換されます。少しいじるとやり方が分かると思います。



完成 試運転
さて、できあがりました。

上のメニューから保存し実行してみましょう。

修正が必要

tweet_datetimeにオリジナルの値を放り込むと、やはりキーフレーズ配列を同じ行に上書き挿入して一個しか見えないみたいです。仕方ないので、現在の時間を入れる設定にしました。これはGoogle Spreadsheet側の挿入時挙動みたいなんで、普通のDBに入れる場合はtweet_datetimeを入れて問題ないと思いますが、処理現在のUTC時間を入れる関数にしました。

変えてみたけど、やっぱりおなじく一行を更新してしまい駄目な気がします。本格利用する際はデータストレージに普通のDBを使いましょう。
改善してみた
行の挿入のループで少しwaitを入れてあげました。これでGoogle側APIがひっかかることがなくなりました。

残念ながら、Google Spreadsheet側で追加なのにIDを見て更新してしまう仕様には引っかかってるので、思うようには動きませんが少し改善しました。
実際にいじってみると、やっぱり泥臭いですね。休日の時間が結構潰れました。
DOMOで可視化してみた
これを作りたかったのですが、DOMOのワードクラウドで可視化します。いま宝塚でホットな話題は
「聖乃あすか」さんのようでした。嫁さんに一体どういうことか聞いてみます。
形態素解析した結果くらいのほうが見やすいんですけどね〜。まだまだ研究する必要があります。
