病みつきエンジニアブログ

機械学習、Python、Scala、JavaScript、などなど

教師なしLDAでTwitterのスパム判別をしてみる(予備実験編)

※普通は「教師なしLDA」という言い方はしないです

モチベーション

元々は、TwitterからURLつきのツイートを取りたかった。某ニュースアプリがTwitter上で(?)話題になっているニュース記事を(法的な是非があるとはいえ)配信しており、そんな感じのマイニングがしたかった。

ただ、普通に「http,https」でTwitter上で検索すると、量が膨大だった。加えて、ほとんどがスパム。なーにが「このサイトすごすぎwwwww」じゃ。

f:id:yamitzky:20140216225341p:plain

ということで、検索の段階でスパミーなキーワードを取り除き、純度の高いURL投稿マイニングをしたいわけだが、キーワードは既知なものには限らない。例えば「無料」とか「アフィリエイト」とかがスパムなのはそうなんだけど、「パズドラ」とか「魔法石」とか、未知のキーワードとか出てきた時に対応できない。

そこで、教師なし学習のアプローチを使って、スパムなキーワードを抽出する、ということを目的として、実験を行った。

モデル

モデルは、latent Dirichlet allocation(以下、LDA)[1]を使った。LDA自体の説明は、星の数ほどあるので、ここではほぼ行わない。

LDAでは、「文書には潜在的なトピックがある。潜在的なトピックは、単語を生成する」というような生成過程を踏む。逆に言うと、「ある文書に、ある単語が出やすいのは、そこに潜在的なトピックがあるからだ」とも言える。

具体的な例を出すと、「無料レポート:インフォゼロのアフィリエイトで月収40万円と月9万円の不労所得を構築した方法」というツイートは、その背後に「スパム」というトピックが存在するからだ、とする。逆に言うと、「スパム」というトピックを持つ文書は、「アフィリエイト」みたいな単語を生成しやすいはず。

ちなみに、LDAを使って得られるものは、簡潔に2つある。「文書ごとのトピック分布」と「トピックごとの単語分布」だ。

「とりあえずLDA」を使って学習してみて、スパムなトピックが学習できるか、そして、そのトピックから特徴的な単語を炙り出せるか、を確かめる。今回は予備実験として、トピックの出方を確認してみて、スパムなトピックが決定づけられそうかを見てみる。

前処理

各ツイートを、MeCabを使ったりして次のように単語分割した。

無料レポート:インフォゼロのアフィリエイトで月収40万円と月9万円の不労所得を構築した方法 http://t.co/****** #followmejp #goen

が元のツイートだとした場合、

無料 レポート : インフォゼロ の アフィリエイト で 月収 4 0 万 円 と 月 9 万 円 の 不労所得 を 構築 し た 方法 example.com #followmejp #goen

つまり、「通常の単語」+「URLを展開してドメイン部を取り出したもの」+「ハッシュタグ」を、文書=単語列とした(語順は関係ないのだが、先にURLとハッシュタグを除いてから形態素解析しているので、形態素解析が失敗している可能性あり)。

実験設定

プログラムは、自分で実装したLDA使ってもよかったんだけど、多分遅いので、GibbsLDA++を使った。実験設定は以下。

  • 文書数:50,919ぐらい
  • トピック数:100
  • 学習回数:20,000
  • α:50 / トピック数
  • β:0.1

注意点として、

  • トピック数は少なすぎるとうまくいかない
  • 学習回数は多すぎるかも(多すぎて困ることはない。perplexityの確認はしていない)
  • α、βはデフォルトのパラメータ

LDAとツイート収集以外のソースは、全てgithub上に置いた

実験結果

結果はgithub上に置いた。これは、トピックごとの単語分布\phiのうち、頻出上位30件を書いたもの。

多分、そもそもスパムが多すぎて、トピックがスパムばっかなんだけど、特徴的なものもいくつか。

例えば、30番目のトピックは、

で を 自動 ツイッター bit.ly フォロワー 方法 収入 万

ということで、スパムっぽいトピック。45番目とか51番目とかのトピックは、

に bit.ly 裏 と 無限 ワザ 4 手 アイテム 最強

~ bit.ly の を で た 報酬 ん アフィリエイト

