Amazon SageMaker の Jupyter で MeCab-NEologd を使う

# 概要

[Amazon SageMaker](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/whatis.html) の Jupyter Notebook ( Python3 ) で [MeCab](http://taku910.github.io/mecab/) ／ [NEologd](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md) を使うためのセットアップ手順です
基本は公式手順どおりですが、下記でエラー回避と便利設定を加えています

* 外部インターネットへ接続可能なノートブックインスタンスを使います
* 端的にはページ下部のライフサイクル設定だけ適用すれば使えます


# 手順

## Install mecab
ノートブックインスタンスの Jupyter をオープンし、Terminal から次を実行
（インストール作業を行う場所は任意、ここでは別途マウントした EFS を指定しています）

```
$ WORK_BASE="/efs"
$ MECAB_ROOT="${WORK_BASE}/mecab"
$ cd ${WORK_BASE}
$ git clone https://github.com/taku910/mecab.git
```

```
$ cd ${MECAB_ROOT}/mecab
$ ./configure --enable-utf8-only
$ make
$ make check
$ sudo make install
```

## Install mecab-ipadic 

```
$ cd ${MECAB_ROOT}/mecab-ipadic
$ ./configure --with-charset=utf8
$ make
$ sudo make install
```

### 動作確認
ここまででインスタンス上に Mecab がインストールされ、Terminal から動作確認できます

```
$ mecab 
徳川宗家の文化的貢献

徳川    名詞,固有名詞,人名,姓,*,*,徳川,トクガワ,トクガワ
宗家    名詞,一般,*,*,*,*,宗家,ソウケ,ソーケ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
文化    名詞,一般,*,*,*,*,文化,ブンカ,ブンカ
的      名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
貢献    名詞,サ変接続,*,*,*,*,貢献,コウケン,コーケン
EOS
```

## Install mecab-ipadic-NEologd 

Mecab 標準辞書だけでは新語に十分に対応できないため、カスタム辞書をセットアップします
ここではタイトル通り [mecab-ipadic-NEologd](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md) を使います

```
$ cd ${MECAB_ROOT}
$ git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
```

```
$ cd ${MECAB_ROOT}/mecab-ipadic-neologd
$ ./bin/install-mecab-ipadic-neologd -n -y
```

### 動作確認

標準辞書にない単語（ 徳川宗家 など）が固有名詞として認識されることを確認できます

```
$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
徳川宗家の文化的貢献

徳川宗家        名詞,固有名詞,一般,*,*,*,徳川宗家,トクガワソウケ,トクガワソーケ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
文化的  名詞,固有名詞,一般,*,*,*,文化的,ブンカテキ,ブンカテキ
貢献    名詞,サ変接続,*,*,*,*,貢献,コウケン,コーケン
EOS
```


## path setting

Jupyter Notebook 上の Python3 から利用するために、次のパス設定を事前に行っておきます

```
$ sudo ln -s /usr/libexec/gcc/x86_64-amazon-linux/4.8.5/cc1plus /usr/local/bin/
```

## Jupyter Notebook 上で動作確認

Jupyter Notebook（python3）で、下記をセルに入力して実行すると、Python コード上から Mecab が呼び出され　NEologd 辞書を使った形態素解析が実行できることが確認できます

```
!pip install --upgrade pip
!pip install mecab-python3
```

```python
import MeCab

tagger = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd')
input = 'MeCabは 京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。'
result = tagger.parse(input)
print(result)
```

![output jupyter-notebook](https://qiita-image-store.s3.amazonaws.com/0/35755/d05bdb83-46c6-5be1-c32e-5c91b89836d1.gif)


# ライフサイクル設定

ノートブックインスタンスを再起動させる（節約による停止／再開や、インスタンスタイプ変更などの理由で）と、インスタンスに加えたカスタマイズ情報はリセットされます

そのため、これまで書いたようなセットアップ手順をシェルスクリプトとして「ライフサイクル設定」に定義しておくと、同一設定を維持したり、他ノートブックで再利用したりできます（詳しい設定方法は [ノートブックインスタンスをカスタマイズする](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/notebook-lifecycle-config.html) や [ライフサイクル構成およびインターネットアクセスを無効にするオプションを使用して Amazon SageMaker ノートブックインスタンスをカスタマイズする](https://aws.amazon.com/jp/blogs/news/customize-your-amazon-sagemaker-notebook-instances-with-lifecycle-configurations-and-the-option-to-disable-internet-access/) を参照してください）

ここではライフサイクル設定（シェルスクリプト）の内容のみ記載します

```shell

# set Mecab / NEologd
DEFAULT_USER="ec2-user"
WORK_BASE="/efs"
MECAB_ROOT="${WORK_BASE}/mecab"

## download
if [ ! -d ${MECAB_ROOT} ]; then 
  sudo -u ${DEFAULT_USER} sh -c "cd ${WORK_BASE} && git clone https://github.com/taku910/mecab.git"
else
  sh -c "cd ${WORK_BASE} && git pull"
fi
if [ ! -d ${MECAB_ROOT}/mecab-ipadic-neologd ]; then
  sudo -u ${DEFAULT_USER} sh -c "cd ${MECAB_ROOT} && git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git"
else 
  sh -c "cd ${MECAB_ROOT} && git pull"
fi

## install
sudo -u ${DEFAULT_USER} sh <<-EOS
PATH=${PATH}:/usr/local/bin
cd ${MECAB_ROOT}/mecab && ./configure --enable-utf8-only && make
sudo make install
cd ${MECAB_ROOT}/mecab-ipadic && ./configure --with-charset=utf8 && make
sudo make install
cd ${MECAB_ROOT}/mecab-ipadic-neologd && ./bin/install-mecab-ipadic-neologd -n -y
EOS

# set mecab-python3
sudo ln -s /usr/libexec/gcc/x86_64-amazon-linux/4.8.5/cc1plus /usr/local/bin/
```

* ここまで書いてきた内容どおりです
* 例では [EFS](https://aws.amazon.com/jp/efs/) 領域にダウンロードするため、すでに存在する場合はダウンロードしないで `git pull` するようにしています


# 補足

Jupyter Notebook を利用する環境はいろいろ考えられますが、Amazon SageMaker は有力な選択肢だと思います．ちょっとした開発や検証を繰り返すようなケースであれば、高性能マシンを保有するより Amazon SageMaker で動的にリソース確保するほうが経済的です

何度も起動することを考えれば、Mecab 等のセットアップはライフサイクル設定で自動化するのがよさそうですね


# 参考資料

* [MeCab](http://taku910.github.io/mecab/)
* [NEologd](https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md)
* [AWS SageMakerのノートブックインスタンスにmecabをインストールする](https://qiita.com/airtanker/items/fbbdd1176dae9b6719b8)
* [MeCab と mecab-ipadic-NEologd と Python3 で形態素解析](https://www.saintsouth.net/blog/morphological-analysis-by-mecab-and-mecab-ipadic-neologd-and-python3/)
* [ノートブックインスタンスのカスタマイズ](https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/notebook-lifecycle-config.html)
* [Amazon SageMaker ノートブックインスタンスをカスタマイズする](https://aws.amazon.com/jp/blogs/news/customize-your-amazon-sagemaker-notebook-instances-with-lifecycle-configurations-and-the-option-to-disable-internet-access/)