Mecabのdefファイル調整メモ

Mecab/IPA辞書を使って記号を食わせると、記号(&とか)がサ変接続と認識されます。

$ echo "P&!G" |  mecab
P    名詞,固有名詞,組織,*,*,*,*
&!   名詞,サ変接続,*,*,*,*,*
G    名詞,固有名詞,組織,*,*,*,*
EOS

なんでこうなるかと言うと、char.defとunk.defの設定でそうなっているからです。
(ところで、unknownの略のunkってなんて読むんと良いんでしょうね。うんこ?(´・ω・`))

char.defでは以下のように記述されています。 SYMBOLのINVOKEが1になっているので、常にunknown wordとして扱われます。そしてGROUPが1なので、同じ種別でまとめられます。

SYMBOL         1 1 0
# ASCII
0x0021..0x002F SYMBOL
0x0030..0x0039 NUMERIC
0x003A..0x0040 SYMBOL
0x0041..0x005A ALPHA
0x005B..0x0060 SYMBOL
0x0061..0x007A ALPHA
0x007B..0x007E SYMBOL

unk.defでは以下のように記述されています。

SYMBOL,1283,1283,17585,名詞,サ変接続,*,*,*,*,*

このunk.defを以下のように書き換えます。

SYMBOL,1283,1283,17585,記号,一般,*,*,*,*,*

これで以下の出力に変わります。 

$ echo 'P&!G' | mecab
P   名詞,固有名詞,組織,*,*,*,*
&!  記号,一般,*,*,*,*,*
G   名詞,固有名詞,組織,*,*,*,*
EOS

一応、記号一般になりましたが。が、どうせなら半角ASCII文字は全部繋げてほしいなーとか思ったり、固有名詞・組織?えぇーとか思ったり、思わなかったりするわけです。というわけで、もうちょっといじくってみます。

char.defを以下のようにします。ASCIIという区分を作って細かく分類していた部分をならしてしまいます。 文字コード0x0021 - 0x007Eの連続文字は問答無用でひとくくりにしてASCIIとする設定です。

ASCII          1 1 0
# ASCII
#0x0021..0x002F SYMBOL
#0x0030..0x0039 NUMERIC
#0x003A..0x0040 SYMBOL
#0x0041..0x005A ALPHA
#0x005B..0x0060 SYMBOL
#0x0061..0x007A ALPHA
#0x007B..0x007E SYMBOL
0x0021..0x007E ASCII

unk.defに以下を追加します。 ひとくくりにしたASCIIを名詞・一般にする設定です。 コスト値は1,1と優先度が一番高くなるようにします。

ASCII,1,1,0,名詞,一般,*,*,*,*,*

再度実行してみます。(あ、辞書はビルドしなおす必要があります)

$ echo 'P&!G' |  ../../bin/mecab
P&!G    名詞,一般,*,*,*,*,*
EOS

$ echo 'xxx-yyy' |  ../../bin/mecab
xxx-yyy 名詞,一般,*,*,*,*,*
EOS

こんな感じで調整する事ができますという紹介でした。
詳細は作者様のページにありますので、そちらを参照するのが良いと思います。

新しいサイトもよろしくお願いします!