目的
- 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%
の値)を可視にする(任意)。以下の手順で行う。
- エクスプローラーで、
C:\
を表示する。 - エクスプローラーの設定で、隠しアイテムを表示するよう変更する。
-
ProgramData
フォルダのアイコンを選択してプロパティ画面を表示し、可視に設定する。 - エクスプローラーの設定で、隠しアイテムを非表示に戻す。
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に変更する。
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で以下を実行する。
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,活用型,活用形,原形,読み,発音
以下に例を示す。
# ユーザー辞書の作成
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
コマンド(実体はシェルスクリプト)が含まれていない。そこで、以下のファイルを自分で作成する。
#!/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環境に入る。まず、必要なツールがまだなければ、ここでインストールする。
### Gitのインストール
pacman --sync ca-certificates
pacman --sync git
git --version
### Make、Diff等の各種ツールのインストール
pacman --sync base-devel
mecab-ipadic-NEologdをダウンロードする。
mkdir -p ~/mecab
cd ~/mecab
rm -rf mecab-ipadic-neologd
git clone --depth 1 https://github.com/neologd/mecab-ipadic-neologd.git
次に、シェルスクリプトを以下のように修正する。
...前略...
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
を付けた。
./mecab-ipadic-neologd/bin/install-mecab-ipadic-neologd --newest --install_all_seed_files --forceyes
コマンドラインでの動作確認を行う。-d
オプションでシステム辞書を切り替えている。
### 新語の確認
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()
の引数で辞書ファイルのパスを指定しているが、ここでうまく空白文字を渡す方法が分からないので、辞書ファイルはパスに空白文字を含まない場所に置く必要がある。
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
に続けて、以下を実行する。
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
動作確認。引数でユーザー辞書を指定する。
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での動作確認。
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は設定ファイルを以下の順に探す。
~/.mecabrc
-
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と同じライセンス形式、またはパブリックドメインで。ご自由に。
- スクリプトはオリジナルの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ファイルに記載されているが、すべては明らかにされていない。
おわり。