CentOS/UbuntuにMeCab(とipadicとneologdとpythonのmecabモジュール)を丁寧にインストールする。

# はじめに
MeCabは各種パッケージマネージャでも提供されていますが、PythonやGoなど各言語のバインディング利用時にライブラリのリンクエラーなど発生しがちです。

Mecab本体や関連辞書をソースコードから適宜オプションを指定してインストールすることにより、どんなファイルを何処にインストールしたかが明確になり、リンクライブラリの指定エラーなどに対して適切に対応できるようになります。

### 作業方針
・UTF-8対応として本体、辞書共にソースコードから設定（configure）およびビルドします。
・MeCab本体は「/opt/mecab」以下にインストールします。
・標準辞書のipadicは「/opt/mecab/lib/mecab/dic/ipadic」にインストールします。
・拡張辞書のNeologdは「/opt/mecab/lib/mecab/dic/neologd」にインストールします。

CentOS7.6で確認していますが、Debian系でもBuildに必要なパッケージ名を多少読み替えれば同じ手順でインストールできます。手元のUbuntu18.04では追加パッケージなしで、このページの方法のままインストールできました。(逐一調べていませんが、普通のgcc環境が入っていればbuild関連のパッケージ追加は必要なさそうです。)

次のサイトなどを参考にしています。
https://omohikane.com/centos7_mecab_neologd/
http://next49.hatenadiary.jp/entry/20120215/p1
https://qiita.com/sogawa@github/items/fd9bdaf8df27335f9a65

# 環境

次の環境で作業しています。

```{shell}
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```

```{shell}
# python -V
Python 3.6.2
```

# MeCabをインストール

インストール先は
/opt/mecab
とします。

```{shell}
# 関連ライブラリのインストール
sudo yum install -y  bzip2 bzip2-devel gcc gcc-c++ git make wget curl openssl-devel readline-devel zlib-devel patch file

# 作業フォルダを作成して移動
mkdir -p ~/source/mecab
cd ~/source/mecab

# ソースをダウンロードして解凍して移動
wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7cENtOXlicTFaRUE' -O mecab-0.996.tar.gz
tar zxvf mecab-0.996.tar.gz
cd mecab-0.996

# インストール先フォルダを作成
sudo mkdir -p /opt/mecab

# configure(コンパイルのための設定)を実行し、コンパイルしてインストール
./configure --prefix=/opt/mecab --with-charset=utf8 --enable-utf8-only
make
sudo make install
```

インストールしたmecabの実行ファイル(のあるフォルダ)をパスに追加する。

```{shell}
# fish shellの場合
echo "set -x PATH /opt/mecab/bin \$PATH" >> ~/.config/fish/config.fish
source ~/.config/fish/config.fish

# bashの場合
echo "export PATH=/opt/mecab/bin:\$PATH" >> ~/.bashrc
source ~/.bashrc
```

インストールしたmecabのライブラリにリンクを張る。
2020/03/19 コマンドを更新（参考：https://qiita.com/sogawa@github/items/fd9bdaf8df27335f9a65 )

```{shell}

# sudo bash -c "echo \"/opt/mecab/lib\" > /etc/ld.so.conf.d/libmecab.conf"
mecab-config --libs-only-L | sudo tee /etc/ld.so.conf.d/mecab.conf
sudo ldconfig
```

# ipadic(標準辞書)をインストールする

MeCabのインストール先に準じて、
/opt/mecab/lib/mecab/dic/ipadic/
にインストールされます

```{shell}
# 作業フォルダを作成して移動
mkdir ~/source/mecab-ipadic
cd ~/source/mecab-ipadic

# 辞書ファイルを取得して解凍して移動
wget 'https://drive.google.com/uc?export=download&id=0B4y35FiV1wh7MWVlSDBCSXZMTXM' -O mecab-ipadic-2.7.0-20070801.tar.gz
tar zxvf mecab-ipadic-2.7.0-20070801.tar.gz
cd mecab-ipadic-2.7.0-20070801

# 設定してmakeしてインストール
./configure --with-mecab-config=/opt/mecab/bin/mecab-config --with-charset=utf8
make
sudo make install
```

# ipadicの確認

```{shell}
# 次のコマンドを入力
mecab -d /opt/mecab/lib/mecab/dic/ipadic

# コマンド入力後、何も表示されないですがそのまま次の文章を入力
# "ff14の大会に参加したい"

# 次のように出力されれば成功
ff      名詞,一般,*,*,*,*,*
14      名詞,数,*,*,*,*,*
の      助詞,連体化,*,*,*,*,の,ノ,ノ
大会    名詞,一般,*,*,*,*,大会,タイカイ,タイカイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
参加    名詞,サ変接続,*,*,*,*,参加,サンカ,サンカ
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
たい    助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
EOS
```

