Mecabに人名辞書を追加


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のインストール。

```bash
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ファイルなどが無い最小限の構成になってしまっている。なので

- http://sourceforge.net/projects/mecab/files/mecab-ipadic/2.7.0-20070801/

からオリジナルをダウンロードしてきて内容を置き換える。

```bash
cp Download/mecab-ipadic-2.7.0-20070801/* /usr/local/Cellar/mecab/0.996/lib/mecab/dic/ipadic/
```

(まぁそもそもこれをダウンロードして直接インストールしてもいいのだが、環境をbrewに統一したままだと色々と楽な気がする。)

辞書データを他のcsvファイルに合わせEUC-JPで作成する。

```example.csv
直視,,,10000,名詞,固有名詞,人名,名,*,*,なおよし,ナオヨシ,ナオヨシ
```

これを基に、UTF-8の辞書を出力する。

```bash
/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index -f euc-jp -t utf-8 
```

これだけで、今まで参照していた辞書が新しく生成された辞書に置き換わる。

ちゃんと置き換わったか実験。(`-N`オプションをつけると解析の候補を優先度順に出してくれるので、コスト等の調整に参考になる。)

```bash
$ mecab -N3                                                                      
相川直視
相川	名詞,固有名詞,人名,姓,*,*,相川,アイカワ,アイカワ
直視	名詞,固有名詞,人名,名,*,*,なおよし,ナオヨシ,ナオヨシ
EOS
相川	名詞,固有名詞,人名,姓,*,*,相川,アイカワ,アイカワ
直視	名詞,サ変接続,*,*,*,*,直視,チョクシ,チョクシ
EOS
相川	名詞,固有名詞,人名,姓,*,*,相川,アイカワ,アイカワ
直	名詞,固有名詞,人名,名,*,*,直,タダシ,タダシ
視	名詞,接尾,サ変接続,*,*,*,視,シ,シ
EOS
```

ちゃんと、普通には読めないはずの僕の名前がちゃんと解析されるようになっている。

はい、自己満足でした！