はてブのタグ付けを因果ネットワークで表示してみた(個人版)
はじめに
個人の興味の移ろいを、タグ付けの因果*1で視覚化できるのでは?と思い、試してみました。
今回も自分自身の「はてブ」で試しました。
視覚化までの流れ
こちら(イベントの時系列分析による因果関係知識の獲得)を参考にアレンジして実装してみました。
流れを簡単にまとめると、次の通りです。
- タグ付け系列を生成*2
- タグ付け系列を、Kleinbergのバースト系列(列挙型)で連続化
- 連続化したタグ付け系列の全ペアについて、タグ間に因果関係が存在するかGranger因果検定でテスト
- テスト通過したタグ付け系列ペアについて、ネットワークで因果関係を描画 もっとたくさん表示した場合*3:
結果について
なんだかそれっぽい因果もあるように見えますが、うーん…微妙。
微妙な理由を挙げてみると、次の通りです。
改善案として、以下を考えています。
しかし、いずれの改善策も厳し目な印象です。
おわりに
いろいろと思考錯誤した割に、単純な共起ネットワーク*9よりも結果が微妙だった*10ので、
なんとも煮え切らない気持ちになりました。
同じ方針*11だと興味推移を捉えるのは難しそうなので、次は別の方針で行きたいと思います。
以前試したDynamic Topic Model(以下リンク)のほうが今回よりは良かったので、次は再度トピックモデル関係の手法で試してみようかな*12と思います。
github.com
今回作ったスクリプトはGitHubにアップしました。
github.com
関連記事
*1:タグ付けの因果とは、例えば、Xタグを付けると、Yタグを付ける傾向があり、また、Yタグを付けると、Zタグを付ける傾向があるとします。このとき、X→Y→Zというタグ付けの因果が生じているとします。具体例で言うと、DeepLearning→RNN→LSTMなど。
*2:タグそれぞれについて、そのタグを付けたWebページの通し番号を取得。この通し番号を時刻とみなします。
*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」タグまわりの共起タグだけピックアップして表示すると、このような感じです。
このように表示することで、「機械学習」の広がりをパッと確認できて、面白いですよね。*2
別例で
同様に「エロ」タグまわりの共起タグをネットワーク表示してみました。*3
また、せっかくなので、コミュニティ分析でクラスタリングしてみたところ、以下のように分類できました。
なんだかそれっぽい感じ!
ふむふむ、思っていたよりも幅のあるタグが一緒に付けられてる印象がします。
おわりに
にしても、Gephiがすごいです!想像してたよりもビックリするくらい手軽に色々できました*4。
今後も、機会があれば積極的に使っていこうと思います。
今回作ったスクリプトをGitHubにアップしておきます。 github.com
関連記事
はてブの共起タグをネットワーク表示するには(個人版)
はじめに
はてブのタグについて,共起タグを取得し,ネットワーク表示する方法を簡単に記します.
環境はMacOSX,Firefox, はてブ拡張アドオンインストール済とします.
共起頻度が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で別ブランチに持っていくには
はじめに
マージコミットを含む大きめの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] git rebase -i はやっぱりイケてる件【git】【rebase 】【iオプション】 - DRYな備忘録 - http://otiai10.hatenablog.com/entry/2012/11/10/013925
- [2] git rebase interactive: squash merge commits together - Stack Overflow - http://stackoverflow.com/questions/1725708/git-rebase-interactive-squash-merge-commits-together
- [3] gitで差分を抽出してpatchで使えるファイルを生成 | 秋山ブログ - http://d.akiroom.com/2013-10/git-diff-extract-patch/
- [4] Git - プロジェクトの運営 - https://git-scm.com/book/ja/v1/Git-%E3%81%A7%E3%81%AE%E5%88%86%E6%95%A3%E4%BD%9C%E6%A5%AD-%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E9%81%8B%E5%96%B6#%E3%83%A1%E3%83%BC%E3%83%AB%E3%81%A7%E5%8F%97%E3%81%91%E5%8F%96%E3%81%A3%E3%81%9F%E3%83%91%E3%83%83%E3%83%81%E3%81%AE%E9%81%A9%E7%94%A8
Poderosaでコマンド実行結果をクリップボードにコピーするには
はじめに
Poderosaには,コマンド実行結果をPoderosa実行元(ローカル)のクリップボードにコピーする機能があります.
これでファイルをcat
してクリップボードにコピーとか,ディレクトリ構成をtree
してコピーとかできます.便利!
やりかた
- コマンド実行時,Enterキーを入力する代わりに
Ctrl+,
キーを入力 - するとポップアップメニューがでますので「コマンド結果をコピー(C)」を選択
Ctrl+,
でポップアップが出ない?
Ctrl+,
にキーバインドされているみたいなのですが,私の環境では適切に動作できませんでした.
キーバインドを変更することで,適切にポップアップメニューが表示できるようになりました.
- ツール > 詳細プリファレンスエディタ を選択
- フィルタに「org.poderosa.terminalemulator.commandPopupKey」を入力
- 項目をダブルクリックし,値を「Ctrl+Oemcomma」から変更(例えば「Ctrl+Shift+C」など)