# Neologd(拡張辞書)をインストール

次のパスへインストールします。
/opt/mecab/lib/mecab/dic/neologd

```{shell}
# 作業フォルダに移動してファイルを取得
cd ~/source
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git

# 設定とともにインストールを実行
./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd -n -y -p /opt/mecab/lib/mecab/dic/neologd
```

次のエラーが出た場合はyumでpatchやfileをインストール

```{shell}
[install-mecab-ipadic-NEologd] :     patch is not found.

-> sudo yum install patch
```

```{shell}
[install-mecab-ipadic-NEologd] :     file is not found.

-> sudo yum install file
```

# Neologdの確認

```{shell}
# 次のコマンドを入力
mecab -d /opt/mecab/lib/mecab/dic/neologd

# コマンド入力後、何も表示されないですがそのままipadicと同じ文章を入力
# "ff14の大会に参加したい"

# 次のように出力されれば成功
ff14    名詞,固有名詞,一般,*,*,*,FF14,エフエフジュウヨン,エフエフジュウヨン
の      助詞,連体化,*,*,*,*,の,ノ,ノ
大会    名詞,一般,*,*,*,*,大会,タイカイ,タイカイ
に      助詞,格助詞,一般,*,*,*,に,ニ,ニ
参加    名詞,サ変接続,*,*,*,*,参加,サンカ,サンカ
し      動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
たい    助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ
EOS

# ゲームの「ff14」が固有名詞になっています。
# その他「ぴこ太郎」「東京五輪」などでも違いがでるようです。
```


# mecab-pythonをインストール

次のコマンドでインストール

```{shell}
pip install mecab-python3
```

次のエラーが発生した場合、Mecabのインストール先をパスに追加する処理に失敗している可能性があります。

```{shell}
Collecting mecab-python3
Using cached https://files.pythonhosted.org/packages/ac/48/295efe525df40cbc2173748eb869290e81a57e835bc41f6d3834fc5dad5f/mecab-python3-0.996.1.tar.gz
Complete output from command python setup.py egg_info:
/bin/sh: mecab-config: command not found
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-kdsplcnj/mecab-python3/setup.py", line 29, in <module>
inc_dir = mecab_config("--inc-dir")
File "/tmp/pip-build-kdsplcnj/mecab-python3/setup.py", line 27, in mecab_config
return os.popen("mecab-config " + arg).readlines()[0].split()
IndexError: list index out of range

----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-kdsplcnj/mecab-python3/
```

次のエラーが発生した場合、swigをインストールしてください。

```{shell}
    running install
    running build
    running build_py
    running build_ext
    building '_MeCab' extension
    swigging MeCab.i to MeCab_wrap.cpp
    swig -python -shadow -c++ -I/opt/mecab/include -o MeCab_wrap.cpp MeCab.i
    unable to execute 'swig': No such file or directory
    error: command 'swig' failed with exit status 1
```

swigのインストール

```{shell}
sudo yum install swig
```

# mecab-pythonの確認

確認用スクリプトを作成

```{shell:sample-mecab.py}
import MeCab
tagger = MeCab.Tagger("-d /opt/mecab/lib/mecab/dic/ipadic -Owakati")
text = "これはMeCab+Neologdの実験です。"
wakati = tagger.parse(text)

print(wakati)
```

実行結果

```{shell}
python mecab-test.py
# 次のように出力されれば成功
これ は MeCab + Neologd の 実験 です 。
```

以上で作業は終了です。

もしimportの部分で次のエラーが発生したら、前出のライブラリのリンクに失敗している可能性があります。

```{shell}
Traceback (most recent call last):
  File "./sample-mecab.py", line 1, in <module>
    import MeCab
  File "/home/dev-user/.pyenv/versions/api-env-3.6.2/lib/python3.6/site-packages/MeCab.py", line 26, in <module>
    _MeCab = swig_import_helper()
  File "/home/dev-user/.pyenv/versions/api-env-3.6.2/lib/python3.6/site-packages/MeCab.py", line 22, in swig_import_helper
    _mod = imp.load_module('_MeCab', fp, pathname, description)
  File "/home/dev-user/.pyenv/versions/3.6.2/lib/python3.6/imp.py", line 242, in load_module
    return load_dynamic(name, filename, file)
  File "/home/dev-user/.pyenv/versions/3.6.2/lib/python3.6/imp.py", line 342, in load_dynamic
    return _load(spec)
ImportError: libmecab.so.2: cannot open shared object file: No such file or directory
```