Windows 10/MSYS2でのMeCab/mecab-ipadic-NEologd環境構築メモ


目的
============================================================

- 64bit版 Windows 10 で Python 3 (Anaconda) から MeCab を利用する。
- MeCabのユーザー辞書を作成する。
- MSYS2環境でmecab-ipadic-NEologd辞書をコンパイルする。
- ライセンスを確認する。


MeCabのインストール
============================================================

前準備
------------------------------

MSYS2環境を構築する。以下のURLを参照。

- MSYS2によるWindows 10でのBash環境構築メモ https://qiita.com/s14stat/items/958fff68ee682208c685

作業しやすいように、Windowsエクスプローラーで `C:\ProgramData` フォルダ（環境変数`%ALLUSERSPROFILE%`の値）を可視にする（任意）。以下の手順で行う。

1. エクスプローラーで、`C:\`を表示する。
2. エクスプローラーの設定で、隠しアイテムを表示するよう変更する。
3. `ProgramData`フォルダのアイコンを選択してプロパティ画面を表示し、可視に設定する。
4. エクスプローラーの設定で、隠しアイテムを非表示に戻す。

MeCabのインストール
------------------------------

MeCabには公式の64bit版バイナリがない。そこで、良く知られた64bit版ビルドを使用する。
https://github.com/ikegami-yukino/mecab/releases

インストーラーを管理者権限で実行する。設定をデフォルトから以下のように変更する。

- Dictionary Charset
    - UTF-8（Pythonとの連携のため）
- Destnation Location
    - `C:\ProgramData\MeCab`（デフォルトの `C:\Program Files\MeCab` を変更する。パスに空白文字が入らないようにすることがポイント。）
- Start Menu Folder
    - Don't create をチェック（たぶんここから実行することはないので、意図せず実行するリスクを防ぐ。）
- Permit all users to run MeCab
    - Yes

Windowsのシステム環境変数`PATH`に `C:\ProgramData\MeCab\bin` を追加する。

エクスプローラーで、`C:\ProgramData\MeCab\bin` フォルダのプロパティを開き、そのフォルダと配下のすべてのアイテムに対して`Users`グループ（あるいは辞書を作成するユーザーまたはグループ）にフルコントロールを与える。

MeCabの動作確認をする。辞書をUTF8としてインストールしたことに合わせ、コマンドプロンプトの文字セットも`CHCP`コマンドでUTF8に変更する。

```console:コマンドプロンプト
CHCP 65001
ECHO "今日もしないとね。" | mecab
ECHO "5月から令和です" | mecab
ECHO "(03)1234-5678" | mecab
```

Pythonの設定
------------------------------

Pythonライブラリの管理のため、管理者権限でコマンドプロンプトを起動する。新しいPython環境を作成して、MeCabのためのライブラリをインストールする。

```console:コマンドプロンプト（管理者権限）
CHCP 65001
conda create --name testmecab python=3.7
conda.bat activate testmecab
conda update --all
pip install mecab-python-windows
```

PythonからMeCabが呼び出せることの確認をする。Pythonで以下を実行する。

```python:Python
import MeCab
t = MeCab.Tagger("-O chasen")
print(t.parse("今日もしないとね。"))
print(t.parse("5月から令和です"))
print(t.parse("(03)1234-5678"))
```


ユーザー辞書の作成
============================================================

辞書の作成は、Bash環境で行う。MSYS2のBashシェルを起動する。

```console:コマンドプロンプト
CHCP 65001
CALL "C:\msys64\msys2_shell.cmd" -mingw64 -defterm -here -full-path -no-start
```

辞書のソースファイルを作成する。辞書のソースファイルのフォーマットは以下の通り。コストは、小さいほど出現しやすいことを示す。詳細はMeCabのマニュアルを参照。

```
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音
```

以下に例を示す。

```bash:Bash
# ユーザー辞書の作成
MECAB_DIC_DIR_SYS="/c/ProgramData/MeCab/dic/ipadic/"
MECAB_DIC_DIR_USER="/c/ProgramData/MeCab/dic/user/"
function make_and_install_dic() {
    local dic_file="${1}.dic"
    local csv_file="$(ls ${1}-dict-seed*.csv)"
    mecab-dict-index \
        --dicdir="${MECAB_DIC_DIR_SYS}" \
        --userdic="${dic_file}" \
        --dictionary-charset=utf-8 \
        --charset=utf-8 \
        "${csv_file}"
    mkdir --parents "${MECAB_DIC_DIR_USER}"
    cp --force --verbose "${dic_file}" "${MECAB_DIC_DIR_USER}"
}
rm -f user-dict-seed.csv
echo '牛五郎,,,1000,名詞,固有名詞,人名,名,*,*,牛五郎,ウシゴロウ,ウシゴロー' >>user-dict-seed.csv
make_and_install_dic user

# 結果（ユーザー辞書なし）
echo "牛五郎さん" | mecab

