Mecabに新しい単語を追加したくなることは多々あるはず。
今回は人名の例で解説する。
人名追加に必要となる知識
重要なリンク
Mecab公式「単語の追加方法」
http://mecab.googlecode.com/svn/trunk/mecab/doc/dic.html
人名辞書一覧
http://www.mwsoft.jp/programming/munou/ime_dictionary_link.html#person
辞書の追加先
まず、システム辞書として追加するか、ユーザー辞書として追加するかが問題となる。
人名辞書の項目は大抵万を超えるので、解析速度のことを考え、システム辞書に追加するのが妥当と考えられる。
辞書更新が頻繁でないときや, 解析速度を落としたくない時は, 直接 システム辞書を変更するのがよいでしょう.
mecab-ipadic があるディレクトリに移動
foo.csv というファイルを作成 (拡張子が .csv なら何でも可)
foo.csv に単語を追加
辞書の再コンパイル + インストール% /usr/local/libexec/mecab/mecab-dict-index -f euc-jp -t euc-jp % su # make install
- f charset: CSVの文字コード
- t charset: バイナリ辞書の文字コード
例: utf-8の辞書を作成する例
% /usr/local/libexec/mecab/mecab-dict-index -f euc-jp -t utf8
エントリのフォーマット
公式サイトには以下のように書いてある。
システム辞書, ユーザ辞書, ともにエントリのフォーマットは同一です.
エントリは, 以下のような CSV で追加します. 名詞などの活用しない語だと, 登録は簡単です.
工藤,1223,1223,6058,名詞,固有名詞,人名,名,*,*,くどう,クドウ,クドウ
左から,
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分3,活用形,活用型,原形,読み,発音
です.
左文脈IDは, その単語を左から見たときの内部状態IDです. 通常システム 辞書と同一場所にある left-id.def から該当する ID を選択します. 空にしておくと mecab-dict-index が自動的に ID を付与します.
右文脈IDは, その単語を右から見たときの内部状態IDです. 通常システム 辞書と同一場所にある right-id.def から該当する ID を選択します. 空にしておくと, mecab-dict-index が自動的に ID を付与します.
コストは,その単語がどれだけ出現しやすいかを示しています. 小さいほど, 出現しやすいという意味になります. 似たような単語と 同じスコアを割り振り, その単位で切り出せない場合は, 徐々に小さくしていけばいいと思います.
人名の品詞分類としては、以下の3通りあるのでどれかを選ぶ。
自分の持っている辞書が名前か姓かわからないとしたら一般を選べばいいのだろう。
名詞,固有名詞,人名,一般
名詞,固有名詞,人名,姓
名詞,固有名詞,人名,名
ちなみに、例の工藤
は名詞,固有名詞,人名,名
ではなく"名詞,固有名詞,人名,性
な気がして仕方がない。まぁシステム的には姓でも名でもあんまり関係ないんだろうけれど。
とりあえず、テンプレとして以下のものを用意した。
kanji
,hiragana
,katakana
がスクリプト等で入力すべき部分。大体の辞書は、読みはカタカナかひらがなかどちらか一つで記載されているので、nkf --hiragana
, nkf --katakana
を使って変換すると良いだろう。
${kanji},,,10000,名詞,固有名詞,人名,一般,*,*,${hiragana},${katakana},${katakana}
ここで、難しいのは左文脈ID,右文脈ID,コスト
の部分。
左右文脈ID
まず、左文脈ID,右文脈ID
は空けておけば自動で埋めてくれるとある。
昔は空じゃなくて-1
を入れていると良かったみたいだが変わっているので注意。
もしくは、Noun.name.csv
やleft-id.def
/right-id.def
を見ると人名に関しては、idは以下のようになっているとわかるので直接記述しても良い。
(注:left-idやright-idは辞書のバージョンによって違うので気をつけること。)
1289,1289,?,名詞,固有名詞,人名,一般
1290,1290,?,名詞,固有名詞,人名,姓
1291,1291,?,名詞,固有名詞,人名,名
コスト
次はコスト。
モデルデータがあれば自動推定も出来る。
モデルデータは
https://code.google.com/p/mecab/downloads/detail?name=mecab-ipadic-2.7.0-20070801.model.bz2
からダウンロードでき、
mecab-dict-index
コマンドに-m model_file
とオプションを渡し、
コストの部分を空白にしたまま解析させる。
ただ、学習データのスパースネスを考えると、再学習させてホントにいい結果が得られるとも限らないけれど。
手動で設定する場合は、「はてなキーワード」カテゴリをMecab辞書に追加している例( http://d.hatena.ne.jp/code46/20090531/p1 )とこれが参考にしている公式ケーススタディー( http://mecab.googlecode.com/svn/trunk/mecab/doc/dic-detail.html )が参考になる。
ここでは、
cost = (int)max(-36000, -400 * (length^1.5))
とコストが負の値までぶっ飛んでいるが、今回の場合は、既存カテゴリに追加するので、ここまでぶっ飛ぶと困るはず。
ここでは、短い文字ほど高めにして、長い文字ほど低めにしたら良いということだけ分かれば良さそう。
Noun.name.csv
を見ると大体2文字の名前で7000から9000前後なので、まぁ少し自信無さげに10000を入れている。
本来、長い名前ほど低いコストにしないといけないので、適当に10000 - length * 500
みたいにしても良いかも。
Macの場合で実践
mecabとipadicのインストール。
brew install mecab mecab-ipadic
こうすると執筆現在で以下のバージョンが入る。
- mecab-0.996
- mecab-ipadic-2.7.0-20070801
ちなみに、Macではデフォルトで、--with-charset=utf8
が付いているので辞書の文字コードはeuc-jp
でなくutf-8
だと思って大丈夫。
https://github.com/mxcl/homebrew/blob/master/Library/Formula/mecab-ipadic.rb
こういう風に入れると、
/usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic
にmecab-ipadic-2.7.0-20070801が入るのだが、csvファイルなどが無い最小限の構成になってしまっている。なので
からオリジナルをダウンロードしてきて内容を置き換える。
cp Download/mecab-ipadic-2.7.0-20070801/* /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/
(まぁそもそもこれをダウンロードして直接インストールしてもいいのだが、環境をbrewに統一したままだと色々と楽な気がする。)
辞書データを他のcsvファイルに合わせEUC-JPで作成する。
直視,,,10000,名詞,固有名詞,人名,名,*,*,なおよし,ナオヨシ,ナオヨシ
これを基に、UTF-8の辞書を出力する。
/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -f euc-jp -t utf-8
これだけで、今まで参照していた辞書が新しく生成された辞書に置き換わる。
ちゃんと置き換わったか実験。(-N
オプションをつけると解析の候補を優先度順に出してくれるので、コスト等の調整に参考になる。)
$ mecab -N3
相川直視
相川 名詞,固有名詞,人名,姓,*,*,相川,アイカワ,アイカワ
直視 名詞,固有名詞,人名,名,*,*,なおよし,ナオヨシ,ナオヨシ
EOS
相川 名詞,固有名詞,人名,姓,*,*,相川,アイカワ,アイカワ
直視 名詞,サ変接続,*,*,*,*,直視,チョクシ,チョクシ
EOS
相川 名詞,固有名詞,人名,姓,*,*,相川,アイカワ,アイカワ
直 名詞,固有名詞,人名,名,*,*,直,タダシ,タダシ
視 名詞,接尾,サ変接続,*,*,*,視,シ,シ
EOS
ちゃんと、普通には読めないはずの僕の名前がちゃんと解析されるようになっている。
はい、自己満足でした!