数学、ときどき統計、ところによりIT

理論と実践の狭間で漂流する数学趣味人の記録

形態素解析 MeCab(2)

形態素解析 MeCab(1)の続きです。

辞書のメンテナンス

インストールして直ぐの状態のままでもそこそこ使えるのですが、付属の辞書は昔に作られた辞書ということもあって、意外に多くの語が未知語として認識されてしまいます*1。こうした未知語に対応するためには、未知語に品詞情報を追加した上で辞書に登録する必要があります。

以下、辞書関連のフォルダ

 C:\Program Files (x86)\MeCab\dic\ipadic

をカレントフォルダとして作業を行います。

さて、カレントフォルダ内にある一般名詞に関する CSV ファイル Noun.csv を見てみると、

仕舞い,1285,1285,5543,名詞,一般,*,*,*,*,仕舞い,シマイ,シマイ
綺,1285,1285,5622,名詞,一般,*,*,*,*,綺,アヤギヌ,アヤギヌ
洋裁,1285,1285,5618,名詞,一般,*,*,*,*,洋裁,ヨウサイ,ヨーサイ
組打ち,1285,1285,5622,名詞,一般,*,*,*,*,組打ち,クミウチ,クミウチ

となっています。このデータの書式は以下の通りになっています。

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

これと同様の書式の CSV ファイルを作ることで未知語を辞書に登録することが出来ます。

辞書生成までの手順は以下の通りです。

手順1 コスト推定に必要なモデルファイル(mecab-ipadic-2.7.0-20070801.model)を入手します。モデルファイルは公式サイト単語の追加方法のページから入手出来ます。リンクの位置が分かりにくいですが、

mecab-ipadicのモデルファイルはこちらよりダウンロード可能です.

という記述があり「こちら」の部分がリンクになっています。bz2 形式で圧縮してあるので、それを解凍して下さい。

手順2 モデルファイルの文字コードを Shift-JIS に変換し、ファイルの6行目を次のように書き換えます。

 【変更前】 charset: euc-jp
 【変更後】 charset: shift-jis

変更したモデルファイルをカレントフォルダに置きます。

手順3 文脈 ID およびコストが空欄である CSV ファイルを作成、カレントフォルダに置きます。ここでは次のカンマ区切りのデータ

ウェブ,,,,名詞,一般,*,*,*,*,ウェブ,ウェブ,ウェブ
Nグラム,,,,名詞,一般,*,*,*,*,Nグラム,エヌグラム,エヌグラム
閾値,,,,名詞,一般,*,*,*,*,閾値,イキチ,イキチ

を user_dic.tmp という名前でカレントフォルダに保存します。

手順4 次のコマンドを実行してコストの自動推定を行い、文脈 ID およびコストの欄を埋めたファイルを生成します。

mecab-dict-index -m mecab-ipadic-2.7.0-20070801.model -f shift-jis -t shift-jis -a user_dic.tmp -u user_dic.csv

生成された user_dic.csv を見ると

ウェブ,1285,1285,3285,名詞,一般,*,*,*,*,ウェブ,ウェブ,ウェブ
Nグラム,1285,1285,5699,名詞,一般,*,*,*,*,Nグラム,エヌグラム,エヌグラム
閾値,1285,1285,5078,名詞,一般,*,*,*,*,閾値,イキチ,イキチ

となっています。

手順5 コマンド mecab-dict-index を引数無しで実行して辞書を生成します。拡張子が csv となっている全てのファイルが処理対象になります*2

以上が辞書更新の基本的な手順になります。


なお IPADIC(IPA 辞書)の拡張辞書として NEologd というものがあります。「名詞的なフレーズを連結する処理、を作る作業から開放される」ということが目的の1つに挙げられている通り、形態素ではなく複合語やフレーズ、顔文字などを予め大量に登録してあります。ネット上の言語資源を元にしていること、高頻度で更新されることから、特に時事ネタやサブカル系の話題を取り上げたウェブページやブログ、掲示板のテキストデータを解析対象にする場合に威力を発揮しそうだという印象を受けました。詳細は readme をご覧下さい。

*1:例えば新語や流行語、サブカル系は言うに及ばず、カタカナ語、科学技術系の専門用語、物質名など。

*2:文脈 ID およびコストの欄が空欄であるファイルの拡張子を tmp ではなく csv にした場合、ここでエラーとなります。