ゼミの夏期課題の話
はじめに
今日も暑いですね。夏休みに頑張っていたゼミ課題の話をします。
春学期は指定された教科書を使ってR言語に触れていました。
課題は「Rでオリジナルのデータを扱う。」ということで、Twitterのデータを取得して遊びました。
- 作者: 金明哲
- 出版社/メーカー: 森北出版
- 発売日: 2017/03/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
動機
Twitterを使おうということは早い段階から決めていました。 自分はTwitterのリスト機能をよく利用するのですが、極度の面倒くさがりなので、
リストにユーザー追加を自動化したい
ツイートを見ずに概要を把握したい
という動機に基づいて「フォローユーザーのクラスタ分析」及び「ツイートの形態素解析」を行いました。
手法
フォローユーザーを分類するための手法として2パターン考えました。
順番に手順と結果を述べていきます。
ツイートの傾向で判別する
手順
1. データを収集する
タイムラインのツイートを1週間分遡って取得しました。
TwitterRを使う手もあったのですが、慣れていたのもあってpython3+Tweepyでタイムラインのツイート収集を行いました。
2. Rで形態素解析
取得したツイートから名詞に絞って形態素解析を行います。
RMeCabに含まれる関数、docMatrix()を用いました。
library(RMeCab)
data<-docMatrix("data/",pos=c("名詞"))
data.d<-dist(t(data))
clust<-hclust(d=data.d)
plot(clust)
3. 返り値をplotする
- デンドログラムに表しました(結果を黒塗りにしています)。
結論
上の図のようにうまくいきませんでした。原因として、
フォローしている人同士の話題が近く、違うカテゴリに入れたい人が似たような話をしている
あまりツイートが少ない人は分析が行いづらい
等が挙げられると思います。
ユーザー同士につながり(フォロー関係)があるかどうかで判別
手順
1. データを収集する
自分のフォローしたユーザーそれぞれについてフォローしているユーザーの情報を収集しました。
データの収集はpython3+Tweepyで行いました。
2. Rでネットワーク分析
自分がフォローしているユーザーについて、フォロー関係の有無を調べました。
パッケージのigraphを用いて、コミュニティ分析を行いました。分割には辺媒介性分割を用いました。
library(igraph)
d <- read.table("clustdata.txt")
g <- graph.data.frame(d,directed = FALSE)
plot(g, vertex.label="",vertex.size=10)
eb <- edge.betweenness.community(g)
V(g)$color <- eb$membership
plot(g,vertex.label="",vertex.size=10)
結果
先ほどよりも良い感じに分かれているような気がします。
それぞれに名前を付けると多少誤差はあるものの、以下のようになりました
A(緑) 先輩、教授などFMS関連の人
B(黄橙) 他のクラスタに含まれなかった人(デザイナーさんやbot)
C(赤橙) 学外の友人(オタク)
D(濃青) 高校の友人とbot
E(薄青) 後輩(5期生)
F(黄) 同期(4期生)
クラスタ内のトレンドを取得
フォロー関係でのクラスタ分析がうまくいった(主観)ので、当初の目標だったトレンド取得をします。
手順
1.クラスタ内のユーザーをリストに登録
eb1<-RMeCabFreq("eb1.txt")
eb1<-eb1[eb1$Info1=="名詞",]
eb1<-eb1[eb1$Info2=="一般"|eb1$Info2=="固有名詞",]
eb1<-eb1[order(eb1$Freq,decreasing = T),]
2.成形したデータを用いてリストを作成
https://github.com/aukkeyikon/list_share/addListUser_fromText.py
3.リスト内のタイムラインを取得
4.取得したデータから頻度分析
eb1<-RMeCabFreq("eb1.txt")
eb1<-eb1[eb1$Info1=="名詞",]
eb1<-eb1[eb1$Info2=="一般"|eb1$Info2=="固有名詞",]
eb1<-eb1[order(eb1$Freq,decreasing = T),]
結果
A | B | C | D | E | F |
---|---|---|---|---|---|
オタク | 自分 | 人 | 口座 | S | 成績 |
自分 | 人 | たより | 残高 | バイト | GPA |
人 | メッキ | イケ | 気 | 先生 | バイト |
感じ | 大人 | 自分 | 笑 | GPA | 基礎 |
あと | グラブル | 余裕 | 中野 | 自分 |
結果がわかりやすいように大学の成績発表の日程にトレンド取得しました。
以上の内容をゼミ合宿で発表したところ、教授からTF-IDF法について調べてはどうかという話がありました。
TF-IDF法を利用したトレンド抽出
当初提案された使い道は、グループ内の共通要素の削除でしたが、最終的に全トレンド要素が失われてしまいました。
原因としてはデータが少なかったためにトレンドも共通要素に含まれてしまったことが挙げられます。
そこで、データ数を補うためにも、全グループに共通する要素を削除します。
data<- as.data.frame( docMatrix( "作業用ディレクトリ", pos=("名詞"), weight = "tf*idf" ) )
ここで抽出されたデータ上位20件をクラスタ別の頻度分析用のデータから除外しました。
結果
A | B | C | D | E | F |
---|---|---|---|---|---|
シナリオ | メッキ | イケ | 入金 | 統計 | 基礎 |
ポスター | 自分 | たより | 君 | GPA | 成績 |
オタク | 信頼 | ショット | 口座 | S | 去年 |
人 | 映像 | セカンド | 残高 | 概論 | GPA |
スタフィー | 人 | 日 | 油田 | 中野 | 自分 |
先ほどよりも話している内容が想像できそうなトレンドになりました。
B,Cのグループについては個々人のツイートの頻度が少ないこともあって、特定のbot*1*2の影響が強くなっています。
まとめのようなポエム
ツイートの取得限界(APIでは1週間分)もあって、なかなか思うようにデータを取ることができませんでした。
時報のように「今何が話題だよ」と通知させる機構なども考えていたのですが、思ったよりも皆がツイートをしていないことを知りました。
夏休みの宿題、遅くなってしまいましたがこれにて完了です。