node.jsで、タグ付けツール

前回は、node-naivebayes-simpleの簡単なサンプルを実行してみた。
機械学習は、いかに質のよい学習データを作るかが重要だと思う。
自分でデータを作るのはメンドクサイので、はてブからデータを頂くことにした。


はてブのタグ一覧から、タグとWebページのタイトルを取得して、学習させてみる。
node.jsのプラグインで、Webページのクローラは、いろいろあるようだけれど、今回はjqueryプラグインを使ってみた。
だって、jqueryに慣れているんだもん。

まずは、jqueryプラグインのインストール

$ npm install -g jquery
$ npm ln jquery

で、書いたのが下のようなコード

var Train = require('naivebayes-simple').Train;
var querystring = require("querystring");
var $ = require('jquery');
var http = require('http');
var options = {
    host: 'b.hatena.ne.jp',
    port: 80,
    path: '/t'
};

var html = '';
http.get(options, function(res) {
    res.on('data', function(data) {
        html += data;
    }).on('end', function() {
        $(html).find('.curvebox-body ul li a').each(function(i){
            var tag = $(this).text();
            getBookmark(tag);
        });
	}).on('error', function (error) {
		console.log(error);
    });
});

function getBookmark(tag) {
    var http = require('http');
	var html = '';
    var q = querystring.stringify({q: tag});
	var url = 'http://b.hatena.ne.jp/search/tag?' + q;
	
	http.get(url, function(res) {
		res.on('data', function(data) {
		    html += data;
		}).on('end', function() {
		    $(html).find('#search-result-lists ul li h3 a').each(function(i){
		        var name = $(this).text();
		        var url = $(this).attr('href');
		        //console.log(tag);
		        //console.log(name);
		        Train.train(name, tag);
		    });
		});
	}).on('error', function (error) {
		console.log(error);
	});
}

process.on('uncaughtException', function (err) {
	console.log('Caught exception: ' + err);
});

動作させてみる。


しばらく動かしていると、mecabがエラーをはく。。

Caught exception: Error: Failed to create MeCab

どうやら、mecabの初期化に失敗しているようだ。
node-mecab-bindingでは、毎回mecabインスタンスを初期化しているのだろうか。。

お盆休みは、実家である徳島に帰省していて、夏は、阿波踊りがある。
その阿波踊りの時間になってしまったので、詳しい調査はまた今度にするとしよう。
と思って、放置し、今に至る。。

学習データがいまいちなので、あまり賢くないけれど、一応、以下の様なコードで与えられたテキストに対して、タグをつけることができる。

var Classifier = require('naivebayes-simple').Classifier;
Classifier.on('classified', function(arg) {
	var category = arg[0];
	//var originalDoc = arg[1].substring(0, 20);
	var originalDoc = arg[1];
	console.log(originalDoc + ' => category: ' + category);
});

var text = process.argv[2];
Classifier.classify(text);

このコードをcl.jsという名前で保存して、node.jsで実行する。

$ node cl.js 今日も晴天なり
今日も晴天なり => category: akb48

なんで、AKBやねん。