初投稿です。JavaでMeCabを使用しなければならない機会があったのですが、どうも一筋縄ではいきませんでしたので、メモしておきます。最終目標は、Eclipseでの使用です。
なお、自分でもやっていることをすべて理解しているわけではありませんので、予めご了承ください。
想定環境
以下の環境で行いました。なお、Sierraでも同じようにしてインストールできたことを確認しております。
- OS:Mac OS X El Capitan 10.11.3
- PC:MacBook Air (11-inchi, Mid 2012)
- Java:1.8.0_45
- その他:予めXcode6.1.1(6A2008a)をインストール済み
あらかじめインストールしておくもの
Xcode及びJava JDKをインストールしておいてください。
MeCabのインストール
Javaとか関係なしに、まずはMeCabのインストールを行います。パッケージ管理ソフトであるHomebrewを使用する方法もありますが、私は公式配布ページからダウンロードしてインストールしました。
本体と辞書の2つをインストールする必要があります。執筆時点では、MeCab本体はmecab-0.996.tar.gzが最新でした。辞書は推奨とされているIPA 辞書を使いました。
それぞれのインストール方法は、同じページにわかりやすく書かれていますのでそちらをご覧ください。
Javaバインディングのコンパイル
ここが一つ目のネックの部分になります。
とりあえず、先ほどと同じ公式配布ページ内のリンクからJavaバインディングをダウンロードします。(Google Driveでの配布となります。)
インストールしたMeCabのバージョンと同じものを使用するのがいいと思いますので、mecab-java-0.996.tar.gzをダウンロードしました。
ターミナル上で解凍し、そのままmakeしてみます。
tar zxfv mecab-java-0.996.tar.gz
cd mecab-java-0.996
sudo make
すると、以下のようなエラーが返ってきました。
c++ -O3 -c -fpic MeCab_wrap.cxx `mecab-config --cflags` -I/usr/lib/jvm/java-6-openjdk/include -I/usr/lib/jvm/java-6-openjdk/include/linux
MeCab_wrap.cxx:159:10: fatal error: 'jni.h' file not found
# include <jni.h>
^
1 error generated.
make: *** [all] Error 1
jni.hが見つからないとのことです。どうやら、Makefileをいじってやって、自分の環境に合わせてやらないといけないみたいです。
同じディレクトリ内のMakefileというファイルをお好きなテキストエディタで開き、6行目付近の**INCLUDE=・・・**の部分を以下のように書き換えてください。
INCLUDE=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/
Xcode内のファイルを読みに行ってますので、Xcode.appがアプリケーションフォルダ以外の場所にある場合は、適宜上記を読み替えてください。
他のページでもこの部分を書き換えたら上手くいきましたという報告は多々あるのですが、それらのページに書かれているパスを実際に見てもjni.hは存在せず。。。
英語で書かれたページを見ると、同じような現象の方がいるようで、そちらを参考にしました。
書き換えた後は、同じようにmakeしてみます。
sudo make
すると、正常にmakeされ、ディレクトリ内にMeCab.jarなどが作られます。(警告(Warning)が大量に出ますが、問題ありません)
ディレクトリ名をmecab-java-0.996からmecab-javaに変更し、/usr/local/bin/にコピーしてください。つまり、MeCab.jarの位置が/usr/local/bin/mecab-java/MeCab.jarとなります。
エイリアスを作る
ターミナル上でjavaのコンパイルをする場合は、これを行うことで、毎回コンパイルするときにクラスパスを書く必要が無くなります。
まず、テキストエディタで**~/.bash_profile**を開いてください。無い場合は新規作成してください。そして下記の内容が書かれていない場合は追記します。
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
続いて、テキストエディタで**~/.bashrc**を開いてください。無い場合は新規作成してください。以下の内容を追記します。
alias mecajavac='env DYLD_LIBRARY_PATH=".:/usr/local/bin/mecab-java" CLASSPATH=".:$CLASSPATH:/usr/local/bin/mecab-java/MeCab.jar" javac'
alias mecajava='env DYLD_LIBRARY_PATH=".:/usr/local/bin/mecab-java" CLASSPATH=".:$CLASSPATH:/usr/local/bin/mecab-java/MeCab.jar" java'
これでパスを通すことができます。今後ターミナル上でコンパイルするときはmecajavac、実行するときはmecajavaコマンドで行うことができます。しかし、El CapitanではコンパイルしようとしてもMeCabが見つからないとかでエラーが出る場合があります。その場合は、この後の「SIPを無効化する」節を試してみてください。
mecajava及びmecajavacが使えるかどうかテストする
これで、mecajavac及びmecajavaコマンドを使用することができるようになります。試しに、mecab-java内に入っているtest.javaをコンパイルして実行してみてください。
mecajavac test.java
mecajava test
0.996
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
二郎 名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
に 助詞,格助詞,一般,*,*,*,に,ニ,ニ
この 連体詞,*,*,*,*,*,この,コノ,コノ
本 名詞,一般,*,*,*,*,本,ホン,ホン
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
渡し 動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS
・・・
このような結果となったら、成功です。
もし、コンパイルできない場合は、いったんターミナルの再起動をしてみてください。
SIPを無効化する
もし、この時点でコンパイルできない場合は、以下の手順を試みてください。
ここが二つ目のネックとなりました。
Mac OS X El Capitanからの新機能であるSystem Integrity Protection (SIP)が有効になっていると、せっかくパスを通しても有効にならないようです。厄介な機能ですね。。。
以下の手順で無効化できます。
- Macをリカバリモードで再起動します。command + rを押しながら再起動することでリカバリモードとなります。
- 画面上部のメニューからユーティリティ -> ターミナルでターミナルを開いてください。
- 以下のコマンドを実行してください。
csrutil disable
これでもう一度Macを再起動してください。SIPが無効化されています。なお、一応SIPを無効化したことによってセキュリティ的には弱くなりましたのでご注意ください。
Eclipseでの設定
EclipseでMeCabを使用する場合は次の2つの設定が必要です。
MeCab.jarの追加
新規にJavaプロジェクトを作成するときは、ライブラリーの設定画面で外部Jar追加...をクリックして、/usr/local/bin/mecab-java/MeCab.jarを追加してください。
すでに存在するJavaプロジェクトに追加する場合は、プロジェクトのプロパティを開き、Javaのビルド・パス -> ライブラリーの画面を開きます。そして同じように、外部Jar追加...をクリックして、/usr/local/bin/mecab-java/MeCab.jarを追加してください。
環境変数の追加
環境タブを開き、新規をクリックして新しく環境変数を追加します。
これで設定完了です。MeCabが使用できるようになるはずです。
補足1)エラーが出る場合
以上までの流れを終えて、eclipseで実行した際にエラーが出る場合、以下の点を確認してください。
/usr/local/bin/mecab-javaに移動してください。
cd /usr/local/bin/mecab-java/
ファイルの一覧を確認して、libMeCab.dylibファイルがあるかを確認してください。もし、ファイル名がlibMeCab.soになっている場合は、拡張子を変更してlibMeCab.dylibにしてください。
mv libMeCab.so libMeCab.dylib
補足2)実際にコード内で使用するとき
直接この記事とは関係ありませんが、MeCabを使用する際にはソース内で初めにMeCabをロードしておかないと正常に使用できないようです。私はこの部分もまともに書けていなかったため、ハマってしまいました。
例えば以下のように書きます。
import org.chasen.mecab.*;
public class test {
static {
try {
System.loadLibrary("MeCab"); //ここでMeCabをロード
} catch (UnsatisfiedLinkError e) {
System.err.println("Cannot load the example native code.\nMake sure your LD_LIBRARY_PATH contains \'.\'\n" + e); //正常にMeCabをロードできなかった時
System.exit(1);
}
}
/***以下ソース本文***/
}