いつもながら「Windows 奈良では」なアレだ。
my-mecab-userdict-build.py (GIST)は今や Rev21 にして:
- 複数入力を一括で処理出来る。
- 複数入力の場合、辞書のマージが出来る。
てとこまで進化させた。今回の話はまさにこの後者の話。
my-mecab-userdict-build.py は、例えばこんなふうに mecab のユーザ辞書を作れるわけね:
1 [me@host: ~]$ ls -1 *.csv
2 Noun.name.anime.csv
3 Noun.name.ero_voiceactors.csv
4 [me@host: ~]$ my-mecab-userdict-build.py *.csv \
5 > --model=mecab-ipadic-2.7.0-20070801.model \
6 > --merge-all=oresama.Noun.name
7 INFO:root:converting model 'mecab-ipadic-2.7.0-20070801.model' because those charsets are different (euc-jp -> utf-8)
8 INFO:root:processing input 'Noun.name.anime.csv'
9 INFO:root:processing input 'Noun.name.ero_voiceactors.csv'
10 C:\Users\HHSPRI~1\AppData\Local\Temp\_my_mecab_model_.model is not a binary model. reopen it as text mode...
11 reading C:\Users\HHSPRI~1\AppData\Local\Temp\oresama.Noun.name_0.csv ...
12 done!
13 reading C:\Users\HHSPRI~1\AppData\Local\Temp\oresama.Noun.name_1.csv ... 419
14 emitting double-array: 100% |###########################################|
15
16 done!
17 INFO:root:dictionary 'oresama.Noun.name.dic' was created.
--merge-all
を指定しない場合は Noun.name.anime.dic
、Noun.name.ero_voiceactors.dic
が素直に作られ、指定すればこの例のようにマージされた辞書(上の例の場合は oresama.Noun.name.dic
)を作る。
ここまでは良いのである。要は「手メンテ対象の csv (つまり「mecab-dict-indexへの入力」)」は保守しやすいように「小さく千切りたい」が、利用時にその単位が嬉しいかどうかは、ケースバイケースであろうということだ。この一連のネタで言い続けてる通り、「適用対象に相応しい辞書を使いたい/相応しくない辞書を使いたくない」が、特に「おれさま辞書」にとっては大事なわけだ。ワタシの例が「_ero」なのもちゃんと意味があるのだ。「健全な相手」に「AV女優辞書」はいらんのだし、18禁な相手に「地震火山用語辞書」はいらんのである。
さて。ここからが「Windows の地獄」の話。
Unix だとなんともシンプルな話で。それは mecab のユーザインターフェイスが Unix の以下と相性がいいからである:
- 「ホーム」といったらそれは「唯一無二のホーム」。
- その「唯一無二のホーム」配下に設定ファイルを置くのが標準。
- 「唯一無二のホーム」へ至るための便利なシェル機能。
mecab のヘルプ(抜粋):
1 [me@host: ~]$ mecab --help
2 MeCab: Yet Another Part-of-Speech and Morphological Analyzer
3
4 Copyright(C) 2001-2012 Taku Kudo
5 Copyright(C) 2004-2008 Nippon Telegraph and Telephone Corporation
6
7 Usage: c:\Program Files (x86)\MeCab\bin\mecab.exe [options] files
8 -r, --rcfile=FILE use FILE as resource file
9 -d, --dicdir=DIR set DIR as a system dicdir
10 -u, --userdic=FILE use FILE as a user dictionary
11 ... (snip) ...
rc ファイルを使いたいならば、たとえば (hhsprings というユーザとして):
1 dicdir = /usr/local/share/MeCab/dic/ipadic
2 userdic = /home/hhsprings/.mecab_mydic/Noun.name.anime.dic,/home/hhsprings/.mecab_mydic/Noun.name.ero_voiceactors.dic
-d
)。みたいに書いておき、これを /home/hhsprings/.mecabrc
とするならば、そしてワタシ(hhsprings)がこれを使うには:
- mecab に何も指示しなければ
/home/hhsprings/.mecabrc
に従ってくれる。 - 別バージョンの rcfile を書いておいて切り替えたい場合も、「ホーム配下」にあるなら簡単:
1 [me@host: ~]$ mecab --rcfile=~/.mecabrc_ero
とか。
- rcfile を書かずに直接辞書を指定するのでも、「ホーム配下」にあるなら簡単:
1 [me@host: ~]$ mecab --userdic=~/.mecab_mydic/Noun.name.anime.dic
とか。ワタシのスクリプトの
--merge-all
で辞書をまとめたいのは、まさにこれのため。
そう。以前「Windows では何種類にも派生しちゃう HOME、やぁねぇ」なんてのを書いた通りで:
- 「ホーム」なんて概念はあるようでなく、ないようであり、複雑な歴史的事情もあり、アプリケーションによってバラバラ。
- その「唯一無二のホーム」配下に設定ファイルを置くのが標準、なんてステキな慣習はない。
- 「唯一無二のホーム」へ至るための便利なシェル機能、なんかない。
一応最近の Windows の最近のアプリケーションならば、「Windows ネイティブのためのものならば」という前提付きで「c:/Users/hhsprings/AppData/Roaming
」(ワタシの場合ね)に置く「ものが比較的「少ないといえるほどではない」」。知ってると思うが Windows ネイティブのものに限っても Windows 9x 時代の名残でいまだに「マイドキュメント」に置く流儀もまだまだ多いし、「Unix 流儀の OSS」特に cygwin、MSYS、msys2 なんぞは「AppData? ナニソレたべれんの」とオレ流を貫いていて、彼ら独自の「ホーム」を持っている。
mecab は「独自のホーム」の中でも昔のものほど良く見られたタイプの「環境変数 HOME があれやごるぁ」式。apache web server なんかもそうだった気がするね。なので、そうした「古い Unix うまれの Windows 移植」の流儀に慣れている人はひょっとしたら自分で HOME をセットする癖が付いているかもしらんが、普通はそうじゃないので、普通は十中八九、環境変数 HOME は空である。
このねぇ、「環境変数 HOME をセットする」のってなかなか受け容れがたいものがあってな。特に「グローバルにセットしてしまう」のは正直言ってご勘弁である。ほかのどんなアプリケーションに悪影響を及ぼすかわかったもんじゃない。ただ、これをセットしとけば MSYS の bash もチルダで「その HOME」を参照するようにはなってくれる…:
1 [me@host: ~]$ # 以下は「MSYS 的 HOME を捨てる」決断となる。以降チルダはこの HOME に
2 [me@host: ~]$ # 展開されるが、MSYS ネイティブなやつでは逆に問題を起こすかもしれん。
3 [me@host: ~]$ export HOME=/c/Users/hhsprings/AppData/Roaming
4 [me@host: ~]$ mecab --userdic=~/Noun.name.ero_voiceactors.dic
コメントに書いた通りで、HOME をセットしなければ、MSYS は(たとえば) c:/msys/1.0/home/hhsprings
がホームだと思っている。だから MSYS ネイティブのコマンド群の設定ファイル系は、ほっとけばそこを見に行く。つまり HOME をセットしてしまうとそれら全部を捨ててしまいかねない。だからさぁ… .bashrc
とかに書くのはちょっと勇気いるんだよなぁ…。
HOME を設定すれば済むんであれば、その MSYS 流儀のホームをセットしとく手もないではないんだけれど、これはこれで emacs の Windows 版公式バイナリが「c:/Users/hhsprings/AppData/Roaming
」をちゃんと知ってて MSYS のは当然知らないという問題があって、emacs から簡単にその .mecabrc にたどり着けなくなっちゃう。これもウザい。
そして、Unix では得てして救世主になりうる「リンク」も「MSYS の ln」で書いた通り、Windows では「半分しか救世主にならない」。うーん、まぁハードリンクは手なんだけどさ、「~/.mecab_mydic/」というディレクトリを掘った場合、これの「シンボリックリンク」を作れないのでね…。
まぁなんというか「Windows はめんどい」というだけのネタ、でしたとさ。をしまい。