MeCabの辞書作成をやってみた。
昨日のText::MeCabバグになんで気づいたかというと、デフォルトのdictionaryだとmecabが「トラックバック」を単語として認識してくれないのに気づいたのでそれをどうにかしたかった。それをするにはやっぱり--userdicを指定しないとなぁ、と思って
my $mecab = Text::MeCab->new({userdic => '/Users/daisuke/mecab/foo.dic'});
for (my $node = $mecab->parse($text);
$node;
$node = $node->next
) {
print $node->feature, "\n";
}
みたいにしてみたのですよ。そしたらあーた!Segfaultの嵐じゃないですか。なんだなんだ?と思ってmecab_strerror()とか引っ張りだして検証してみたら"first argument seems to be invalid"みたいなエラーが出てて、なんじゃこらと思ってたらどうも引数を設定している時だけに起こるエラーだという事が発覚。色々やってようやくargvの処理の仕方が間違ってる事に気づいた。
で、これができたので辞書作ろうと思ったらうまくいかなかったので以下はメモとして。まずはここを参照しながらカスタム辞書作成。
http://mecab.sourceforge.jp/dic.html
基本的に書いてある通りであるのだけど、どうもmecab-ipadicをインストールする際にmake installがファイルを一個入れ忘れてるっぽ。
daisuke@beefcake daisuke$ cd /usr/local/lib/mecab/dic/ipadic
daisuke@beefcake ipadic$ sudo /usr/local/libexec/mecab/mecab-dict-index -u foo.csv -f euc-jp -c euc-jp /Users/daisuke/foo.csv
No such file or directory ./matrix.def
daisuke@beefcake ipadic$
ほげー。ってことでこうなる場合は、mecab-ipadic-XXXX.tar.gzを展開、makeして、そこにできるファイルmatrix.defをipadicのディレクトリにコピって来るべし。
daisuke@beefcake ipadic$ sudo cp ~/pkgs/mecab-ipadic-2.7.0-20051110/matrix.def
daisuke@beefcake ipadic$
これでもう万全。
daisuke@beefcake ipadic$ sudo /usr/local/libexec/mecab/mecab-dict-index -u foo.csv -f euc-jp -c euc-jp /Users/daisuke/foo.csv
reading /Users/daisuke/foo.csv ... 1
emitting double-array: 100% |###########################################|done!
daisuke@beefcake ipadic$
こうしておいて、あとはText::MeCabを呼ぶ時にuserdicオプションを使うか、自分の.mecabrcとかに書くだけ。