# 結果（ユーザー辞書あり）
echo "牛五郎さん" | mecab -u /c/ProgramData/MeCab/dic/user/user.dic
```


mecab-ipadic-NEologdのインストール（システム辞書）
============================================================

良く知られた新語辞書であるmecab-ipadic-NEologdをインストールする。

Webで検索すると、Windows Subsystem for Linuxを利用してmecab-ipadic-NEologd付属のインストーラを実行する方法が提案されている。しかし、企業端末のように、Windows Subsystem for Linuxが利用できない環境もあるだろう。そこで、ここではMSYS2を利用したインストール手順を整理する。

`mecab-config`コマンドの作成
------------------------------

先にインストールしたMeCabのWindowsビルドには`mecab-config`コマンド（実体はシェルスクリプト）が含まれていない。そこで、以下のファイルを自分で作成する。

```bash:C&#058;\ProgramData\MeCab\bin\mecab-config
#!/bin/bash

prefix="$(dirname "$(dirname "$(which mecab)")")"

usage()
{
    cat <<EOF
Usage: mecab-config [OPTIONS]

Options:
  [--dicdir]
  [--libexecdir]
  [--sysconfdir]
  [--help]
  [--version]
EOF

    exit $1
}

if test $# -eq 0; then
    usage 1
fi

while test $# -gt 0; do
    case "$1" in
    --version)
        echo 0.996-custom
        exit 0
        ;;

    --help)
        usage 0
        ;;

    --dicdir)
        echo ${prefix}/dic
        ;;

    --libexecdir)
        echo ${prefix}/bin
        ;;
        
    --sysconfdir)
        echo ${prefix}/etc
        ;;

    *)
        usage
        exit 1
        ;;
    esac
    shift
done

exit 0
```

インストール
------------------------------

Bash環境に入る。まず、必要なツールがまだなければ、ここでインストールする。

```bash:Bash
### Gitのインストール
pacman --sync ca-certificates
pacman --sync git
git --version

### Make、Diff等の各種ツールのインストール
pacman --sync base-devel
```

mecab-ipadic-NEologdをダウンロードする。

```bash:Bash
mkdir -p ~/mecab
cd ~/mecab
rm -rf mecab-ipadic-neologd
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
```

次に、シェルスクリプトを以下のように修正する。

```bash:mecab-ipadic-neologd\libexec\make-mecab-ipadic-neologd.sh
...前略...
echo "${ECHO_PREFIX} Re-Index system dictionary"
mv -f dicrc dicrc.old                       # 追加
sed -e 's/EUC-JP/UTF8/' dicrc.old >dicrc    # 追加
${MECAB_LIBEXEC_DIR}/mecab-dict-index -f UTF8 -t UTF8
...後略...
```

そして、以下を実行する。MSYS2の`curl`コマンドがうまく動作しないので、使わなくて済むように`--forceyes`を付けた。

```bash:Bash
./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd --newest --install_all_seed_files --forceyes
```

コマンドラインでの動作確認を行う。`-d`オプションでシステム辞書を切り替えている。

```bash:Bash
### 新語の確認
echo "5月から令和です" | mecab
echo "5月から令和です" | mecab -d /c/ProgramData/MeCab/dic/mecab-ipadic-neologd