と、bit.lyみたいな短縮URLは、スパムっぽい傾向があることがつかめる。

逆に、42番目のトピックを見ると、

bit.ly → 無料 プレ #ニュース ソチ 五輪 ( #スポーツ 「

と、ソチの話題にも関わらず、bit.lyとか、「無料」とか、キーワードの誤爆が出てきそう。

また、

まし fb.me 写真 し 投稿 新しい Facebook

(@ 4sq.com ) 店 pic ]: [ ))

 r.gnavi.co.jp   の … goo.gl  店 。 な : 味 ランチ

とか、ドメイン名とトピックが結構関係するというのも、狙い通り。

あと、意外だったのが、stopwordsがスパムトピックの上位に残ってしまっている。本来なら、stopwordのトピックが作られてほしかった。ここらへんは、ツイートという性質の問題かもしれない。

【追記】実験その2

コメント欄でid:Kesinにぐぅ正論なアドバイスをいただいたので、再実験した。

前処理として、語彙を「名詞(おそらく記号含む)」「動詞(原形)」とハッシュタグ、URLのみに制限した。すなわち、

無料レポート:インフォゼロのアフィリエイトで月収40万円と月9万円の不労所得を構築した方法 http://t.co/****** #followmejp #goen

が元のツイートだとした場合、

無料 レポート : インフォゼロ アフィリエイト 月収 4 0 万 円 月 9 万 円 不労所得 構築 する 方法 example.com #followmejp #goen

となる。

【追記】実験結果その2

結果はgithub上に置いた

