5. 文章を形態素解析
//mecab-sample.js
// MeCabを利用するためのモジュール
module.exports = function () {
//外部モジュールの取り込み
var exec = require('child_process').exec;
var iconv = require('iconv-lite');
var fs = require('fs');
var platform = require('os').platform();
//モジュール変数の定義
//一時ファイル
this.TMP_FILE = __dirname + '/__mecab_tmpfile';
// MeCabのコマンドライン
this.MECAB = 'mecab';
this.ENCODING = (platform.substr(0,3) == 'win')
? 'SHIFT_JIS' : 'UTF-8';
//形態素解析を実行する関数
this.parse = function (text, callback) {
var encoding = this.ENCODING;
text += "n";
//変換元テキストを一時ファイルに保存
if (encoding != 'UTF-8') {
var buf = iconv.encode(text, encoding);
fs.writeFileSync(this.TMP_FILE, buf, "binary");
} else {
fs.writeFileSync(this.TMP_FILE, text, "UTF-8");
}
6. 文章を形態素解析
//コマンドを組み立てる
var cmd = [
this.MECAB,
'"' + this.TMP_FILE + '"'
].join(" ");
var opt = { encoding: 'UTF-8' };
if (encoding != 'UTF-8') opt.encoding = 'binary';
exec(cmd, opt,
function (err, stdout, stderr) {
if (err) return callback(err);
var inp;
//結果出力ファイルを元に戻す
if (encoding != 'UTF-8') {
iconv.skipDecodeWarning = true;
inp = iconv.decode(stdout, encoding);
} else {
inp = stdout;
}
//結果をパースする
inp = inp.replace(/r/g, "");
inp = inp.replace(/s+$/, "");
var lines = inp.split("n");
var res = lines.map(function(line) {
return line.replace('t', ',').split(',');
});
callback(err, res);
});
};
};
7. 文章を形態素解析
// mecab-test.js
var Mecab = require('./mecab_sample.js');
var mecab = new Mecab();
var text = "毎週、火曜日は勉強会があります";
mecab.parse(text, function(err, items) {
for (var i in items) {
var k = items[i];
if (k == "EOS") continue;
console.log(k[0] + ":" + k[1]);
}
});
上記ファイルを実行
$ node mecab-test.js
9. 文章にふりがなを振る
//furigana.js
//フリガナを振るfor Node.js
//モジュールの取り込み
var fs = require('fs');
var Mecab = require('./mecab_sample.js');
var mecab = new Mecab();
//コマンドラインを調べる
var args = process.argv;
args.shift(); // nodeを除去
args.shift(); //スクリプト名を除去
//引数がなければプログラムの使い方を表示する
if (args.length <= 0) {
console.log("[USAGE] furigana.js入力テキスト");
process.exit();
}
//入力ファイルを読み込む-
var inputfile = args.shift();
var txt = fs.readFileSync(inputfile, "utf-8");
10. 文章にふりがなを振る
//furigana.js
//形態素解析する
mecab.parse(txt, function (err, items) {
var res = "";
for (var i in items) {
var k = items[i];
var word = k[0];
var kana = k[8];
if (k == "EOS") continue;
//フリガナが必要なときを判定
if (word == kana || isHiragana(word)) {
res += word;
} else {
res += word + '(' + kana + ')';
}
}
console.log(res);
});
//ひらがな判定
function isHiragana(s) {
return (s.match(/^[あ-ん]+$/));
}