読者です 読者をやめる 読者になる 読者になる

MeCab の辞書に単語を追加して利用する

いつも忘れるのでまとめておこう。
辞書と言ってもきちんとコストを計算して複雑な形態素解析をするわけではなく、
Wikipediaの項目名などを名詞として文章から抜き出すために追加するとかそういう例。
単語の活用も考えない。

1.もとになる単語のリストをつくる

上達の法則,0,0,-8944,名詞,一般,*,*,*,*,*,*,*
ツブカラカサタケ,0,0,-18101,名詞,一般,*,*,*,*,*,*,*
旗艦・三笠,0,0,-8944,名詞,一般,*,*,*,*,*,*,*
マルシェ志摩,0,0,-11757,名詞,一般,*,*,*,*,*,*,*

まあこんな感じのCSVを作る。カラムは左から順に

表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html

となっているのだけれど、左文脈ID,右文脈IDは今回は利用しないので0でよい。品詞から右は品詞,品詞細分類1ぐらいが書いてあれば実用に困らない。

問題なのはコストで、これが小さいほどその単語としてきり出されやすくなる。
今回は正規表現の最長一致のようになるべく長い単語切り出してほしいので、文字列の長さに応じてスコアが小さくなるような設定をしている。
なので1行目と3行目は同じ長さがなのでスコアが同じだし、"ツブカラカサタケ"は長い文字列なのでスコアが小さくなっている。

このへんのスコアの付け方の感覚はイマイチわかっていなくて、詳しい人がいたら教えていただきたい。

2.csv から dic ファイルへ変換

さてこのcsvを直接mecabは読みこんでくれないので、独自形式に変換する。csv ファイルが words.csv、 作る辞書ファイルを original.dic とする。

$ /usr/local/Cellar/mecab/0.98/libexec/mecab/mecab-dict-index -d /usr/local/Cellar/mecab/0.98/lib/mecab/dic/ipadic -u original.dic -f utf8 -t utf8 words.csv

これは osx で homebrew を使って mecab を入れている場合の例。自分の環境に合わせて変更すると良い。
mecab-dict-index が辞書を変換する実行ファイルで、-d のオプションがシステム辞書のある場所、 -u オプションが作る辞書の名前, -f が csv ファイルの文字コード、-t が作る辞書ファイルの文字コートになる。

3.作った辞書の利用

mecab -u original.dic

と -u オプションで作ったファイルを渡せば、ユーザー辞書も有効になる。システム辞書も有効なので注意。

Text::MeCab から利用する場合は、コンストラクタ

my $userdic = '/PATH/TO/original.dic';
my $mecab = Text::MeCab->new({ userdic => $userdic });

と指定してあげればよい。

MeCabさん、登場から随分たつけどやっぱり便利ですね。

詳しい解説は http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html も参考に。