読者です 読者をやめる 読者になる 読者になる

どこでも見れるメモ帳

ちょっとした備忘録を無秩序に投稿します.気軽にコメントください^^

Gitリポジトリを移行するには?

f:id:ni66ling:20170409154640p:plain

はじめに

Gitホスティングサービスを、GitLabからBitBucketへ移行する必要があったのでメモです。
移行対象は、単純にリポジトリのみとします。*1

やりかた

1.移行先の空リポジトリを作成します。*2
2.移行元のリポジトリをベアリポジトリとしてクローンします。

git clone --mirror [移行元リポジトリのURL]

3.移行先のリポジトリをリモート(ここではdestination)に追加します。

cd [リポジトリ名] 
git remote add destination [移行先リポジトリのURL]

4.移行先リポジトリに反映します。

git push destination master
git push --mirror destination 

補足: 移行後に移行元のリポジトリにコミットしてしまったら?

あとから同期をとるには、次の手順を踏めばOK!

cd [リポジトリ名]
git fetch --all
git push destination --mirror

*1:GitLabにおけるマージリクエストを、BitBucketにおけるプルリクエストにマッピングする方法は分かりません。

*2:BitBucketの場合、画面から空リポジトリを作成

EvernoteのWebクリッピング的な本文抽出を自前で行うには?

はじめに

f:id:ni66ling:20160531161149p:plain

EvernoteのWebクリッピング機能便利ですね。
それと同じようなことを自前でできないか試してみました。

方針

  • Webページに対する本文抽出は、こちらのモジュールを利用*1
  • 上記モジュールは、HTMLタグもすべて取っ払うため、HTMLタグは残すように修正*2
  • 処理対象のWebページについて、文字コードがマチマチで落ちるので、例外処理を追加

試してみる

上の方針に従って、スクリプト作成しました。 github.com

ruby*3が入っていれば、git cloneして以下を実行すれば、Webクリッピングできるはずです。

ruby web_clip.rb [URL]

ちなみに、先頭画像は以下で作成しています。

ruby web_clip.rb http://ni66ling.hatenadiary.jp/entry/2015/06/25/013640

おわりに

最近Evernoteを使い始めて、はてブとの連携がすごく便利*4だと気付きました。
ただ残念なことに、過去にブックマークしたWebページは、Evernoteに一括移行することができないんですね。*5
そこで、過去ブックマークをEvernoteに一括移行できないかと調査しはじめたところです。
これから、Evernote APIとやらを用いて、自動でノートを作成できるように試してみたいと思います。*6

*1:ちなみに、ChromeにおけるEvernoteWebクリッピングは、はてブのモジュールが使われているんだとか。http://meme.efcl.info/2011/05/evernote-chromehatena-extract-content.html

*2:http://xoyip.hatenablog.com/entry/2014/03/08/204704

*3:バージョン1.9以降

*4:魚拓的意味です。数年前にはてブ登録した記事がいまだと読めない…ってことが最近よく起きるようになっていて。それで手軽に魚拓できて素晴らしい!と。

*5:結構ググったのですが、うまく見つけられず…。

*6:QiitaからEvernoteに移行するスクリプトを見つけたので、なんとか作れるんじゃないかなぁと思ってます。https://github.com/yasuhiroki/qiita-to-evernote

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

はじめに

個人の興味の移ろいを、タグ付けの因果*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

参考