### 半角記号の品詞の修正
echo "(03)1234-5678" | mecab
echo "(03)1234-5678" | mecab -d /c/ProgramData/MeCab/dic/mecab-ipadic-neologd
```

先ほど作成したPython環境`testmecab`で、Pythonでの動作確認を行う。コードの中で `MeCab.Tagger()` の引数で辞書ファイルのパスを指定しているが、ここでうまく空白文字を渡す方法が分からないので、辞書ファイルはパスに空白文字を含まない場所に置く必要がある。

```python:Python
import MeCab
t = MeCab.Tagger(r'-O chasen -d C:\ProgramData\MeCab\dic\mecab-ipadic-neologd')
print(t.parse("5月から令和です"))
print(t.parse("(03)1234-5678"))
```


mecab-ipadic-NEologdのインストール（ユーザー辞書）
============================================================

別の方法として、mecab-ipadic-NEologdをユーザー辞書として追加する。先ほど示した`git clone`に続けて、以下を実行する。

```bash:Bash
cd ~/mecab
cd mecab-ipadic-neologd/seed
xz --decompress --keep --verbose *.xz
MECAB_DIC_DIR_SYS="/c/ProgramData/MeCab/dic/ipadic/"
MECAB_DIC_DIR_USER="/c/ProgramData/MeCab/dic/user-neologd/"
function make_and_install_dic() {
    local csv_file="$(ls ${1}-dict-seed*.csv)"
    local dic_file="${1}.dic"
    mecab-dict-index \
        --dicdir="${MECAB_DIC_DIR_SYS}" \
        --userdic="${dic_file}" \
        --dictionary-charset=utf-8 \
        --charset=utf-8 \
        "${csv_file}"
    mkdir --parents "${MECAB_DIC_DIR_USER}"
    cp --force --verbose "${dic_file}" "${MECAB_DIC_DIR_USER}"
}
make_and_install_dic mecab-user
make_and_install_dic neologd-adjective-exp
make_and_install_dic neologd-adjective-std
make_and_install_dic neologd-adjective-verb
make_and_install_dic neologd-adverb
make_and_install_dic neologd-common-noun-ortho-variant
make_and_install_dic neologd-date-time-infreq
make_and_install_dic neologd-ill-formed-words
make_and_install_dic neologd-interjection
make_and_install_dic neologd-noun-sahen-conn-ortho-variant
make_and_install_dic neologd-proper-noun-ortho-variant
make_and_install_dic neologd-quantity-infreq
```

動作確認。引数でユーザー辞書を指定する。

```bash:Bash
echo "5月から令和です" | mecab -u "C:\ProgramData\MeCab\dic\user-neologd\mecab-user.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-adjective-exp.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-adjective-std.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-adjective-verb.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-adverb.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-common-noun-ortho-variant.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-date-time-infreq.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-ill-formed-words.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-interjection.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-noun-sahen-conn-ortho-variant.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-proper-noun-ortho-variant.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-quantity-infreq.dic"
```

Pythonでの動作確認。

```python:Python
import MeCab
t = MeCab.Tagger(r'-O chasen -u C:\ProgramData\MeCab\dic\user-neologd\mecab-user.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-adjective-exp.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-adjective-std.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-adjective-verb.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-adverb.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-common-noun-ortho-variant.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-date-time-infreq.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-ill-formed-words.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-interjection.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-noun-sahen-conn-ortho-variant.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-proper-noun-ortho-variant.dic,C:\ProgramData\MeCab\dic\user-neologd\neologd-quantity-infreq.dic')
print(t.parse("5月から令和です"))
```


Tips
============================================================

Pythonで、MeCabの設定を`MeCab.Tagger()`の引数にいつも書くのが面倒であれば、MeCabの設定ファイルに記述する方法がある。MeCabは設定ファイルを以下の順に探す。

1. `~/.mecabrc`
2. `C:\ProgramData\MeCab\etc\mecabrc`（MeCabインストールフォルダの下）

MeCabは入力テキストの正規化を行わない。必要ならMeCabのユーザー側で行う必要がある。以下のサイトが参考になる。

- 解析前に行うことが望ましい文字列の正規化処理
  https://github.com/neologd/mecab-ipadic-neologd/wiki/Regexp.ja
- 自然言語処理の前処理・素性いろいろ
  http://yukinoi.hatenablog.com/entry/2018/05/29/120000
- mecab-neologd 前処理用 Python モジュール neologdn 公開しました
  http://yukinoi.hatenablog.com/entry/2015/10/11/205006


ライセンス
============================================================

- オリジナルのMeCab
    - http://taku910.github.io/mecab/
    - 作者は工藤 拓（taku910）さん。
    - ライセンス保有者は作者と日本電信電話で、現在のライセンス形式は、GPL, LGPL, or BSDのトリプルライセンス。

- MeCabの64bit版ビルド（ikegami-yukino版）
    - https://github.com/ikegami-yukino/mecab
    - yukinoiさんが公開している。
    - MeCabと同じライセンス。

- mecab-python-windows
    - https://pypi.org/project/mecab-python-windows/
    - MeCabの64bit版ビルドのyukinoiさんが公開している。
    - ライセンスはMeCabの工藤さんに帰されており、ライセンス形式はLGPL or BSD。

- この記事中の`mecab-config`スクリプト（およびこの記事全体）
    - スクリプトはオリジナルのMeCabに付属する`mecab-config`に基づくためMeCabと同じライセンス形式、またはパブリックドメインで。ご自由に。

- IPA辞書（Windows版MeCabに付属）
    - 作者はMeCabの工藤さんをはじめとするチーム（AUTHORSファイル参照）。
    - ライセンス保有者は奈良先端科学技術大学院大学。ライセンス形式は独自（COPYINGファイル参照）。ライセンスの一部に「ICOT無償公開ソフトウェアの利用条件」に由来する条項（いわゆる「ICOT条項」）を含む。（ICOTは、新世代コンピュータ技術開発機構という過去に存在した公的機関。）Open Source InitiativeやFree Software Foundationなどの知られた機関によって公的にレビューされたライセンスではない。だが、実質的にpermissiveなfree softwareのようだ。
    - 辞書名の由来は、辞書がIPAコーパスに基づいて開発されたことにあるようだ。ただし、ライセンスにIPA（情報処理振興事業協会、今の情報処理推進機構）の名前はない。

- mecab-ipadic-NEologd辞書
    - https://github.com/neologd/mecab-ipadic-neologd
    - 作者はoverlastさん。
    - ライセンス保有者は作者で、作者はライセンス形態を Apache License, Version 2.0 としている。作者は、「最終的に Apache License version 2.0 に（中略）なるような採録基準や判定をしている」と述べている。
      https://overlast.github.io/pdf/2017-03-06_corpus_sympo.pdf
    - この開発にはWebおよびその他のさまざまな言語資源が利用されている。その一部はCOPYINGファイルに記載されているが、すべては明らかにされていない。

おわり。