どこでも見れるメモ帳

とあるSEの備忘録。何かあれば気軽にコメントください〜

はてブのタグ付けを因果ネットワークで表示してみた(個人版)

はじめに

個人の興味の移ろいを、タグ付けの因果*1で視覚化できるのでは?と思い、試してみました。
今回も自分自身の「はてブ」で試しました。

視覚化までの流れ

こちら(イベントの時系列分析による因果関係知識の獲得)を参考にアレンジして実装してみました。

流れを簡単にまとめると、次の通りです。

  1. タグ付け系列を生成*2
  2. タグ付け系列を、Kleinbergのバースト系列(列挙型)で連続化 https://github.com/KenshoFujisaki/AnalyseHatenaBookmarkTagSeries/raw/master/img/burst.png
  3. 連続化したタグ付け系列の全ペアについて、タグ間に因果関係が存在するかGranger因果検定でテスト
  4. テスト通過したタグ付け系列ペアについて、ネットワークで因果関係を描画 https://github.com/KenshoFujisaki/AnalyseHatenaBookmarkTagSeries/raw/master/img/granger_small.png もっとたくさん表示した場合*3https://github.com/KenshoFujisaki/AnalyseHatenaBookmarkTagSeries/raw/master/img/granger_large.png

結果について

なんだかそれっぽい因果もあるように見えますが、うーん…微妙。
微妙な理由を挙げてみると、次の通りです。

  1. 「まとめ」や「twitter」といった、興味対象自体ではないタグが邪魔する*4
  2. 個人だとデータ量が少なすぎて、バースト系列が信頼できない*5
  3. Granger因果検定が正しく動作しているのか謎

改善案として、以下を考えています。
しかし、いずれの改善策も厳し目な印象です。

  1. ネットワーク次数が高すぎるタグは除去する*6
  2. タグでなく、Webページの本文も使う*7
  3. 第三者変数による影響を考慮する*8

おわりに

いろいろと思考錯誤した割に、単純な共起ネットワーク*9よりも結果が微妙だった*10ので、
なんとも煮え切らない気持ちになりました。
同じ方針*11だと興味推移を捉えるのは難しそうなので、次は別の方針で行きたいと思います。
以前試したDynamic Topic Model(以下リンク)のほうが今回よりは良かったので、次は再度トピックモデル関係の手法で試してみようかな*12と思います。 github.com

今回作ったスクリプトGitHubにアップしました。
github.com

関連記事

ni66ling.hatenadiary.jp

ni66ling.hatenadiary.jp

ni66ling.hatenadiary.jp

*1:タグ付けの因果とは、例えば、Xタグを付けると、Yタグを付ける傾向があり、また、Yタグを付けると、Zタグを付ける傾向があるとします。このとき、X→Y→Zというタグ付けの因果が生じているとします。具体例で言うと、DeepLearning→RNN→LSTMなど。

*2:タグそれぞれについて、そのタグを付けたWebページの通し番号を取得。この通し番号を時刻とみなします。

*3:表示の閾値を緩めた場合

*4:「まとめ」や「twitter」といったタグを媒介すれば、あらゆるタグに到達できてしまう。興味の移ろいを見たい、というそもそもの意図からずれてしまう。

*5:特定のタグを100回、1000回と多く使うことはなく、数回程度であるため、多くのタグ付け系列は「バーストなにそれ?」状態になってしまう

*6:本当に次数が高いタグも除去するとマズいのですが…

*7:これだとトピックモデルを使ったほうが良いですよね…

*8:改善手法である偏Granger因果検定も試してみました。しかし、結果はこちらも微妙でした。

*9:関連記事をご参照ください。

*10:因果関係は取れませんが

*11:バースト系列+因果検定

*12:こちらの手法(Continuous-time Infinite Dynamic Topic Models)が気になっています。トピック数自動決定/連続時間のDTMらしいです。なんか強そう

はてブの共起タグをネットワーク表示してみた(大規模版)

はじめに

はてブの共起タグをネットワークを表示してみました。

下図は、「機械学習」タグがついたWebページをほぼ全て取得し、「機械学習」タグと一緒についているタグをGephiでネットワーク表示してみたものです。*1
「機械学習」タグまわりの共起タグ

また、流行りの「deep learning」タグまわりの共起タグだけピックアップして表示すると、このような感じです。 「deep learning」タグ周りの共起タグ

このように表示することで、「機械学習」の広がりをパッと確認できて、面白いですよね。*2

別例で

同様に「エロ」タグまわりの共起タグをネットワーク表示してみました。*3 「エロ」タグ全体

また、せっかくなので、コミュニティ分析でクラスタリングしてみたところ、以下のように分類できました。 「画像・フェチ」クラスタ 「ニュース・日本」クラスタ 「ジェンダー」クラスタ 「ビジネス・テクノロジ」クラスタ

なんだかそれっぽい感じ!
ふむふむ、思っていたよりも幅のあるタグが一緒に付けられてる印象がします。

おわりに

にしても、Gephiがすごいです!想像してたよりもビックリするくらい手軽に色々できました*4
今後も、機会があれば積極的に使っていこうと思います。

今回作ったスクリプトGitHubにアップしておきます。 github.com

関連記事

ni66ling.hatenadiary.jp

*1:画像は結構高画質なので、画像だけで表示すれば、タグ名もギリギリ見えるはず

*2:性能の問題で、表示数を閾値で切ってますが、全部出してみるともっと面白そう