登録 ポイント 獲得 中 小遣い ギフト 券 キャンペーン

] [ 楽天 a.r10.to #RakutenIchiba ゚ 送料 #ダイエット

♡ bit.ly 女性 完全 , 4 限定 友達 ここ 今

する フォロー 方法 ツイッター bit.ly アカウント 自動 つぶやき

ここらへんなど、スパムっぽいトピックは同様に出現している。特に顕著なのが、定性的な解釈がしやすくなったことだ。マイニングで定性的に確認したいという場合は特に、ちゃんとstopwordsが取り除かれるようにしたほうがいいかもしれない。

ただ、単語分布を素性として扱うと考えると、どっちがいいのかは今のところわからないので、後々の検証の余地がある。

結論

以上から、スパムなトピックは学習できてるっぽい(ここはそんなにかっちりした結論はいらない)。

Future work

今後やろうと考えているのは、

  • ツイートのスパム分類(寄り道)
  • スパムキーワードの学習(本丸)

あとは、biterm topic model[2]みたいな、短文向けのトピックモデルも提案されているので(※読んだことない)、こちらを使ってみるのも面白いかもしれない(けど、あまり興味ないので、誰か!)

モチベーション2

ビジネス的要件で、何かを判別しましょう、機械学習しましょう、とすると、結構教師あり学習でーSVMでーみたいな流れになるような気がする。もしくはRandom Forestでー、みたいな。

この理由は、使いやすくて、使われてきたから、だと思う(違ったらごめんなさい)。

でも、LDAみたいな教師なし学習・生成モデルも結構簡単に実験できる。ので、カジュアルに使ってみても面白いんじゃないかなーと思ったり。

参考文献

  • [1] Blei, David M., Andrew Y. Ng, and Michael I. Jordan. "Latent dirichlet allocation." the Journal of machine Learning research 3 (2003): 993-1022.(PDF)
  • [2] Yan, Xiaohui, et al. "A biterm topic model for short texts." Proceedings of the 22nd international conference on World Wide Web. International World Wide Web Conferences Steering Committee, 2013.(PDF)

OpenBLASを使うと、multiprocessingが使えない?

numpy/scipyは、別に全ての演算がpythonで実装されているわけではなくて、内部的にはBLASとかを呼び出している(多分)。で、普通だったらATLASのようなBLAS実装が使われると思うんだけど、それだと遅いからOpenBLASみたいなBLAS実装を使いたかったりする。(参考:Atsushi TATSUMA Web Page » OpenBLAS を使った Numpy/Scipy のビルド)

で、確かにOpenBLASによって一部の行列演算が早くなる。なぜかというとマルチコアの力を使ってくれるから。

しかし困ったことに

import scipy.sparse.linalg

しただけで、multiprocessingを使った並列処理ができなくなってしまった。コア数とかは

import multiprocessing
multiprocessing.cpu_count() # 16

みたいな感じでマルチコア風なんだけど、実際に動かしてみると、1つのCPUの中で並列処理することになる。調べてみると、OpenBLASはmultiprocessingを使えなくしてしまう、みたいな記述がいくつか見つかる。

openblas uses openmp for parallization. that does not work well when you are forking like python multiprocessing does.

I don't think it can be solved besides disabling parallelization in either openblas or python.

Bug #1186274 “openblas, multiprocessing and numpy freeze python...” : Bugs : “openblas” package : Ubuntu

とか

Using OpenBLAS can give speedups in some scikit-learn modules, but it doesn’t play nicely with joblib/multiprocessing, so using it is not recommended unless you know what you’re doing.

Installing scikit-learn — scikit-learn 0.14 documentation

ということで、一長一短・・・かなあ。ひえええ

2014年のJavascriptやCSS、最も楽しみな5つのテクノロジーは、asm.jsと、、、

Web platform: five technologies to look forward to in 2014

上記の記事にて、「ウェブプラットフォームで待ち遠しい5つのテクノロジー」が紹介されています。

  1. asm.js: near-native performance on the web
  2. ParallelJS: parallelized JavaScript code
  3. ECMAScript 6 (ES6): evolving the language, uniting the community
  4. Web Components: a standard infrastructure for widgets
  5. CSS Grid Layout: native-like GUI layout

と、5つのテクノロジーが挙げられています。「asm.js」「ECMAScript 6」「Web Components」あたりは聞いたことがあったのですが、「ParallelJS」「CSS Grid Layout」っていうのは初耳でした。

詳しい紹介は上記記事にて(英語で)載っていますので、簡単に紹介します。

1. asm.js

asm.js が公式サイトで、Mozillaの支援で開発されています。目的としては「高速なJavascript」といった感じです。ゲームであったり、いわゆるソフトウェア的なものであったりを、「Javascriptで書かれているけれども高速に動く」ようなものを作れます(作りたいです)。

よく、コンパイル型の言語(Cだったり)は高速だと言われます。例えば、その一つの理由として、コンパイル時に型が解決されることがあげられます(静的型付け)。一方でJavascriptはコンパイル型でなく、型の指定もしません。しかし変数を作った時点で型というのはだいたい決まっています。そこで、Javascriptの言語仕様に制約を与えて、型指定ができるようにしましょう、他にもいろいろ最適化できるようにしましょう、というのがasm.jsの基本的な考え方だと思います。

var bmi = weight / (height * height); // 普通にJavascript
var bmi = weight / (height * height) | 0; // int bmi;
var bmi = +(weight / (height * height)); // double bmi;

後2行は、型変換時によくあるイディオムで、旧来のJavascriptの仕様です。このような旧来の仕様を使って、asm.jsの仕様は作られています。そのため「Javascriptのsubset」であると言われます。

ただ、asm.jsは人間が書くものという感じはあまりしません。x|0 じゃなくて int x と書きたいものです。そのため、別の言語で作って(例えばC)、Emscriptenなどで"コンパイル"などして使います。使いどころは難しいですが、ゲームやOSから実行するソフトウェアなどが、それに該当するのかなあという感じです。Webアプリの場合はDOM操作やネットワークが重さの原因なので、Webアプリのための銀の弾丸ではありません。ゲームデモとか見るとすごいです。

2. ParallelJS

ParallelJS: data parallelism for JavaScript

こちらの記事ですが、次のようなブコメがついています。

ECMAScriptへの並行・並列機能の導入について。配列操作の並列実行についての条件の簡単な解説有り。データの並列化およびタスクの並列化。

b:id:saneyuki_s:20131224

記事を読むと、ECMAScript 7、ECMAScript 8へ追加したい言語仕様として捉えられているようです。そのための低レベルAPIとして、SIMDAPIとかがECMAScriptの仕様としてあるようです

こちらもasm.jsと似ていて「Javascriptの高速化」で、でもこれが有効なのはゲームとかOS寄りかなあという印象です。間違ってたらごめんなさい!

3. ECMAScript 6

ECMAScriptとは、Javascriptの元となっているような言語仕様です。逆に、JavascriptECMAScriptの「方言」と言われるようです(ECMAScript - Wikipedia)。ECMAScript 6は現在策定中の仕様ですが、まだ全然使えないというわけではなく、一部は実装されています(Mozilla における ECMAScript 6 のサポート - JavaScript | MDN)。

なぜこれが大事なのかというと、Javascriptが「言語として進歩する」からです。ちょっとだけ似たような話ですが、JavaなどもJava 8として言語仕様が進歩しましたね。

まだES 6は策定中で、ブラウザーに実装されているとは言いがたいですが、Google製のTraceurなどを使えば、ES6準拠で書いて、それを既存のブラウザ上で動かすことができます(年の瀬なのでGoogle作ったソフトのリポジトリ(github.com/google)まとめてみた! - 病みつきエンジニアブログ)。

4. Web Components

あなたの知らない超絶便利なWeb開発を叶える仕様Web Componentsとは~Google I/O 2013まとめレポート (1/3) - @IT

Web Component概要

こちらはあまり知らないので記事紹介です! 簡単な概念としては、要素を「ウィジェット化」して、セマンティックにしましょう、みたいな感じです。

例えばカレンダーを作った時、旧来の方法だと、それっぽいtableを作って、それっぽいJSコードを書いたりします。しかし本当にやりたいのは「カレンダー」をhtml中にコーディングすることです。そこで、「カレンダーを表す要素」を定義してしまって、埋め込みましょう、というような。

Web Components普及の夜明け!?Polymer.jsを試してみた。 | OpenWebにて、コードが紹介されています。

5. CSS Grid Layout

あまりにも知らないのでWeb platform: five technologies to look forward to in 2014を参考にしていただきたいのですが、グリッドレイアウトがCSSの仕様として策定されていて、「IEはサポート済み、Chrome/Firefoxは2014にはサポート」といった感じらしいです。

「なぜこれがExcitingなのか」の理由として、「CSS Grid Layout will eliminate that gap.」と書かれています。ここでいうgapは「Web(HTML/CSS)とネイティブ(iOSAndroid)の差」のことです。確かにAndroidのレイアウトは、Grid Layoutっぽい配置で書くし、レスポンシブになってとても良いんですよね。この考え方がCSSで一般的になるのは、確かに楽しみだなーと感じました。

Web platform: five technologies to look forward to in 2014に、サポート状況や使い方へのリンクがあるので、ぜひご覧ください!

Rubyとか使ってクローリングやスクレイピングするノウハウを公開してみる!

  • 今まで何度もスクレイピングとかクローリングをしてきたので、マエショリストの端くれとしてコツを公開すべきかなあ、と思い、公開します。

今日の題材は、CNET Newsです。私はウェブ文書にタグ付けをするという研究をしているのですが、そのための教師データとしてクローリングをします。

photo by Sean MacEntee

要件定義

CNET Newsから全ニュースを保存し、その本文をデータベースに保存します。これは、次のようなフローに書き下すことができます。

  1. 全URLを取得し、データベースに保存
  2. データベースにある全URLをダウンロードする
  3. 保存した全ページを解析して、本文をデータベースに保存する

という流れです。これらは独立していますから、それぞれどの言語で解析しても構いません。しかし後述しますが、「あとから追いやすくする」「適材適所」といったあたりを気をつけて、言語選択をするべきだと思います

0. データベースを用意

まず、保存するにあたって、データベース・サーバーなどを用意しておくと良いと思います。大量のデータを、ソートしたり、フィルターしたりするのに非常に便利だからです。したがって、URLはすべてデータベースに保存することとします。

いくつか選択肢がありますが、「簡単」ということで言えば、SQLiteのようにポータブルなものや、MongoDBのようなNoSQLなものを使うと良いような気がします。

私はMongoDBに苦しめられた記憶があるので、SQLiteを使っていますが、スキーマ管理の面倒臭さからMongoDBなどをおすすめします。が、私は苦しめられたのでSQLiteを使って説明します。

SQLiteのデータベースの作成は、コマンドラインインターフェースを使うのもひとつの手ですが、「あとから追いやすくする」という目的のため、一つのファイルにちゃんと書いておくといいと思います。私の場合は、以下のようにRubyのスクリプトを書き、これを実行することでデータベースを作成しています

1. 全URLを取得し、データベースに保存

例えばブログのように、ある記事があって、一個前の記事をたどり、すべての記事にたどり着けるような場合は、このステップは不要です。しかしCNET Newsの場合はそのような構造になっていないので、全URLを先に取得することを考えます

通常であればトップページ(インデックスページ)を使いますが、CNET Newsの場合はトップページがAjaxを使っていて面倒くさいこと、Sitemapがあることなどから、Sitemapを使います。

これを見てみると、たかだか1000ページ以下のHTMLにURLがまとまっているのがわかると思います。たかだか1000ページ以下なので、特に工夫せず、全件フェッチをします。

本来であれば(件数が増えれば)、2.のように「一旦ダウンロード」して、「解析」するという2つのステップに分割したほうが良いです。そうすれば再解析したいときも再度ダウンロードする必要がなく、サーバーの負荷を防いだり、時間的を節約できます。また、途中でこけたり(Exception)したときも、再ダウンロード不要です(3回くらいこけた)。

ということで、これは普通にバッドプラクティスですね、真似しないでください

また、今回はデータ解析のためにダウンロードしているのでrobots.txtを無視していますが、「インターネット情報検索サービス事業者」として収集をする場合にはrobots.txtの指定に従う必要があります

3. 本文をデータベースに保存する

全URLを取得したので、今度は本文をダウンロードします。先ほど述べましたが、「一旦ダウンロード」してから「本文を取り出してDBに保存」という、2つのステップを踏みます。

また、多くのページをダウンロードするときには、Resqueというシステムを使うと良いと思います。Resqueは、「非同期バッチ処理をする」ソフトウェアだと言われますが、簡単に言えば、タスク管理システムです。「ページのダウンロード」「ダウンロードしたページの解析」をそれぞれタスクとして登録しておいて、それをワーカーに非同期に処理させることができます。例えば10000ページをダウンロードする際、たまたまどこかで503エラーになってしまったら、それ以降の処理がすべて止まってしまいます。しかし1つ1つをタスクとして処理すれば、1つのタスクに失敗しても、次のタスクをワーカーが非同期に処理してくれます

まずは、「ページをダウンロードする」というタスクを登録するためのコードです。

で、そこで登録される FetchPage というタスクのコードです。

このタスクは、ダウンロードして保存して、「ダウンロードしたページを解析して本文をDBに保存する」という ExtractPage タスクを登録します。

以上で、タスクが登録されるので、以下のコマンドでワーカーを作動させます。

(追記)ダウンロードの方に、負荷がかからないためのインターバルを追加しました。

    $ PIDFILE=./resque-extract.pid BACKGROUND=yes QUEUE=cnet_extract rake resque:work
    $ PIDFILE=./resque-fetch.pid INTERVAL=5 BACKGROUND=yes QUEUE=cnet_fetch rake resque:work

こうすると、しばらくサボっているとデータベースの方へ保存されます。

サボっているついでに、最近HuluでGALACTICA見てるんですが、結構面白いですね!

まとめ

以上のソースは、yamitzky/cnet-scrapeにて公開しています。

まとめですが、クローリングのコツは

  • 一旦保存してから解析する
  • 解析結果はDBに保存する
  • Resque的なものを使う

の3つを意識すると良いかなあーと思います。ちなみにopen-uriは少し不便なので、「いろんなデータソースから取得する場合」にはあまりオススメできません、ということも共有しておきます。また、ResqueはPythonとかからも使えるそうです。

なぜこんな記事を書いたのか

おまけですが、、、

スクレイピング/クローリング的な話は、結構タブー視されてしまっています。しかし、著作権法第47条の7「情報解析のための複製等」にて認められておりますから、もっと積極的にスクレイピングしましょう、的なことをお伝えしたい、ということです。

著作権法に基づいたスクレイピングが広まり、解析が広まり、よりデーターでドリブンになっていってほしいですし、皆様の研究が捗ると嬉しいな、と思います。

次回は著作権法第47条の7に基づいて翻案等をしたいと思います。しかし翻案や、それを元にした公開の、許されている範囲がよくわからないので、この辺りについて何かご存知のかたは教えていただけますと幸いです。

著作権法47条の7は、データ解析のためのダウンロードを認めています。その過程にあるような複製(例えば特徴量作るとか)も認められています。そして、解析の結果発生したものが著作物でなければ、公開しても良いと言われています。では、特徴量を公開するのは、「著作物でないから良い」ということができるのでしょうか。。。元に戻せないようなBag of Wordsは著作物に該当しないような気もします。そして事業者の損害はとても少ないはずなので、立法趣旨にも反さないような気がしますが。。。

著作権法むずかしいです

追記

sinatra-activerecordってgem使うとデータベースの処理がもっと単純に書けますよ。スキーマ管理もできるし https://github.com/janko-m/sinatra-activerecord/blob/master/README.md

b:id:inarin:20131231

とのことです。確かにActiveRecordのようなO/Rマッパーを使ったほうが(私の経験上)よく、でもRailsぐぬぬ・・・てなっていたので、本当に便利ですね。ありがとうございます。

Resque などを使って非同期に平行してガシガシ SQLite に INSERT UPDATE しまくるとあっさりデッドロックするので PostgreSQLMariaDB 使ったほうがいいと思います。

b:id:ssig33:20140102

本当にそうなんですよね。したがって、今回のように並行処理しなくても現実的な時間で終わる程度のページ数であることとか、そういったところがSQLiteを使う条件になってくると思います。

逆にSQLiteの良い所は、その保存先が単一のファイルにまとまることです。上記の例だと、cnet.dbにまとまります。私の場合、自分のVPSでクローリングして、ローカルのPCで解析して、やっぱり研究室のPCで解析して、、、とかやることがよくあるので、別のPCにDBを移すときに「単一のファイルをやりとりすれば良い」というのは非常に楽でした。

もちろん、MySQL(やMariaDB)をダンプしてやりとりすることもできるので、ファイルのやりとりができないということはありません。ただ、ダンプしたファイルのリストアにとても時間がかかったりしたことなどがあります(Wikipediaのダンプファイルとか)。この辺りそれほど詳しくないのですが、さくっと転送できたりするのでしょうか。。。

スクレイピングの場合はホントにrobots.txtに従わなくて良いの?

b:id:ka-ka_xyz:20131231

スクレイピングの場合は」ではなく、「情報解析を目的とした場合は従わなくて良い」です。しかし、もし検索事業者として行う場合には、「収集を禁止する措置(robots.txtのこと)がとられた情報の収集を行わない」ということが求めらています(政令)。おそらく、robots.txtは「検索に伴う公開を望まないものの指定」として扱われているのだと思います*1

経産省の資料にて紹介されています。参考:(【情報大航海プロジェクト・事業者向け解説書】 平成 21 年著作権法改正のポイント)http://www.meti.go.jp/policy/it_policy/daikoukai/igvp/index/h22_report/sub/06.pdf

でも利用規約で止められてるけどね。

b:id:glizmo:20140101

利用規約がどれくらい効力を発揮するのかは難しいところです。これは、著作権の該当条文が「強行規定なのかどうか」という問題らしいのですが、これに関しての明確な事例や条文ってあるんでしょうか。

以下の記事が話題になっていたので、乗っかってPythonの話を書いてみたいと思います。

PythonとかScrapyとか使ってクローリングやスクレイピングするノウハウを公開してみる! - orangain flavor

言及してくださいました! Pythonでのスクレイピングです。こちらはHTMLの保存などはしてくれないようで。

という風に一長一短だったりするので、いろいろと周辺技術を探してみてくださいっ!

*1:URLそのものはただの符号であり、公開情報なので、これを公開することは問題とはならないはずです。また閲覧自体も防ぐことはできないので、問題ないはずです。ただし民法上の不法行為となる可能性があるので、訴えられる可能性を否定することはできません

年の瀬なのでGoogle作ったソフトのリポジトリ(github.com/google)まとめてみた!

google (Google)には、いろいろとすごいソフトウェアがあるようだったので、まとめてみました。ぜひとも開発に活かしたいです。

photo by Aray Chen

★の多い順に紹介してみます。ちなみに1つも使ったことがないので、そこは割り引いてください。

Gumbo - A pure-C HTML5 parser.

google/gumbo-parser

Cで書かれたHTML5のためのパーサーです(PythonでいうBeautifulSoup、RubyでいうNokogiriに対応するソフトウェア)。当たり前ですがC言語(C++)で使うことができますが、Pythonバインディングが公式に提供されているようです。Ruby用、JS用、Objective-C用などもあります。

lmctfy - Let Me Contain That For You

google/lmctfy

疎くて自信がないのですが、「コンテナ」的な、VM界隈的な、OS仮想化的なアプリケーションみたいです。lmctfy を試す (1) - TenForwardの日記に詳しいですが、LXCと同じレイヤーに位置するそうです。

Web Tracing Framework

google/tracing-framework

公式サイトもあります。デバッグなどのためWebアプリケーショのトレースをするためのエクステンションです。メソッド呼び出しのタイミングを測れるようで、GC(ガベージコレクション)のタイミングなども測れるようです。JSを使ったリッチなゲーム制作に、とても有用そうです。

Traceur

google/traceur-compiler

次の世代の言語仕様のJS(EcmaScript 6)を、現行の仕様にコンパイルするコンパイラーです。例えば、ES6では、次のような代入が許可されています(参考:JavaScript (ECMAScript) 2013)。

[a, b] = [1, 2];

これを次のような現行仕様にコンパイルします(デモ)。

var $__2;
($__2 = [1, 2], a = $__2[0], b = $__2[1], $__2);

Lisp Koans

google/lisp-koans

神の言語ことLISPRuby Koansの要領でテストケースを通じて学ぶみたい。

iOS WebKit Debug Proxy

google/ios-webkit-debug-proxy

ChromeのDevToolみたいなものを、iOSWebkitデバッグのために使うためのProxy。インスペクター的な

Module Server

google/module-server

効率よく依存関係を解消してJavascriptを提供するためのサーバーの、デモ実装です。JSConf EU: A novel, efficient approach to JavaScript loadingのプレゼンテーションにて、どういった手法なのか説明されています。

LiquidFun

google/liquidfun

公式ページもあります。Box2Dをベースにして作られた、C++で書かれた物理エンジンです。

Hesokuri

google/hesokuri

Gitのリポジトリを、複数のPCに複製したり、バックアップしたり(=同期)するためのソフトウェアです。例えば家のPCと、個人のサーバーがあったとして、サーバーの方に同期したりできるようです。私はよく、家のPCでソフトウェアを書いて、サーバー側にデプロイして、サーバーの方で手直しして、家のPCにpullしたりするのですが、どちらも個人のPCなので、いちいち中央のリポジトリを経由するのはあほらしいです。

scpで同期するみたいなので、global環境でも問題ないはずです。

Web Latency Benchmark

google/latency-benchmark

ブラウザのベンチマークツールです。

Pinject

google/pinject

PythonでDependency Injection(DI)をするためのライブラリです。

Maktaba

google/maktaba

VIM SCRIPT!!!!!!

Vim pluginを書くためのプラグインです。

Kratu

google/kratu

公式ページもあります。構造化されたデータを分析するためのプロダクトです。使いどころがむずかしい感じがしますが、各カラムに重みをつけたスコアでソートしたりできます。

pepper.js

google/pepper.js

Pepper API向けに書かれたCのソースをJavascriptに変換するためのソフトウェアです。このあたりの話は、Google Native Client - Wikipediaに詳しいです。

Patchfield

google/patchfield

Android用のAudio系ライブラリです。シンセや音声エフェクトアプリのように、focusedなアプリケーションを、パッチのように組み合わせるためのライブラリ(?)

Signet

google/signet

Ruby向けのOAuthの実装

namebench 2.0

google/namebench

自分のブラウザ閲覧履歴を使って、一番良いDNSをレコメンドしてくれるらしい。なんかすごい。

devtoolsExtended

google/devtoolsExtended

Devtoolの実験的なエクステンション、という位置づけみたいです。

その他

行列分解の実装とか、音声エフェクトの実装とか、特に「Googleっぽい」ということもなく、20%プロジェクトで作ったものを上げているようですね。

「統計学が最強の学問である」をおすすめしてみる

※本記事はCA14 Advent Calendar 2013の12/24の記事になります。メリークリスマス!

本当はハッカーと画家とかリーダブルコードとかエルフェンリートとかBLACK LAGOONが普通におすすめなんですが、せっかくのCA14アドベントカレンダーなので、CAの同期に向けて統計学が最強の学問であるをおすすめしたいと思います。

本書の概要

本書では最新の事例と研究結果をもとに、基礎知識を押さえたうえで統計学の主要6分野
◎社会調査法
◎疫学・生物統計学
◎心理統計学
データマイニング
テキストマイニング
◎計量経済学
を横断的に解説するという、今までにない切り口で統計学の世界を案内する。

ということなんですが、そんなにすごい本じゃないです。それよりは、統計学をざっと眺めるための読み物という感じです。

統計学の歴史から、なぜ統計学が大事なのか、統計学で何ができるのか、統計学にはどんな手法があるのか、そういったあたりのことをざーーーーーーっと紹介してくれます。

統計学の面白いところ

統計学の面白いところというのは、「思い込み」を可視化して、嘘か本当かを炙りだしてくれるところだと思います。

例えば、次の命題について考えてみてください。

子供がテストでとても悪い成績を取ったので、罰を与えた。その次のテストで、子供は良い点数を取った。罰は有効だと言えるか。

私達は「罰を与えたから成績が良くなった」と思い込んでしまうと思います。しかし、罰を与えなかったときを想定してみます。

子供がテストで(たまたま)とても悪い成績を取った。その次のテストで、子供は(いつも通り)良い点数を取った。

ということで、「たまたま悪い点を取ったけど、次はいつも通りの点数だった」というのは、極めて自然だと思います。このような思い込みはフランシス・ゴルトンのもたらした「平均への回帰」という考え方で説明することができます。

f:id:yamitzky:20131226040957j:plain

↑この人!

まとめると、、、
テストの点数は(その子供の)平均へ回帰するとかんがえると、罰が有効かどうかはわからないとなります。

この話は、本書には「身長が高い男が、自分より身長の低い女とだけ結婚したら・・・?」という例で書かれています。笑

統計学ウェブサービスを運営するのにも大事?

私達エンジニアやウェブサービスを運営する人にとっても統計学は大事かなーと思います。

ウェブサービスを運営していて頻繁に起こるのは、次のような「思い込み」です。

あるUIを変更するアップデートをしたら、次の日の平均滞在時間が10秒伸びた。このUI変更は意味があったか。

答えを先にいうと、効果があったかはわからない、です。何故かと言うと、例えば2人しか使ってないアプリだったら、たまたま10秒間だけ使う時間が伸びただけかもしれないからです。でも、もし100万人の平均を取って10秒伸びたのであれば、それは効果があったと言えるでしょう(曜日による差などもあるので、実際にはよくわからないですが)。このような違いは、(有意差)検定という考え方を使って「本当に効果があったのか? たまたまじゃないか?」といったことを調べることができます。

「『効果があったかどうかわからない』かわかっても意味がない」と思うかもしれません。しかし、「効果がないものに一喜一憂しても意味がない」のです。ということで、効果が明白な施策をちゃと打ちましょーということができるような気がします(でも、効果が明白な施策ってそんなに多くないので、地道に改善を積み重ねるしかない、と言う・・・笑)。

まとめ

なんだかだいぶつまらない例を上げてしまったような気もするのですが・・・!

統計トリビアを知りながら統計リテラシーが上がるような気がする本書はおすすめです、という話でした! メリークリスマス!

統計学が最強の学問である

統計学が最強の学問である

追記

尾崎さんが「平均への回帰」「見せかけの回帰」などを、DAUなどをテーマに書いていらっしゃいます。「見せかけの回帰」は本書に載っていないような気もしますから、ぜひこちらも合わせて御覧ください。

「毎日の数字を追いかけ、毎日改善する」ことの意外な落とし穴 - 銀座で働くデータサイエンティストのブログ