Mac OS Xにmecab-ipadic-NEologdをインストールしてScalaで形態素解析を行うための作業手順

タイトル通りです。簡単かと思いきや結構大変でした(-_-;)

下記の手順は多分El Capitanでもオッケーだと思いますが、Yosemiteでしか試しておりませんのでご注意ください。

# Macにmecab-ipadic-NEologdをインストール

```
# mecabや依存ライブラリをインストール
brew install mecab mecab-ipadic git curl xz

# mecabのバージョン確認
mecab -v
> mecab of 0.996
			
# mecabの動作確認
echo "アラレちゃん" | mecab
> アラレ	名詞,一般,*,*,*,*,*
> ちゃん	名詞,接尾,人名,*,*,*,ちゃん,チャン,チャン
	
# mecab-ipadic-NEologdのインストールと更新(/path/to/workは任意のディレクトリ)
cd /path/to/work
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
cd mecab-ipadic-neologd
./bin/install-mecab-ipadic-neologd -n
			
# インストール先を確認
echo `mecab-config --dicdir`"/mecab-ipadic-neologd"
> /usr/local/lib/mecab/dic/mecab-ipadic-neologd

# ノーマルなmecabとNEologdを使用した場合の結果を比較
echo "アラレちゃん" | mecab
> アラレ	名詞,一般,*,*,*,*,*
> ちゃん	名詞,接尾,人名,*,*,*,ちゃん,チャン,チャン

echo "アラレちゃん" | mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
> アラレちゃん	名詞,固有名詞,一般,*,*,*,アラレちゃん,アラレチャン,アラレチャン
```

# MeCabのJavaバインディングをインストール

[こちら](http://taku910.github.io/mecab/#download)のページにJavaバインディングのダウンロード先のリンクが貼られているので、インストールしたMeCabと同じバージョンのJavaバインディングファイルをダウンロードしてください。

(この記事執筆時点でのダウンロード先は[こちら](https://drive.google.com/drive/folders/0B4y35FiV1wh7fjQ5SkJETEJEYzlqcUY4WUlpZmR4dDlJMWI5ZUlXN2xZN2s2b0pqT3hMbTQ)になります)

ここでは「mecab-java-0.996.tar.gz」を「/path/to/work」ディレクトリにダウンロードしたという前提で説明を続けます。

```
# ダウンロードしたファイルを解凍
cd /path/to/work
tar zxfv mecab-java-0.996.tar.gz

# Makefileを編集
cd mecab-java-0.996
vi Makefile
			
  # 6行目の「Include」を下記のように変更。(「MacOSX10.10.sdk」の部分はOSのバージョンによって異なる)
  #INCLUDE=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/
				
  # 16行目を下記のように変更(Macでは.soファイルではなく.dylibファイルを出力する必要がある)
  $(CXX) -shared  $(TARGET)_wrap.o -o lib$(TARGET).dylib $(LIBS)
				
  # 25行目を下記のように変更(ここは不要かも)
  rm -fr *.jar *.o *.dylib *.class $(PACKAGE)/*.class

# make実行			
sudo make

# MeCab.jar等が作業ディレクトリ内に作成されていることを確認する。
ls -al
			
# 文字化け対策でjavaコマンドにエイリアスを設定(この作業は不要かもしれませんが一応)
vi ~/.bash_profile
				
  alias javac 'javac -encoding UTF-8 -J-Dfile.encoding=UTF-8'
  alias java 'java -Dfile.encoding=UTF-8'

source ~/.bash_profile
	
# ダウンロードしたファイルに含まれているテスト用プログラムをコンパイルして実行
rm -f ./test.class
javac ./test.java
java test
> 太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
> は	助詞,係助詞,*,*,*,*,は,ハ,ワ
> 二郎	名詞,固有名詞,人名,名,*,*,二郎,ジロウ,ジロー
> に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
> この	連体詞,*,*,*,*,*,この,コノ,コノ
> 本	名詞,一般,*,*,*,*,本,ホン,ホン
> を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
> 渡し	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
> た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
> 。	記号,句点,*,*,*,*,。,。,。
```

# ScalaからMeCabを使用する

```
# sbtのプロジェクトを作成して、プロジェクトルートの直下にlibディレクトリを作成
mkdir lib

# MeCab.jarファイルをlibディレクトリにコピー
cp /path/to/work/mecab-java-0.996/MeCab.jar ./lib

# 設定をリロード(アンマネージ依存性が読み込まれる・・・はず)
sbt reload
```
			
下記のようなscalaのプログラムを作成

```scala:src/main/scala/MecabSample.scala
package com.polysoft

import org.chasen.mecab.Tagger

object MecabSample {
  def main(args: Array[String]) = {
    System.load("/path/to/work/mecab-java-0.996/libMecab.dylib")
    val tagger = Tagger.create("-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd")
    println(tagger.parse("アラレちゃん"))
  }
}
```

```
# 実行
sbt run
> アラレちゃん	名詞,固有名詞,一般,*,*,*,アラレちゃん,アラレチャン,アラレチャン
```

# 備考

MacではJNIのライブラリファイルの拡張子は`.so`ではなくて`.dylib`を使う必要があるのでご注意ください。(ここで結構ハマりました)

また、[こちら](http://stackoverflow.com/questions/10761166/integrating-native-system-libraries-with-sbt)の情報によると、SBTやIntellijを使う場合に`System.loadLibrary`でMeCabのライブラリをロードしようとすると結構大変らしいので、上記のサンプルでは`System.load`を使用しています。

> As you've alluded to, messing with java.library.path can be annoying in terms of configuring SBT and Eclipse, and I do not think it's possible to do automatically for an executable jar.

また、OS X El Capitanで`System.loadLibrary`を使おうとすると、OS X El Capitanから導入されたSystem Integrity Protection (SIP)の関係でかなり面倒なことになるようなので、`System.load`を使っておいた方が良さそうな印象です。

# 参考資料

[mecab-ipadic-neologd/README.ja.md](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md)

[MeCab: Yet Another Part-of-Speech and Morphological Analyzer](			http://taku910.github.io/mecab/#download)
			
[Mac OS X El CapitanでMeCabのJavaバインドを使用する - Qiita](			http://qiita.com/tekunikaruza/items/f815446beead71b7be4a)
			
[MacでMeCabのJavaバインドを使用する - tSeiya's blog](			http://tseiya.hatenablog.com/entry/2012/02/14/154150)
			
[MeCab:Javaバインディング開発環境構築、実装参考ページ等 - Qiita](http://qiita.com/YasuyukiKawai/items/13d669556ec1ea15f9ae)

[MeCab のJava バインディングをMacOSX10.8.3(Mountain Lion) でScala から使う — kenkovlog](			http://blog.kenkov.jp/2013/04/04/mecab_scala.html)
			
[scalaとJavaからMeCabを食べてみよう - しがないまんとはなんですと！](			http://shiganaiman.hatenablog.com/entry/2012/01/31/174635)
			
[scala - Integrating native system libraries with SBT - Stack Overflow](			http://stackoverflow.com/questions/10761166/integrating-native-system-libraries-with-sbt)