nullnull7の日記

プログラミング、写真、旅、その他日常について。

mecabで半角スペースを省略せず認識させる

mecabさんは半角スペースを無視した解析結果を出力してくれます。
(この事実を忘れていて1時間くらいデバッグに費やした人
半角スペースを無視せずそのまま出力させるにはどうしたらいいのか?
リファレンス↓を読んでいてもちょっと分かり辛かったので、メモっておきます。
http://mecab.googlecode.com/svn/trunk/mecab/doc/format.html

結論から言うと

$mecab --node-format="%M\t%f[0],%f[1],%f[2],%f[3],%f[4],%f[5],%f[6],%f[7],%f[8]\n" --unk-format="%M\t%f[0],%f[1],%f[2],%f[3],%f[4],%f[5]\n"

これでokです。(なんかもっとスマートにやれる気がするんですが……
%Mで半角を含めて表層を出力、それ以降のf[]でデフォルトと同じように素性を出力させるようにしています。
オプションFを使っても同じようなことができるのですが、これだとnode-formatとunk-formatを同時に定義してしまい、unk-formatの素性がもっていないf[6~8]の素性を定義しunknownw wordが出てきた時に、エラーを吐いて止まります。
長くて嫌な場合は、mecabrcを編集すると良いと思います。
デフォルトでも、単に-Ochasen2オプションをつければ、半角スペースを認識してくれます(ただし出力は茶筅形式になります)。


ちなみに、c++で指定する場合は、

tagger = MeCab::createTagger("--node-format %M\\t%f[0],%f[1],%f[2],%f[3],%f[4],%f[5],%f[6],%f[7],%f[8]\\n --unk-format %M\\t%f[0],%f[1],%f[2],%f[3],%f[4],%f[5]\\n");

となります。


(9/7 追記)
見逃してましたが、%Hだけで良いそうです…うう
あと、APIにうまくやってくれるやつがあるとかないとか。まだ調べてないので、後で追記します