*3:みんな、どんなタグを一緒に付けているのかなぁと気になって

*4:クラスタリングとか、各種レイアウトアルゴリズムとか、各種中心性算出とか…

はてブの共起タグをネットワーク表示するには(個人版)

はじめに

はてブのタグについて,共起タグを取得し,ネットワーク表示する方法を簡単に記します.
環境はMacOSXFirefox, はてブ拡張アドオンインストール済とします. f:id:ni66ling:20151108220709p:plain

共起頻度が3回以上のタグ組み合わせをネットワーク表示

共起タグの取得

$ echo "tagA,tagB,freq" > cooccur.csv
$ sqlite3 -cmd \
    "select 
      T.name, 
      CT.name, 
      count(CT.name) 
    from tags T 
      left join tags CT 
        on T.bookmark_id = CT.bookmark_id 
          and T.id != CT.id 
    where T.name > CT.name 
    group by T.name, CT.name 
    having count(CT.name) >= 3
    order by T.name, CT.name;" \
    /Users/[username]/Library/Application\ Support/Firefox/Profiles/[hash].default/hatenabookmark/[hatenabookmark_id]/bookmark.sqlite </dev/null \
    | tr '|' ',' \
    >> cooccur.csv

共起ネットワークの作成

$ R
library(igraph)
csvdata <- read.csv("./cooccur.csv", head = T)
graphdata <- graph.data.frame(csvdata, directed = F)
tkplot(
  graphdata, 
  vertex.label=V(graphdata)$name, 
  canvas.width = 1200, 
  canvas.height = 700, 
  vertex.size = 0, 
  edge.width=E(graphdata)$freq/4)

結果のグラフは,上図の通り.

おまけ:タグ"Javascript"の共起タグを上位10件取得

$ sqlite3 -cmd \
    "select
      CT.name,
      count(CT.name)
    from tags T
      left join tags CT 
        on T.bookmark_id = CT.bookmark_id 
          and T.id != CT.id 
    where T.name = \"Javascript\" 
    group by CT.name 
    order by count(CT.name) desc
    limit 10;" \
    /Users/[username]/Library/Application\ Support/Firefox/Profiles/[hash].default/hatenabookmark/[hatenabookmark_id]/bookmark.sqlite </dev/null
# 例)
# node.js|28
# html5|17
# firefox|15
# jQuery|15
# tips|14
# 開発|13
# programming|12
# まとめ|12
# ajax|11
# dom|11

参考

マージコミットを含む大きめのgitブランチをcherry-pickで別ブランチに持っていくには

はじめに

f:id:ni66ling:20150726174614p:plain:w500
マージコミットを含む大きめのgitブランチを,別のブランチに持って行きたい状況が発生したのでメモ*1
取り込みたいブランチを1コミットにまとめ,これを取り込み先ブランチにcherry-pickマージする方法を記す*2
なお,複数コミットを1コミットにまとめる方法について,一般にはgit rebaseでsquashやfixupを用いることが多い*3が,マージコミットに対してはうまくいかなかった*4
そこで,ここでは取り込みたいブランチについて差分パッチを作成し適用するという方法をとった.

やりかた

# Xを1コミットにまとめるための一時的なブランチ(B_dummy)を作成
git checkout A1
git checkout -b B_dummy

# B1〜B3をパッチ化(参考[3])
git diff --binary A1..B3 > X.patch

# パッチをB_dummyにあて(参考[4]),B1〜B3を1コミット(=X)にまとめる
git apply X.patch
git add [target files]
git rm [target files]
git commit -m 'this is X: patch A1..B3'

# 別ブランチA'1に移動し,トピックブランチB'を作成し,Xをcherry-pickで持ってくる
git checkout A'1
git checkout -b B'
git cherry-pick X

参考

*1:ある機能セットを別プロジェクトのリポジトリに適用したいとか,エンタープライズ系で個別カスタマイズを一式持って行きたいとか,そういう状況

*2:以前は純粋にcherry-pickマージのみで行っていた.でもこれだとcherry-pick対象のリビジョン数が数百,数千になると,同じ箇所で生じるコンフリクト解消が地味にシンドかった

*3:参考[1]

*4:git rebaseのオプションで--interactiveと--preserve-mergesを併用し,その中でsquash/fixupを行うとエラーが生じてしまう.参考[2]

Poderosaでコマンド実行結果をクリップボードにコピーするには

はじめに

f:id:ni66ling:20150725191724p:plain:w400
Poderosaには,コマンド実行結果をPoderosa実行元(ローカル)のクリップボードにコピーする機能があります.
これでファイルをcatしてクリップボードにコピーとか,ディレクトリ構成をtreeしてコピーとかできます.便利!

やりかた

  1. コマンド実行時,Enterキーを入力する代わりにCtrl+,キーを入力
  2. するとポップアップメニューがでますので「コマンド結果をコピー(C)」を選択

Ctrl+,でポップアップが出ない?

Ctrl+,キーバインドされているみたいなのですが,私の環境では適切に動作できませんでした.
キーバインドを変更することで,適切にポップアップメニューが表示できるようになりました.

f:id:ni66ling:20150725191740p:plain:w600

  1. ツール > 詳細プリファレンスエディタ を選択
  2. フィルタに「org.poderosa.terminalemulator.commandPopupKey」を入力
  3. 項目をダブルクリックし,値を「Ctrl+Oemcomma」から変更(例えば「Ctrl+Shift+C」など)

参考