node.jsで機械学習

このお盆休みに、ふと思い立って、機械学習をやってみようと思った。
手軽に試したかったので、node.jsを使うことにした。
久しぶりのnode.jsである。
いつのまにやら、安定版がv0.8になっていた。

ということで、nvmを使って、v0.8.8を放りこんでみた。
丁度良いことに、node.jsで機械学習をやるためのプラグインがあった。
node-naivebayes-simpleだ。
mecab形態素解析をして、naivebayes-simpleで分析して、mongodbにデータを貯めるらしい。

mecabには、node-mecab-bindingというプラグインを使い、mongodbは、node-mongodb-nativeというプラグインを使っている。

ということで、各種プラグインをインストール。

$ git clone git://github.com/hakobera/node-mecab-binding
$ cd node-mecab-binding
$ npm install -g
$ npm link
$ npm ln mecab-binding

$ npm install -g mongodb
$ npm ln mongodb

$ git clone git://github.com/waka/node-naivebayes-simple
$ cd node-naivebayes-simple
$ npm install -g
$ npm link

しかし、ここで、node-naivebayes-simpleのインストールがうまくいかない。
package.jsonに問題があるようだ。
authorの中に「"」が入っていたり、各要素の最後の「,」が省略されているためだ。
私の環境では、以下のように変更する必要があった。

{
    "name": "naivebayes-simple",
    "version": "0.0.1",
    "description": "This is simple imaplementation of Naive Bayes algorythm.",
    "author": "Yoshimasa Wakahara <y.wakahara@gmail.com>",
    "repository": {
        "type": "git",
        "url" : "http://github.com/waka/node-naivebayes-simple.git"
    },
    "engines": {
        "node": ">= 0.4.0 <= 0.5.2"
    },
    "main": "./lib/naivebayes-simple"
}

nodeのバージョンが「>= 0.4.0 <= 0.5.2」となっているが、v0.8.8でも問題なく動作しているようだ。

とりあえず、サンプルを実行。

var Train = require('naivebayes-simple').Train;
Train.train('学習させるテキストだよ。', 'テストカテゴリ');
Classify document, and get document's category.

var Classifier = require('naivebayes-simple').Classifier;
Classifier.on('classified', function(arg) {
    var category = arg[0];
    var originalDoc = arg[1];
    console.log(originalDoc + ' => category: ' + category);
});
Classifier.classify('分類するテキストだよ。');

mongodbでエラーになってしまった。。
collectionにcountがないと言っている。

mongodbプラグインインターフェイスが変わってしまったのかと思い、mongooseプラグインを使うように書き換えようとしてみた。

書き換え中に、ふと思い出したことがあった、そういえば、node.jsは非同期だよな。

Trainで学習が終わって、データが作成される(初回なので、スキーマ自体も作成される)前に、Classifierが走っていしまったのが、原因だった。。不覚。。

TrainとClassifierをそれぞれ別々に動かして、動作することを確認。

次回は、これを使ってタグ付けツールを作ってみたので、それを書くことにする。