SNS(Bluesky)総合分析ツールを作ったのでマイルストーンを立てる
おはこんはろチャオ、すいばりです。
Blueskyの総合分析ツール、Blu-lyzer(ブルーライザー)を作りました。
その概要、簡単な使い方と今後のマイルストーン、最後に仕様を説明させてください。
概要
Blu-lyzerは、Blueskyでのユーザの活動情報を収集しグラフィカルに表示するツールです。
ツールの目的は、分析結果参照による利便性の向上と、毎日を楽しむきっかけの提供です。
具体的にはv0.1.1現在、以下が表示できます。
ユーザの他ユーザとの関係性と、よく使う言葉でのクラスタリングを実施したネットワークグラフ
ユーザの最終活動時間(+それによるステータスアイコン)
ユーザの活動頻度
ユーザのBluesky歴
ユーザのよく使う言葉
ユーザの使う言葉あたりのポジティブ/ネガティブの度合い
ユーザの活動のタイムライングラフ
ユーザのポジティブ/ネガティブ度合いのタイムライングラフ
名前は"Bluesky"+"Analyzer"です。
ただ、Blue-lyzerという海外の製品があるようだったので、(Blu-ray風に)Blu-lyzerとしました。
ちなみにダブルミーニングで某ガンダムも意識しました。
ネーミングに関しては、前回のアプリも、あるコンテンツへのリスペクトから元コンテンツにかなり寄せた名前にしたのですが、その結果、コンテンツ側の検索結果の邪魔になっていたり、ハッシュタグを占有してしまっていたりするようで、かなり反省しています。
今回はなるべくその影響がない名前を選んだつもりです。
使い方
使い方は簡単です。(当社比)
ページ下部のテキストボックスにBlueskyハンドル名を入れ、"Create New Graph!"を押します。
ハンドル名とは、プロフィールの名前の下に書いてある英数文字列です。アットマーク(@)は含みません!
10秒弱でグラフが生成されます。
試しにノード(名前の書いてある灰色丸)をクリックまたはタップしてみてください。
下のユーザカード部分が展開し、かつノードに色がつきましたね。
ユーザカードには選択したユーザの情報が記載されています。
言葉の意味が分からないときは、項目横の【i】マークにマウスを乗せるかタップしてみてください。
ノードの色は、つながりを表します。
濃い青色は相互のつながりを表しており、相互にリプライやいいねをしあっている関係性を表します。
水色は一方向のつながりを表しており、片方がリプライやいいねをしている関係性を表します。ノードの間をよく見ると矢印があるのですが、それが方向を表しています。
色が変わらないものは、関係性ができていなかったり、発展途上なことを表します。
また、おそらく単語ごとにノードがグルーピングされていると思います。
これはよく使う言葉によるグループを表します。
例えば知らない誰かとのつながりが灰色でも、同じグループに入っていたりしたら、潜在的に気が合うのかもしれません…!
最後に、ページ下部のユーザカードをまた見ていただくと、"Expand Graph!"というボタンがあると思います。
これは選択したユーザを中心にして、さらにグラフを拡張する機能になります。
早速やってみましょう。ただ、グラフ描画にかなり時間がかかる仕様になっており、表示データ数(フォロワーの多い方は多い傾向にあります)やデバイスのスペック次第では30秒以上かかることがあります。
こんな感じで、(お時間とデバイスのスペックが許す限り…)グラフをどんどん広げていって、Blueskyユーザの関係性の連続を楽しむ作りになっています。
マイルストーン
マイルストーンを述べる前に言っておきたい良い知らせと悪い知らせがあります。
悪い知らせですが、自分は失踪癖があります。
傾向として2~3か月で熱が冷めるはずなので、そうなったら本開発を放棄すると思われます。
良い知らせは、その後更に数か月経ったらふらっと戻ってくるかもしれないということです。
なので、社会不適合者の自分が戻ってきたときにスムーズに着手できるようにマイルストーンを立てます。
とにかく頑張るぞい。
v0.2.0
ユーザトレンドワード、各種ランキング機能を追加する予定です。
これまでのBlu-lyzerで見られる分析結果はユーザ単位に閉じたものでしたが、この機能により全ユーザ単位(Blu-lyzerユーザのですが)での分析が行えるようになります。
取得できる各種ランキングも増やしていく予定なのでお楽しみに。
v0.3.0
ワードネットワークグラフを追加する予定です。
v0.1.1現状のネットワークグラフは、検索対象のユーザを中心に他ユーザとの関係性を示したものですが、これに対して単語を検索対象とし、その単語を使うことが多いユーザ間のネットワークグラフを描画できるようにしたいです。
フォロー、フォロワー間やリプライ、いいね間にとらわれない、単語単位でのゆるいつながりを見て楽しめるのではと思っています。
また、形態素解析に用いている辞書をより高性能なものにすることを検討しています。
これにより、より正確なトレンド分析などが行えると思っています。
v1.0.0
本アプリの到達点として、クロス分析機能を取り入れたいと思っています。
例えば、ユーザ全体で見た時にポジティブさとフォロワーの多さには相関があるか? など、ユーザが任意要素を選びそれに対応した散布図などを表示できるようにしたいです。
自分のBlu-lyzerでの目標は、過去のデータの分析結果を単に示すだけではなく、その分析結果を使って、明日こうしてみようとか、あの人と話してみようとか、日々を少しでも楽しんだり変えたりするきっかけにつなげたいということです。
その最終目標として、ユーザ自らがカスタム可能な分析機能を考えました。
仕様を説明します。
興味のない方は、「おわりに」まで飛んじゃってください。
仕様
以下がシステム図です。
Webサーバになるサーバレスホスティング、データ定期更新用の自宅サーバ、データベースの3つから成ります。
以下がシーケンス図です。
処理フローはメイン処理とバックグラウンド処理(サーバレス側、自宅側)に分けられます。順に説明します。
メイン処理
ユーザからのHTTPリクエストに応答する処理フローです。
データベースからの相関図データ取得、相関図連結および整形処理、データベースから解析情報を取得し相関図データに付与、送信までを行っています。
相関図データと言っているのは、あるユーザの他ユーザに対するエンゲージメント情報列です。
具体的には、あるユーザが行ったポスト4000件といいね1000件を、他のユーザごとにリプライ10点、いいね1点で集計し、降順ソートしたものです。
詳細な仕様を列挙します。
データベースにある全ての相関図データの中から、上位60名の中に検索対象ユーザが入っている相関図データを全て取得
この時2つ以上の相関図データが見つからなかった場合は、臨時データ準備として以下を行う
検索対象ユーザについてポスト100件、いいね20件の簡易相関図データを得る
相関図上位6名について同様にポスト100件、いいね20件の簡易相関図データを得る
得られたそれぞれの相関図に対してデータクリップ処理を行う
この時、クリップ後連結処理を行いデータ長が一定のしきい値を超えるか判定し、超えていなければクリップレベルを下げる(相関図に含めるデータを増やす)。これを数回繰り返す
クリップ後の相関図データを連結、重複除去を行い整形
解析データを相関図データにアタッチし、送信
バックグラウンド処理(サーバレス)
サーバレスホスティング環境でユーザリクエスト後に裏で走るフローです。
検索対象ユーザの相関図生成、周辺ユーザ6名の相関図生成、検索対象ユーザのデータ解析、周辺ユーザ20名のデータ解析を行い、結果をデータベースに格納します。
相関図生成については先に述べた通りなので、ここではユーザデータ解析について詳細仕様を述べます。
ユーザごとにポスト100件、いいね100件が解析対象データ
解析対象データから解析データを得る(特に自然言語処理について以下に記載する)
ユーザポストに対してIPA辞書を使用して形態素解析を実施
名詞のみを抽出、回数を記録
抽出した名詞に対して日本語評価極性辞書による感情分析を実施
単語がポストされた時間と、頻出回数または感情分析値を組み合わせて、1日を24で区切ったヒートマップのデータを得る
なお前回更新から時間が経過していない場合はデータ更新しない
バックグラウンド処理(すいばり自宅)
自宅サーバで定期実行するフローです。
Blu-lyzer全ユーザからランダムに選んだ5000人に対して、サーバレス環境と同様のユーザデータ解析と、トレンドランキングデータ(未リリース)の集計を行い、結果をデータベースに格納します。
ちなみに、Blu-lyzer全ユーザとは、Blu-lyzerの使用有無ではなく、データベースに記録されたユーザという意味です。
これまで述べた通り、仕組み上検索したユーザの周辺ユーザに対してもデータ取得解析が行われるので、Blu-lyzerを使っていなくても誰かの検索に巻き込まれてデータベースに格納されることはありえるためです。
更新対象5000人としたのは何となくです。
ちなみに1度の更新に2~3時間かかります。
ユーザデータ解析はサーバレス環境と同様です。
トレンドランキング集計は、いったん割愛します。
ちなみに、ユーザデータ解析は1日に1回、トレンドランキング集計は1日に4回定期実行が行われます。
本アプリはオープンソースですので、最後にGitHubリポジトリを貼ります。
おわりに
こういったSNSのポスト分析とグラフィカル表示は今は亡きTwitter時代から興味があり、夢でした。
当時は自分の技術力不足(もちろん今もです)やTwitterの厳しいレートリミット制限で、できないことが多かったです。
こういった背景があるので、まだまだ途中ではありますが、Blu-lyzerを形にできたことが感無量です。
Bluesky APIの凄まじいまでのレートリミットの緩さ、Blueskyの皆さんとの交流によるモチベーションアップ、AIによるサポート。
これらがそろって、ずっとやりたかったことを7年越しに実現できました。
本当にありがとうございます!
正直ドキュメントより、もう早く開発継続したくてしょうがないので、ここで終わらせてください!
ばいびー!