Corredor

ウェブ、プログラミングの勉強メモ。

tiny-segmenter・kuromoji.js : JavaScript 製の形態素解析ツールを2つ使ってみた

形態素解析ツールというと MeCab が有名だが、コレはライブラリをマシンにインストールし、Python・Ruby・Java・Perl・Node.js 言語などにバインディングするライブラリを導入することで使える。機能的には十分便利だが、導入手順や言語の制約があり、ライブラリのサイズも大きいので、ウェブアプリとして動かす時は若干やりづらいところもある。

そこで、MeCab 以外に形態素解析ツールがないか、中でも JavaScript 製だったりして、ブラウザオンリーで使えるようなライブラリがないか、探してみた。

tiny-segmenter

早速見つけたのは、TinySegmenter というライブラリ。JavaScript 製で、ライブラリのファイルサイズも極めて小さい。

npm でもインストールできるので、Node.js 上だと以下のようなコードで試せる。

$ npm install --save tiny-segmenter
  • practice-tiny-segmenter.js
const TinySegmenter = require('tiny-segmenter');
const tinySegmenter = new TinySegmenter();

const segments = tinySegmenter.segment('私の名前は中野です');

console.log(segments);
// → [ '私', 'の', '名前', 'は', '中野', 'です' ]

ブラウザ上で実行したい場合は、グローバル変数 TinySegmenter があるので、コレを使えば好きに書ける。

実行結果は、入力した文章を分かち書きするだけで、品詞などは分からない。

機械学習結果を内包して展開されているので、対象の文章によっては精度が下がる。そこで、機械学習を手元でやり直すためのツールも別に作成されている。

kuromoji.js

続いて見つけたのは kuromoji.js。コレは Kuromoji という Java 製の形態素解析ツールを JavaScript に移植したモノ。

コチラも npm でインストールできる。

$ npm install --save kuromoji

Node.js で実装する場合は次のように書ける。

  • practice-kuromoji.js
const path = require('path');
const kuromoji = require('kuromoji');

kuromoji.builder({
  dicPath: path.resolve(__dirname, './node_modules/kuromoji/dict')
})
  .build((error, tokenizer) => {
    const parsed = tokenizer.tokenize('私の名前は中野です');
    console.log(parsed);
  });

結果はこんな感じ。

[
  {
    word_id: 43630,
    word_type: 'KNOWN',
    word_position: 1,
    surface_form: '私',
    pos: '名詞',
    pos_detail_1: '代名詞',
    pos_detail_2: '一般',
    pos_detail_3: '*',
    conjugated_type: '*',
    conjugated_form: '*',
    basic_form: '私',
    reading: 'ワタシ',
    pronunciation: 'ワタシ'
  },
  {
    word_id: 93100,
    word_type: 'KNOWN',
    word_position: 2,
    surface_form: 'の',
    pos: '助詞',
    pos_detail_1: '連体化',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '*',
    conjugated_form: '*',
    basic_form: 'の',
    reading: 'ノ',
    pronunciation: 'ノ'
  },
  {
    word_id: 761200,
    word_type: 'KNOWN',
    word_position: 3,
    surface_form: '名前',
    pos: '名詞',
    pos_detail_1: '一般',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '*',
    conjugated_form: '*',
    basic_form: '名前',
    reading: 'ナマエ',
    pronunciation: 'ナマエ'
  },
  {
    word_id: 93010,
    word_type: 'KNOWN',
    word_position: 5,
    surface_form: 'は',
    pos: '助詞',
    pos_detail_1: '係助詞',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '*',
    conjugated_form: '*',
    basic_form: 'は',
    reading: 'ハ',
    pronunciation: 'ワ'
  },
  {
    word_id: 3160900,
    word_type: 'KNOWN',
    word_position: 6,
    surface_form: '中野',
    pos: '名詞',
    pos_detail_1: '固有名詞',
    pos_detail_2: '地域',
    pos_detail_3: '一般',
    conjugated_type: '*',
    conjugated_form: '*',
    basic_form: '中野',
    reading: 'ナカノ',
    pronunciation: 'ナカノ'
  },
  {
    word_id: 23760,
    word_type: 'KNOWN',
    word_position: 8,
    surface_form: 'です',
    pos: '助動詞',
    pos_detail_1: '*',
    pos_detail_2: '*',
    pos_detail_3: '*',
    conjugated_type: '特殊・デス',
    conjugated_form: '基本形',
    basic_form: 'です',
    reading: 'デス',
    pronunciation: 'デス'
  }
]

品詞なんかも取れて、MeCab と同じようなことができる。

./dict/ ディレクトリ内にある12個の .dat.gz ファイルが辞書ファイル。これらを読み込んで使用する。全部で 17MB 程度ある。

Browserify でまとめられたビルド済ファイルも提供されており、コレを使えばブラウザ上でグローバル変数 kuromoji が使えるようになる。./dict/ 内のファイルを読み込む部分も XMLHttpRequest を使って実現されるので、ブラウザオンリーで動作させられる。

軽さ優先なら tiny-segmenter・MeCab に近い品詞情報も知りたければ kuromoji.js

ということで2つのライブラリを試してみた。どちらもブラウザ上で動作し、MeCab よりも軽量だ。

tiny-segmenter の軽さは素晴らしいが、分かち書きのみのところが微妙か。品詞も欲しければ kuromoji.js を使うと良いが、ブラウザで 17MB もロードさせるのは若干時間がかかりそうなので、注意が必要だろう。