twitterのDMをk-meansでクラスタリングする

以前Twitter APIの利用申請をしたところ、
rejectされてしまったので(今のところ同一アカウントでは再申請不可)、
今回は、データダウンロードをして、DMの内容を文書クラスタリングしてみることにした。

DMのデータダウンロード

まずは、設定→アカウント→データのアーカイブをダウンロード
からデータのアーカイブをリクエストする。

するとパスワードの入力を求められるので、パスワードを入力する。

 入力すると携帯のSMSに認証パスワードが届くので、それを入力する。
 すると以下の状態になるので、アーカイブをリクエストをクリックする。

リクエスト後は、およそ1日くらいで完了通知がくるので、
リクエストしたページからファイルをダウンロードする。

アーカイブの中身

ダウンロードしたアーカイブの中身は以下のようになっている。

今回の解析対象のDMデータはdataフォルダの中にある。

jsファイルになっているが、中身はjsonで書かれている。
direct-message.js 個別DM
direct-message-group.js グループDM
で、個人、グループでファイルがわかれている。

direct-message-group.js

今回は、グループDMの内容を解析する。

jsonの構成は以下のようになっている。

  • dmConversation
    グループDM単位のルート
  • messages[]
    グループでのメッセージ単位の配列
  • text
    メッセージ本文

今回のtextを解析対象とする。
(ID情報はマスクしてある。)

クラスタリングまでの流れ

  1. direct-message-group.jsを開く
  2. mecabで形態素解析をして、単語ごとにスペースで区切ったものを、textごとに配列にする
  3. 2でできたものをtfidfを重みとしてベクトル化する
  4. あらかじめ決めたクラスタ数でk-meansでクラスタリングする
  5. プロットするために、データのベクトル情報を二次元に圧縮する
  6. クラスタごとに上位5位までの重みの単語を可視化する

以上の流れに沿って、Pythonで実装する。

1.direct-message-group.jsを開く

direct-message-group.jsを開いて、jsonファイルとして読み込む。

2.mecabで形態素解析をする

mecabは、オープンソースの形態素解析用のエンジンで、辞書にはIPADICを用いた。

先述したように、DMへの投稿はmessages配列にすべて入っているのでを抽出し、
さらにその中からtextを1投稿ずつ形態素解析する。

parseToNode()メソッドにより、node.surfaceで形態素解析された単語を取得できる。
node.nextで、sentenceに格納されていてる文章の終わりまでループする。
解析された文章は、単語をスペースで区切り最終的には下記のようになる。

3.tfidfを重みとしてベクトル化する

fit_transformメソッドを用いて、文書をtf-idf行列に変換する。

4.k-meansでクラスタリングする

3.での特徴量をもとにk-meansでクラスタリングを行う。
k-meansの場合、クラスタ数をあらかじめ設定する必要がある。
今回はクラスタ数を30に設定して、クラスタリングを行った。

5.データのベクトル情報を二次元に圧縮する

クラスタリングした情報を可視化するために、
データのベクトル情報を二次元に圧縮する。

6.クラスタごとに上位5位までの重みの単語を可視化する

クラスタの中心を降順でソートしインデックス番号を取得する。
出現した単語の情報をget_feature_names()で取得する。

可視化した情報は下記のようになる。
(左下にクラスタが密集しすぎて見にくくなってしまった。。)

参考

Pythonで機械学習はじめました クラスタリング&次元圧縮&可視化編
MeCabを使って、テキスト中に含まれる品詞をカウントしてみよう!
Pythonでテキストをクラスタリング

コメント

タイトルとURLをコピーしました