UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

MeCabでオリジナル辞書を定義して固有名詞がしっかりと認識されるようにしたい

MeCabでオリジナル辞書を定義して固有名詞がしっかりと認識されるようにしたい

MeCabでデフォルトのipadic辞書を使っても十分な精度が出ますが、固有名詞などは複数の単語に分割されてしまい困ることがあります。たとえば

$ mecab
太宰治
太宰   名詞,固有名詞,人名,姓,*,*,太宰,ダザイ,ダザイ
治 名詞,固有名詞,人名,名,*,*,治,オサム,オサム

となってしまいます。たとえば文学を扱っている記事に対して分析をしたいときには、太宰治という人名それ自体を1つの単語として扱うように設定しないと不都合が生じます。

MeCabでは、有志の方が固有名詞に対応したipadic-neologd辞書を作成していただいているので、これを使えばよいのですが、1つ問題があります。MeCabは対象とする単語数に比例して計算量が多くなり、特に登録単語数の大きいipadic-neologdでは、形態素処理にかかる時間が問題になることがあります。

github.com

これに対して、特定のカテゴリに特化したユーザー定義辞書を活用することで、処理時間の削減と特定分野特有の固有名詞への対応の両方を目指します。

下準備

辞書を用意するまえにMeCabがどのようにして文章を単語を分割する仕組みを大まかに理解する必要があります。実は、MeCabは条件付き確率場と呼ばれる数理モデルを利用して、単語と単語間の繋がりの自然さを計算し、一番コストの低い(要は自然なモノと考えると楽です)、単語の列を選択するようにしているのです。

つまり、単語ごとにコストを定義しておく必要があり、単語生成のコストが低いほど、その単語は選ばれやすくなるわけです。

このことを覚えておけば大丈夫です。

ユーザー定義辞書を利用する

MeCabでのユーザー定義辞書はCSV形式で作成します。エクセルでおなじみの形式ですが、要は単なるコンマ区切りのテキストデータです。

形式は簡単です

登録したい名詞,単語の種類別ID,単語の種類別ID,重み,品詞,品詞の説明,*,*,*,*,登録したい名詞,カタカナ表示,カタカナ表記

 太宰治,1289,1289,0,名詞,固有名詞,人名,一般,*,*,太宰治,ダザイオサム,ダザイオサム

面倒なのは単語の種類別IDでたとえばフルネームの人名ならば、1289と設定されていますが、かなり細かく設定されていますので、動詞などはデフォルトの辞書を見て決定する必要があります。面倒ですね。

重みは低ければ低いほど選択されやすくなります。マイナスの値も設定できます。バランスが重要なので、これもデフォルトの辞書を参考にして設定する必要があるでしょう。

辞書を作成

tanaka.csv

太宰治,1289,1289,0,名詞,固有名詞,人名,一般,*,*,太宰治,ダザイオサム,ダザイオサム
夏目漱石,1289,1289,0,名詞,固有名詞,人名,一般,*,*,夏目漱石,ナツメソウセキ,ナツメソウセキ
芥川龍之介,1289,1289,0,名詞,固有名詞,人名,一般,*,*,芥川龍之介,アクタガワリュウノスケ,アクタガワリュウノスケ

mecab-dict-indexを呼び出して作成します。

Linuxなら

/usr/local/libexec/mecab/mecab-dict-index

brewでmecabを入れたOSX(max)なら

/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index

数字の部分はmecabのバージョンによって違うので注意

実際に辞書を作成

ipadic辞書を元にオリジナルの辞書を組み合わせます。

/usr/local/Cellar/mecab/0.996/libexec/mecab/mecab-dict-index
 -d /usr/local/lib/mecab/dic/ipadic -u tanaka.dic -f utf-8 -t utf-8 tanaka.csv

作成した辞書ファイルを利用したいときは-uで明示的に辞書ファイルを指定する必要があります。

結果

mecab -u tanaka.dic

太宰治

太宰治   名詞,固有名詞,人名,一般,*,*,太宰治,ダザイオサム,ダザイオサム

EOS