うまとま君の技術めも

2015年新卒入社した社畜の勉強内容などなど

MeCabで形態素解析 Node.jsバインディングを作ってみた

概要

Node.jsを使ったアプリケーションで形態素解析を行う必要があるので、MeCabを勉強してみようと思いました。 しかし、公式で提供されている言語バインディングにNode.jsは含まれていません(;´∀`)

公式以外で提供されているOSSも幾つかあるようですが、 外部コマンドを実行していたり、最終更新が5年前だったりと中々良さそうなものが見つかりませんでした...

www.npmjs.com

www.npmjs.com

そこで、今回は勉強ついでにMeCabのNode.jsバインディングを作ってみたいと思います。

環境

What is MeCab?

MeCab: Yet Another Part-of-Speech and Morphological Analyzer

MeCab京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。 言語, 辞書,コーパスに依存しない汎用的な設計を 基本方針としています。 パラメータの推定に Conditional Random Fields (CRF) を用 いており, ChaSenが採用している 隠れマルコフモデルに比べ性能が向上しています。また、平均的に ChaSen, Juman, KAKASIより高速に動作します。 ちなみに和布蕪(めかぶ)は, 作者の好物です。

Node.js Native Addon (V8 Addon)

Node.jsではnode-gypというツールを使うことによって簡単にNative Addonを作ることが可能となっています。
www.npmjs.com

MeCab公式から提供されているC/C++ライブラリをこれでラッピングしてあげれば、Node.jsからMeCabが使えるようになります。
MeCab C/C++ ライブラリの使い方はこちら http://taku910.github.io/mecab/libmecab.html

node-mecab-native

実際に作ってみたNode.jsバインディングはこちらとなります。

github.com

C/C++の知識は殆どないので、色々とイケてない部分はあるかと思います...
間違ってる部分などありましたらご指摘いただけると助かります...

使い方

var MeCab = require('node-mecab-native');
var tagger = MeCab.Tagger('-Owakati');

// Parse text
tagger.parse('太郎は次郎が持っている本を花子に渡した。', function(err, res) {
  console.log(res);
});

// Parse text to Nodes
tagger.parseToNode('太郎は次郎が持っている本を花子に渡した。', function(err, res) {
  console.log(res);
});

// Get Dictionary Info
tagger.dictionaryInfo(function(err, res) {
  console.log(res);
});

まとめ

初めてNode.js Native Addonを作ってみましたが、思いの外簡単に作成することができました。
今まで、どの様にしてNative Addonが作られているのか分からなかったですが、
大まかな仕組みは理解できたので良かったかと思います。

ですが、やはりC/C++が分からないと出来ることが限られるので
勉強し直したほうが良さそうです(;・∀・)