RSS2.0

MeCab の IPA 辞書を再学習させてみる

MeCab の辞書は利用する分野に応じて、新たな名詞や動詞などを追加したり、その分野の文章の解析精度を上げるよう再学習させることができます(この作業はドメイン適応と呼ばれるそうです)。

ドメイン適応の第一歩としては、未知の名詞の MeCab 辞書への登録から始めると良いです。
ただ登録作業自体は、辞書をビルドする際に、その単語を後述のフォーマット(※1)で書いた .csv ファイルを混ぜておけばいいので、それほど難しいことではありません。問題となるのはその単語がどの程度使われやすいのかを調整する必要があることです。この使われやすさを示す数値はコストと呼ばれ、単語を登録する際には自分で決め打ちしなければなりません。

コストの手動計算方法はネット上でもいくつか紹介されていますが、手動計算ではあまり複雑な計算はできないので、同じ品詞のコストが同じ値になりがちです。そこでもう少し踏み込んだコスト算出方法として、辞書の再学習という手段があります。これは既存の辞書を作る際のデータモデルと追加する単語、少量の例文からコストや単語の接続方法を自動判定させる機能です。

デフォルトの辞書で形態素解析する

私の環境では IPA 辞書がインストールされているので、単語を分割する際には、分割したい単語がその辞書に登録されている必要があります。
配布されている IPA 辞書にはデフォルトでは『ダイヤモンドは砕けない』は載っていないため、一単語としては解析できず、細かく分割してしまいます。
$ echo "ジョジョ第四部のサブタイトルはダイヤモンドは砕けないです" | mecab 
ジョジョ	名詞,一般,*,*,*,*,*
第	接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
四	名詞,数,*,*,*,*,四,ヨン,ヨン
部	名詞,接尾,助数詞,*,*,*,部,ブ,ブ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
サブタイトル	名詞,一般,*,*,*,*,サブタイトル,サブタイトル,サブタイトル
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
ダイヤモンド	名詞,一般,*,*,*,*,ダイヤモンド,ダイヤモンド,ダイヤモンド
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
砕け	動詞,自立,*,*,一段,未然形,砕ける,クダケ,クダケ
ない	助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS
『ダイヤモンドは砕けない』をひとつの名詞として形態素解析するのが今回のゴールです。
人間が会話する場合『○○は××です』という言い回しだと、少なくとも××は 1 まとまりの名詞じゃないかと当たりがつけられると思います。ですが MeCab は辞書に登録されている形態素のコストから機械的に解析を行うので、辞書に登録されていない単語はそもそも形態素として認識しません。

辞書を再学習させる

辞書を作成する場合には、元となる大量の文章である学習コーパスや、Seed 辞書、設定ファイルなどを用意する必要があります。
しかし辞書への再学習で必要となるのは、学習済みモデルと追加学習データです。再学習では既存の学習済みモデルをベースに、それになるべく近づける形で追加学習データを反映することができます。
IPA 辞書の学習済みモデルはこちらで公開されています。更新日時が Jun 2012 になっているので結構古めですね。

上記学習済みモデルをダウンロードし、展開しておきます。
$ bunzip2 mecab-ipadic-2.7.0-20070801.model.bz2

再学習用の辞書を準備する

元となる IPA 辞書をダウンロードし、展開しておきます。
$ tar xvfz mecab-ipadic-2.7.0-20070801.tar.gz
$ python encodeDictCharset.py -d mecab-ipadic-2.7.0-20070801

追加したい形態素を加えた再学習用の辞書を作る

再学習時に追加したい形態素を MeCab に認識させる必要があるため、あらかじめその形態素を追加した再学習用の辞書を作っておく必要があります。
配布されている辞書のディレクトリ(mecab-ipadic-2.7.0-20070801)内に、他の単語同様以下のフォーマットで、追加したい単語を書いた CSV ファイルを用意します。

※1 MeCab 辞書へのエントリーのフォーマット
表層形,左文脈ID,右文脈ID,コスト,品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音

動詞などの活用する単語は複数行にわたってすべての活用を列挙しなければなりませんが、活用しない名詞では 1 行だけですみます。
表層形が追加したい単語そのものになります。
左文脈 ID、右文脈 ID は、文章の中で前後の単語とどのようにつながるかを示すもので、空にしておくと mecab-dict-index が自動的に算出してくれるそうです。
コストはその単語の出現しにくさを表します。例えば『新聞紙』が『新聞』と『紙』に形態素解析されるのか、それとも『新聞紙』として解析されるのかに影響する値です。MeCab は与えられた文章を分割できるすべてのパターンに分割し、その中で計算したコストがもっとも小さい分割結果を採用します。手動で設定する場合、実際にどのくらいのコストにすればいいかは、トライアンドエラーで期待する解析結果となるよう調整する必要があります。しかし、再学習時には自動的に計算することができ、ここが再学習のメリットの 1 つとなります。

