どうせ和布蕪るなら、続き (rcファイルか -u オプションか)

いつもながら「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.dicNoun.name.ero_voiceactors.dic が素直に作られ、指定すればこの例のようにマージされた辞書(上の例の場合は oresama.Noun.name.dic)を作る。

ここまでは良いのである。要は「手メンテ対象の csv (つまり「mecab-dict-indexへの入力」)」は保守しやすいように「小さく千切りたい」が、利用時にその単位が嬉しいかどうかは、ケースバイケースであろうということだ。この一連のネタで言い続けてる通り、「適用対象に相応しい辞書を使いたい/相応しくない辞書を使いたくない」が、特に「おれさま辞書」にとっては大事なわけだ。ワタシの例が「_ero」なのもちゃんと意味があるのだ。「健全な相手」に「AV女優辞書」はいらんのだし、18禁な相手に「地震火山用語辞書」はいらんのである。

さて。ここからが「Windows の地獄」の話。

Unix だとなんともシンプルな話で。それは mecab のユーザインターフェイスが Unix の以下と相性がいいからである:

  1. 「ホーム」といったらそれは「唯一無二のホーム」。
  2. その「唯一無二のホーム」配下に設定ファイルを置くのが標準。
  3. 「唯一無二のホーム」へ至るための便利なシェル機能。

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 というユーザとして):

2019-10-08の追記参照
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
2019-10-08追記:最初 dicdir 書いてなかったが書いたほうがいい。やってみればわかる。システム辞書の場所であれなんであれ「dicrc」が暗黙で必要とされていて、これがシステム辞書の場所にひとまずあるので。わかりにくいよね。「おれさま辞書の場所」じゃないんだもん、dicdir (またはオプションの -d)。

みたいに書いておき、これを /home/hhsprings/.mecabrc とするならば、そしてワタシ(hhsprings)がこれを使うには:

  1. mecab に何も指示しなければ /home/hhsprings/.mecabrc に従ってくれる。
  2. 別バージョンの rcfile を書いておいて切り替えたい場合も、「ホーム配下」にあるなら簡単:
    1 [me@host: ~]$ mecab --rcfile=~/.mecabrc_ero
    

    とか。

  3. rcfile を書かずに直接辞書を指定するのでも、「ホーム配下」にあるなら簡単:
    1 [me@host: ~]$ mecab --userdic=~/.mecab_mydic/Noun.name.anime.dic
    

    とか。ワタシのスクリプトの --merge-all で辞書をまとめたいのは、まさにこれのため。

そう。以前「Windows では何種類にも派生しちゃう HOME、やぁねぇ」なんてのを書いた通りで:

  1. 「ホーム」なんて概念はあるようでなく、ないようであり、複雑な歴史的事情もあり、アプリケーションによってバラバラ。
  2. その「唯一無二のホーム」配下に設定ファイルを置くのが標準、なんてステキな慣習はない。
  3. 「唯一無二のホーム」へ至るための便利なシェル機能、なんかない。

一応最近の 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 はめんどい」というだけのネタ、でしたとさ。をしまい。



Related Posts