Raspberry Pi で mecab-ipadic-NEologd をNode.jsから使う


再挑戦してみたら上手くいきましたのでメモ的にエントリします。

環境

  • Raspberry Pi2 ModelB
  • node.js v6.8.1
  • mecab 0.996
  • mecab-ipadic-neologd 2.0

mecabのインストール

素直にapt-getを使います。

$ sudo apt-get install mecab
$ sudo apt-get install libmecab-dev
$ sudo apt-get install mecab-ipadic
$ mecab
サミュエルLジャクソン
サミュエル 名詞,固有名詞,人名,名,*,*,サミュエル,サミュエル,サミュエル
L   名詞,固有名詞,組織,*,*,*,*
ジャクソン 名詞,固有名詞,人名,姓,*,*,ジャクソン,ジャクソン,ジャクソン
EOS

mecab-ipadic-neologdのインストール

Raspberry Piに直接インストールしてもエラーになってしまうので、諦めていました。(容量が原因と思いExpand Filesystemをオンにしてもダメでした)

Macにはインストール出来ていたので、「あれ?これコピーすればいいんじゃ?」と思い試したら上手くいきました。

neologd/mecab-ipadic-neologd - GitHub

こちらよりMacにインストールすると以下のディレクトリに辞書が生成されます。

/usr/local/lib/mecab/dic/mecab-ipadic-neologd

これをzipファイルにして

sftp(私はFilezillaを使用)を利用してホームディレクトリにアップロード。

アップロード後解凍します。

$ unzip dic.zip

mecab辞書の定位置に移動します。

$ sudo mv -v /home/pi/dic /usr/lib/mecab
`/home/pi/dic' -> `/usr/lib/mecab/dic'

辞書を指定して実行します。(Macとは階層が異なるのでちょっと注意が必要です)

$ mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd
サミュエルLジャクソン
サミュエルLジャクソン 名詞,固有名詞,一般,*,*,*,サミュエル・L・ジャクソン,サミュエルエルジャクソン,サミュエルエルジャクソン
EOS

「サミュエル・L・ジャクソン」が固有名詞として認識されています。上手くいきました。

mecab-asyncでつかう

以下のライブラリを利用させていただきます。

hecomi/node-mecab-async - GitHub

こちらもそのままインストールするとエラーが出てしまうので以下のようにインストールします。

グローバル領域にインストールします。

$ sudo npm install mecab-async -g

任意のフォルダのモジュールに移動します。

$ sudo mv -v /usr/local/lib/node_modules/mecab-async /home/pi/mecab-async/node_modules
`/usr/local/lib/node_modules/mecab-async' -> `/home/pi/mecab-async/node_modules/mecab-async'

これでモジュールが使えるようになりました。試しにこんなファイルを用意しました。

app.js
var MeCab = new require('mecab-async')
var mecab = new MeCab();
    MeCab.command = "mecab -d /usr/lib/mecab/dic/mecab-ipadic-neologd"
    var text = process.argv[2]
    //注:パースコマンドを利用する時 "MeCab.~"と大文字にしないと動かないみたいです
    MeCab.parseFormat(text, function(err, morphs) {
        if (err) throw err;
        morphs.map(function(morph) {
        if (morph.lexical === '感動詞') {
          console.log(morph.lexical + ' : ' + morph.original);
        }
        if (morph.compound === '固有名詞') {
          console.log(morph.compound + ' : ' +morph.original);
        }
    });
    });

「感動詞」と「固有名詞」を抽出します。実行してみます。

$ node app.js こんにちは、サミュエルLジャクソンです。
感動詞 : こんにちは
固有名詞 : サミュエル・L・ジャクソン

やっとこさ上手くいきました。では。