今回は以下の内容で CSV ファイルを作成しました。
$ cat mecab-ipadic-2.7.0-20070801/relearn.csv
ダイヤモンドは砕けない,,,0,名詞,一般,*,*,*,*,ダイヤモンドは砕けない,ダイヤモンドハクダケナイ,ダイヤモンドハクダケナイ
再学習後のコストは再学習時に適切な値に調整されますが、学習用コーパスを作る際にこの単語がきちんと分割される必要があるため、ここではコストを 0 にしておきます。
CSV ファイルの文字コードは、他の CSV ファイルにあわせます。私の環境では辞書そのものを UTF8 に変換してあるので、ここでは UTF8 前提で話を進めたいと思います。
読みと発音には漢字やひらがなをカタカナに統一したものを記載します。発音は長音を長音符号で表したもので、例えば『放課後』の読みは『ホウカゴ』ですが、発音は『ホーカゴ』となります。

再学習用の辞書を作成します。
-d オプションでさきほどの辞書ディレクトリを対象に指定し、MeCab に付属する mecab-dict-index コマンドを実行します。-o オプションには辞書の作成先ディレクトリを指定します。これは -d オプションの値と同じディレクトリで構いません。
$ /usr/local/libexec/mecab/mecab-dict-index -d mecab-ipadic-2.7.0-20070801 -o mecab-ipadic-2.7.0-20070801

再学習用のコーパスを作る

再学習用の追加学習データとして、コーパスを作成します。
これは MeCab による形態素解析の結果を保存したファイルになります。基本的には登録したい単語が含まれる文章で構わないのですが、登録したい単語は 1 つの形態素となるよう書き換えておきます。『ダイヤモンドは砕けない』をそのまま形態素解析すると、『ダイヤモンド』「は」『砕け』『ない』の 4 つの形態素に分割されますが、学習用コーパスには 1 つの名詞にまとめて記載します。学習用コーパスに書く形態素のフォーマットは、分割した他の形態素と同じようにすれば OK です。
$ echo ジョジョ第四部のサブタイトルはダイヤモンドは砕けないです | mecab -d mecab-ipadic-2.7.0-20070801 > relearn.copus
$ vi relearn.copus
ジョジョ	名詞,一般,*,*,*,*,*
第	接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
四	名詞,数,*,*,*,*,四,ヨン,ヨン
部	名詞,接尾,助数詞,*,*,*,部,ブ,ブ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
サブタイトル	名詞,一般,*,*,*,*,サブタイトル,サブタイトル,サブタイトル
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
ダイヤモンドは砕けない	名詞,一般,*,*,*,*,ダイヤモンドは砕けない,ダイヤモンドハクダケナイ,ダイヤモンドハクダケナイ
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS
ここでは relearn.copus という名前にしておきます。

再学習用の辞書とコーパスで再学習を行う

同じく MeCab 付属の mecab-cost-train コマンドを実行し、新しい学習済みモデルを relearn.model として出力させます。-M オプションには冒頭でダウンロードしてきた既存の学習済みモデルを、指定してください。relearn.copus は先ほど用意した再学習用のコーパスです。
学習済みモデルと辞書の文字コードは必ずは揃えておいてください。
$ /usr/local/libexec/mecab/mecab-cost-train -c 1.0 -M mecab-ipadic-2.7.0-20070801.model -d mecab-ipadic-2.7.0-20070801 relearn.copus relearn.model
この新しい学習済みモデルから、mecab-dict-gen コマンドで再学習させた辞書を作成します。
ここでは -d オプション(元となる辞書ディレクトリ)と o オプション(新しい辞書ディレクトリ)が別ディレクトリになるようにしてください。
$ mkdir relearnDictSrc
$ /usr/local/libexec/mecab/mecab-dict-gen -d mecab-ipadic-2.7.0-20070801 -m relearn.model -o relearnDictSrc
ここで出来上がった辞書の中を見てみると、先ほど用意した relearn.csv の単語の、左文脈 ID、右文脈 ID、コストが自動計算されているのが分かります。
$ cat relearnDictSrc/relearn.csv
ダイヤモンドは砕けない,1135,1135,3012,名詞,一般,*,*,*,*,ダイヤモンドは砕けない,ダイヤモンドハクダケナイ,ダイヤモンドハクダケナイ

再学習させた辞書を作り直す

最後に、再学習させた辞書をビルドします。
$ mkdir relearnDict
$ /usr/local/libexec/mecab/mecab-dict-index -d relearnDictSrc -o relearnDict
$ cp mecab-ipadic-2.7.0-20070801/dicrc relearnDict

再学習した辞書で形態素解析をする

再学習させた辞書による解析結果がこちら。
$ echo "ジョジョ第四部のサブタイトルはダイヤモンドは砕けないです" | mecab -d relearnDict
ジョジョ	名詞,一般,*,*,*,*,*
第	接頭詞,数接続,*,*,*,*,第,ダイ,ダイ
四	名詞,数,*,*,*,*,四,ヨン,ヨン
部	名詞,接尾,助数詞,*,*,*,部,ブ,ブ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
サブタイトル	名詞,一般,*,*,*,*,サブタイトル,サブタイトル,サブタイトル
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
ダイヤモンドは砕けない	名詞,一般,*,*,*,*,ダイヤモンドは砕けない,ダイヤモンドハクダケナイ,ダイヤモンドハクダケナイ
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS
再学習させた単語がきちんと形態素として認識されていますね。
  MeCabpython  コメント (0) 2013/04/21 20:09:28


公開範囲:
プロフィール HN: ももかん
ゲーム作ったり雑談書いたり・・・していた時期が私にもありました。
カレンダー
<<2024, 11>>
272829303112
3456789
10111213141516
17181920212223
24252627282930