6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-04-20

目的

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

MeCabのインストール

前準備

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

作業しやすいように、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のシステム環境変数PATHC:\ProgramData\MeCab\bin を追加する。

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

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

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

Pythonの設定

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

コマンドプロンプト(管理者権限)
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
import MeCab
t = MeCab.Tagger("-O chasen")
print(t.parse("今日もしないとね。"))
print(t.parse("5月から令和です"))
print(t.parse("(03)1234-5678"))

ユーザー辞書の作成

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

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

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

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

以下に例を示す。

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コマンド(実体はシェルスクリプト)が含まれていない。そこで、以下のファイルを自分で作成する。

C:\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
### Gitのインストール
pacman --sync ca-certificates
pacman --sync git
git --version

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

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

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

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

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
./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd --newest --install_all_seed_files --forceyes

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

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
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
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
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
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のユーザー側で行う必要がある。以下のサイトが参考になる。

ライセンス

  • オリジナルのMeCab

    • http://taku910.github.io/mecab/
    • 作者は工藤 拓(taku910)さん。
    • ライセンス保有者は作者と日本電信電話で、現在のライセンス形式は、GPL, LGPL, or BSDのトリプルライセンス。
  • MeCabの64bit版ビルド(ikegami-yukino版)

  • mecab-python-windows

  • この記事中の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ファイルに記載されているが、すべては明らかにされていない。

おわり。

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?