どうせ和布蕪るなら、の続き (mecabrc のあまりの使いにくさに悶絶した結果)

結論としては MeCab は、「設定ファイルなんか使おうとしないで全部コマンドラインに指定しちゃいなよ」の方が遥かに楽だ、という非常に稀有なソフトウェアである、てこと。

すぐに出来る、と理解はしてたんだけれど、眠かったのでやらなかった。

構造がどう馬鹿げているのかについては、はっきりいって C++ ソースを読めばわかると思う。ひとつ前だっけか。「MeCab がどういう順序で作られたのか」の想像について書いたけれど、つまりは、「コマンドラインで指定する」のを「設定ファイルでも書けるようにしましたじゃじゃーん」の「雑な」実現、なのよね。

「create~」で構築するのは Tagger だけではない、ので、多重化は必要になるものの、要は「create に渡す「コマンドラインオプション」を楽に構築出来る術がある」んであれば、「mecabrc なんぞいらん」ということなわけよ:

1 # -*- coding: utf-8 -*-
2 from MeCab import Tagger
3 
4 # mecab.exe のコマンドラインオプションそのものである。
5 t = Tagger.create(
6     "-u c:/.mecab_dicts/myoujijiten_clean_all_lt1000.dic")
7 #t = Tagger()
8 print(t.parse("志倉千代丸による作詞作曲である。"))

すなわちこの create に渡す「文字列(コマンドラインオプション)」をスマートに構築出来さえすればいい。もう .mecabrc なんか捨てっちまえ、とまぁそういうわけだ。たとえばこうだよね:

 1 # -*- coding: utf-8 -*-
 2 from glob import glob
 3 from MeCab import Tagger
 4 
 5 # mecab.exe のコマンドラインオプションそのものである。
 6 args = "-u " + ",".join([
 7         d.replace("\\", "/")
 8         for d in glob("c:/.mecab_dicts/*.dic")])
 9 t = Tagger.create(args)
10 #t = Tagger()
11 print(t.parse("志倉千代丸による作詞作曲である。"))

ともあれこれ、今は MeCab.py の話でしているけれど、コマンドラインから mecab.exe を使う場合にもまったく同じ議論が成り立つわけだ。(find だのバックティックでの引用だのを駆使すれば、.mecabrc に悶絶しながら保守するより遥かに精神衛生上良い。)

というわけで。

なんかもう「ラッパーを書く」なんて考えなくてもいいかなと思った。所詮は「コマンドラインオプションをスマートに構築する」ってだけのことだから。



Related Posts