MeCabのドメイン適応(再学習)

MeCabドメイン適応(再学習)すぐ忘れるので、他にも記事たくさんあるけど、なんとなく備忘メモ(手順だけ)。
MeCab: オリジナル辞書/コーパスからのパラメータ推定

まず、MeCabGoogle Project Hostingから消えてた。。。今はGooglドライブからもろもろダウンロード可能。
https://drive.google.com/folderview?id=0B4y35FiV1wh7fjQ5SkJETEJEYzlqcUY4WUlpZmR4dDlJMWI5ZUlXN2xZN2s2b0pqT3hMbTQ&usp=drive_web#list

準備するもの

  • MeCab本体:mecab-0.996.tar.gz
  • 辞書(IPA):mecab-ipadic-2.7.0-20070801.tar.gz
  • パラメータ推定モデル(IPA):mecab-ipadic-2.7.0-20070801.model.bz2

本体とIPA辞書は、下記の通りインストール済み

$ curl -O https://mecab.googlecode.com/files/mecab-0.996.tar.gz
$ tar xzf mecab-0.996.tar.gz
$ cd mecab-0.996
$ ./configure
$ make
$ make check
$ sudo make install
$ curl -O https://mecab.googlecode.com/files/mecab-ipadic-2.7.0-20070801.tar.gz
$ tar xzf mecab-ipadic-2.7.0-20070801.tar.gz
$ cd mecab-ipadic-2.7.0-20070801
$ ./configure --with-charset=utf8
$ make
$ sudo make install

サンプル文(形態素解析の誤り例)

以下の2文のうち、とりあえず明らかに誤りとわかる「外国人参政権」と「学校へ行こう!」を単語の追加とモデルの再学習で直してみます。

$ echo "外国人参政権は世界的には一般的でないものの、欧州地域など一定の制約下で認められているケースもある。" | mecab
外国	名詞,一般,*,*,*,*,外国,ガイコク,ガイコク
人参	名詞,一般,*,*,*,*,人参,ニンジン,ニンジン
政権	名詞,一般,*,*,*,*,政権,セイケン,セイケン
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
世界	名詞,一般,*,*,*,*,世界,セカイ,セカイ
的	名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
一般	名詞,一般,*,*,*,*,一般,イッパン,イッパン
的	名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
で	助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ない	助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
ものの	助詞,接続助詞,*,*,*,*,ものの,モノノ,モノノ
、	記号,読点,*,*,*,*,、,、,、
欧州	名詞,固有名詞,地域,一般,*,*,欧州,オウシュウ,オーシュー
地域	名詞,一般,*,*,*,*,地域,チイキ,チイキ
など	助詞,副助詞,*,*,*,*,など,ナド,ナド
一定	名詞,サ変接続,*,*,*,*,一定,イッテイ,イッテイ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
制約	名詞,サ変接続,*,*,*,*,制約,セイヤク,セイヤク
下	名詞,接尾,一般,*,*,*,下,カ,カ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
認め	動詞,自立,*,*,一段,未然形,認める,ミトメ,ミトメ
られ	動詞,接尾,*,*,一段,連用形,られる,ラレ,ラレ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いる	動詞,非自立,*,*,一段,基本形,いる,イル,イル
ケース	名詞,一般,*,*,*,*,ケース,ケース,ケース
も	助詞,係助詞,*,*,*,*,も,モ,モ
ある	動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
。	記号,句点,*,*,*,*,。,。,。
EOS
$ echo "TBSの伝説の番組『学校へ行こう!』が、この秋、一夜限り復活することが決まった。" | mecab
TBS	名詞,固有名詞,組織,*,*,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
伝説	名詞,一般,*,*,*,*,伝説,デンセツ,デンセツ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
番組	名詞,一般,*,*,*,*,番組,バングミ,バングミ
『	記号,括弧開,*,*,*,*,『,『,『
学校	名詞,一般,*,*,*,*,学校,ガッコウ,ガッコー
へ	助詞,格助詞,一般,*,*,*,へ,ヘ,エ
行こ	動詞,自立,*,*,五段・カ行促音便,未然ウ接続,行く,イコ,イコ
う	助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
!	記号,一般,*,*,*,*,!,!,!
』	記号,括弧閉,*,*,*,*,』,』,』
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
、	記号,読点,*,*,*,*,、,、,、
この	連体詞,*,*,*,*,*,この,コノ,コノ
秋	名詞,一般,*,*,*,*,秋,アキ,アキ
、	記号,読点,*,*,*,*,、,、,、
一夜	名詞,副詞可能,*,*,*,*,一夜,イチヤ,イチヤ
限り	名詞,非自立,副詞可能,*,*,*,限り,カギリ,カギリ
復活	名詞,サ変接続,*,*,*,*,復活,フッカツ,フッカツ
する	動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
こと	名詞,非自立,一般,*,*,*,こと,コト,コト
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
決まっ	動詞,自立,*,*,五段・ラ行,連用タ接続,決まる,キマッ,キマッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

辞書とモデルの下準備

辞書、モデルともに文字コードEUC-JPなのでUTF-8に変換します。

$ tar xzf mecab-ipadic-2.7.0-20070801.tar.gz
$ nkf --overwrite -Ew mecab-ipadic-2.7.0-20070801/*
$ bzip2 -d mecab-ipadic-2.7.0-20070801.model.bz2
$ nkf --overwrite -Ew mecab-ipadic-2.7.0-20070801.model

設定ファイルとモデルファイルのcharsetの記述があるのでutf-8に変更しておきます。
mecab-ipadic-2.7.0-20070801/dicrc

 :
config-charset = UTF-8
 :
; yomi

mecab-ipadic-2.7.0-20070801.model

 :
charset: utf-8

-0.0001744043301648 B00:BOS/EOS/その他
 :

追加する単語のコスト推定をさせるために、バイナリ辞書を作成しておきます。(インストールしちゃう場合は、sudo make install もする)

$ cd mecab-ipadic-2.7.0-20070801
$ /usr/local/libexec/mecab/mecab-dict-index -f utf-8 -t utf-8

追加する単語をCSVで用意

追加する単語をCSVで用意します。

$ cat seed_with_empty_cost.csv
外国人参政権,,,,名詞,一般,*,*,*,*,外国人参政権,ガイコクジンサンセイケン,ガイコクジンサンセイケン
学校へ行こう!,,,,名詞,一般,*,*,*,*,学校へ行こう!,ガッコウヘイコウ,ガッコーエイコー

並びは、

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

のようになってます。
#活用がある語は、活用を一行ずつ展開する必要あり。
今回は、始め試しに左文脈ID、右文脈ID、コストをオリジナルモデルに推定させてみるので空にしておきます。通常の再学習では「0,0,0」で問題無し。

コストの自動推定

オリジナルのモデルを使って、作成した追加単語CSVのコストを推定してもらいます。

$ /usr/local/libexec/mecab/mecab-dict-index -m mecab-ipadic-2.7.0-20070801.model -d mecab-ipadic-2.7.0-20070801 -f utf-8 -t utf-8 -a seed_with_empty_cost.csv -u seed.csv
$ cat seed.csv 
外国人参政権,1285,1285,5078,名詞,一般,*,*,*,*,外国人参政権,ガイコクジンサンセイケン,ガイコクジンサンセイケン
学校へ行こう!,1285,1285,5078,名詞,一般,*,*,*,*,学校へ行こう!,ガッコウヘイコウ,ガッコーエイコー

バイナリ辞書の再構築

コスト推定された追加単語のCSVを含めて、バイナリ辞書を再構築します。

$ cp seed.csv mecab-ipadic-2.7.0-20070801
$ cd mecab-ipadic-2.7.0-20070801
$ /usr/local/libexec/mecab/mecab-dict-index -f utf-8 -t utf-8

ここまでで、再テスト

単語が追加されたバイナリ辞書で、サンプル文を解析してみます。

$ echo "外国人参政権は世界的には一般的でないものの、欧州地域など一定の制約下で認められているケースもある。" | mecab -d .
外国人参政権	名詞,一般,*,*,*,*,外国人参政権,ガイコクジンサンセイケン,ガイコクジンサンセイケン
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
世界	名詞,一般,*,*,*,*,世界,セカイ,セカイ
的	名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
一般	名詞,一般,*,*,*,*,一般,イッパン,イッパン
的	名詞,接尾,形容動詞語幹,*,*,*,的,テキ,テキ
で	助動詞,*,*,*,特殊・ダ,連用形,だ,デ,デ
ない	助動詞,*,*,*,特殊・ナイ,基本形,ない,ナイ,ナイ
ものの	助詞,接続助詞,*,*,*,*,ものの,モノノ,モノノ
、	記号,読点,*,*,*,*,、,、,、
欧州	名詞,固有名詞,地域,一般,*,*,欧州,オウシュウ,オーシュー
地域	名詞,一般,*,*,*,*,地域,チイキ,チイキ
など	助詞,副助詞,*,*,*,*,など,ナド,ナド
一定	名詞,サ変接続,*,*,*,*,一定,イッテイ,イッテイ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
制約	名詞,サ変接続,*,*,*,*,制約,セイヤク,セイヤク
下	名詞,接尾,一般,*,*,*,下,カ,カ
で	助詞,格助詞,一般,*,*,*,で,デ,デ
認め	動詞,自立,*,*,一段,未然形,認める,ミトメ,ミトメ
られ	動詞,接尾,*,*,一段,連用形,られる,ラレ,ラレ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
いる	動詞,非自立,*,*,一段,基本形,いる,イル,イル
ケース	名詞,一般,*,*,*,*,ケース,ケース,ケース
も	助詞,係助詞,*,*,*,*,も,モ,モ
ある	動詞,自立,*,*,五段・ラ行,基本形,ある,アル,アル
。	記号,句点,*,*,*,*,。,。,。
EOS
$ echo "TBSの伝説の番組『学校へ行こう!』が、この秋、一夜限り復活することが決まった。" | mecab -d .
TBS	名詞,固有名詞,組織,*,*,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
伝説	名詞,一般,*,*,*,*,伝説,デンセツ,デンセツ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
番組	名詞,一般,*,*,*,*,番組,バングミ,バングミ
『	記号,括弧開,*,*,*,*,『,『,『
学校	名詞,一般,*,*,*,*,学校,ガッコウ,ガッコー
へ	助詞,格助詞,一般,*,*,*,へ,ヘ,エ
行こ	動詞,自立,*,*,五段・カ行促音便,未然ウ接続,行く,イコ,イコ
う	助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
!	記号,一般,*,*,*,*,!,!,!
』	記号,括弧閉,*,*,*,*,』,』,』
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
、	記号,読点,*,*,*,*,、,、,、
この	連体詞,*,*,*,*,*,この,コノ,コノ
秋	名詞,一般,*,*,*,*,秋,アキ,アキ
、	記号,読点,*,*,*,*,、,、,、
一夜	名詞,副詞可能,*,*,*,*,一夜,イチヤ,イチヤ
限り	名詞,非自立,副詞可能,*,*,*,限り,カギリ,カギリ
復活	名詞,サ変接続,*,*,*,*,復活,フッカツ,フッカツ
する	動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
こと	名詞,非自立,一般,*,*,*,こと,コト,コト
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
決まっ	動詞,自立,*,*,五段・ラ行,連用タ接続,決まる,キマッ,キマッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

外国人参政権」は直ったけど、「学校へ行こう!」は変化なし。。。もう一手間かけます。

再学習用コーパスの準備

モデルを再学習させるために、コーパス(正しい解析結果)を用意します。フォーマットは、MeCabのデフォルトの出力と同じです。

$ cat corpus 
TBS	名詞,固有名詞,組織,*,*,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
伝説	名詞,一般,*,*,*,*,伝説,デンセツ,デンセツ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
番組	名詞,一般,*,*,*,*,番組,バングミ,バングミ
『	記号,括弧開,*,*,*,*,『,『,『
学校へ行こう!	名詞,一般,*,*,*,*,学校へ行こう!,ガッコウヘイコウ,ガッコーエイコー
』	記号,括弧閉,*,*,*,*,』,』,』
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
、	記号,読点,*,*,*,*,、,、,、
この	連体詞,*,*,*,*,*,この,コノ,コノ
秋	名詞,一般,*,*,*,*,秋,アキ,アキ
、	記号,読点,*,*,*,*,、,、,、
一夜	名詞,副詞可能,*,*,*,*,一夜,イチヤ,イチヤ
限り	名詞,非自立,副詞可能,*,*,*,限り,カギリ,カギリ
復活	名詞,サ変接続,*,*,*,*,復活,フッカツ,フッカツ
する	動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
こと	名詞,非自立,一般,*,*,*,こと,コト,コト
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
決まっ	動詞,自立,*,*,五段・ラ行,連用タ接続,決まる,キマッ,キマッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS

モデル(CRF パラメータ)の再学習

コーパスを使って、モデルを更新します。

$ /usr/local/libexec/mecab/mecab-cost-train -d mecab-ipadic-2.7.0-20070801 -M mecab-ipadic-2.7.0-20070801.model -c 1.0 corpus mecab-ipadic-2.7.0-20070801_custom.model
配布用辞書の作成

更新したモデルで配布用辞書を作成します。-o で元の辞書とは別の辞書として出力しています。

$ mkdir mecab-ipadic-2.7.0-20070801_custom
$ /usr/local/libexec/mecab/mecab-dict-gen -d mecab-ipadic-2.7.0-20070801 -o mecab-ipadic-2.7.0-20070801_custom -m mecab-ipadic-2.7.0-20070801_custom.model

コストが変わりました。

$ cat mecab-ipadic-2.7.0-20070801_custom/seed.csv 
外国人参政権,1135,1135,5176,名詞,一般,*,*,*,*,外国人参政権,ガイコクジンサンセイケン,ガイコクジンサンセイケン
学校へ行こう!,1135,1135,5087,名詞,一般,*,*,*,*,学校へ行こう!,ガッコウヘイコウ,ガッコーエイコー
バイナリ辞書の再構築

この状態で、もう一回辞書を再構築すれば出来上がり。

$ cd mecab-ipadic-2.7.0-20070801_custom
$ /usr/local/libexec/mecab/mecab-dict-index -f utf-8 -t utf-8
もっかい、テスト

ビルドした辞書で『学校へ行こう!』を再テストしてみます。

$ echo "TBSの伝説の番組『学校へ行こう!』が、この秋、一夜限り復活することが決まった。" | mecab -d .
TBS	名詞,固有名詞,組織,*,*,*,*
の	助詞,連体化,*,*,*,*,の,ノ,ノ
伝説	名詞,一般,*,*,*,*,伝説,デンセツ,デンセツ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
番組	名詞,一般,*,*,*,*,番組,バングミ,バングミ
『	記号,括弧開,*,*,*,*,『,『,『
学校へ行こう!	名詞,一般,*,*,*,*,学校へ行こう!,ガッコウヘイコウ,ガッコーエイコー
』	記号,括弧閉,*,*,*,*,』,』,』
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
、	記号,読点,*,*,*,*,、,、,、
この	連体詞,*,*,*,*,*,この,コノ,コノ
秋	名詞,一般,*,*,*,*,秋,アキ,アキ
、	記号,読点,*,*,*,*,、,、,、
一夜	名詞,副詞可能,*,*,*,*,一夜,イチヤ,イチヤ
限り	名詞,非自立,副詞可能,*,*,*,限り,カギリ,カギリ
復活	名詞,サ変接続,*,*,*,*,復活,フッカツ,フッカツ
する	動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
こと	名詞,非自立,一般,*,*,*,こと,コト,コト
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
決まっ	動詞,自立,*,*,五段・ラ行,連用タ接続,決まる,キマッ,キマッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
$ echo "昨日の『学校へ行こう!』は、面白かった。" | mecab -d .
昨日	名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
『	記号,括弧開,*,*,*,*,『,『,『
学校へ行こう!	名詞,一般,*,*,*,*,学校へ行こう!,ガッコウヘイコウ,ガッコーエイコー
』	記号,括弧閉,*,*,*,*,』,』,』
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
、	記号,読点,*,*,*,*,、,、,、
面白かっ	形容詞,自立,*,*,形容詞・アウオ段,連用タ接続,面白い,オモシロカッ,オモシロカッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
$ echo "昨日の「学校へ行こう!」は、面白かった。" | mecab -d .
昨日	名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
「	記号,括弧開,*,*,*,*,「,「,「
学校へ行こう!	名詞,一般,*,*,*,*,学校へ行こう!,ガッコウヘイコウ,ガッコーエイコー
」	記号,括弧閉,*,*,*,*,」,」,」
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
、	記号,読点,*,*,*,*,、,、,、
面白かっ	形容詞,自立,*,*,形容詞・アウオ段,連用タ接続,面白い,オモシロカッ,オモシロカッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
$ echo "昨日の学校へ行こう!は、面白かった。" | mecab -d .
昨日	名詞,副詞可能,*,*,*,*,昨日,キノウ,キノー
の	助詞,連体化,*,*,*,*,の,ノ,ノ
学校へ行こう!	名詞,一般,*,*,*,*,学校へ行こう!,ガッコウヘイコウ,ガッコーエイコー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
、	記号,読点,*,*,*,*,、,、,、
面白かっ	形容詞,自立,*,*,形容詞・アウオ段,連用タ接続,面白い,オモシロカッ,オモシロカッ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
$ echo "明日こそ、学校へ行こう!" | mecab -d .
明日	名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
こそ	助詞,係助詞,*,*,*,*,こそ,コソ,コソ
、	記号,読点,*,*,*,*,、,、,、
学校	名詞,一般,*,*,*,*,学校,ガッコウ,ガッコー
へ	助詞,格助詞,一般,*,*,*,へ,ヘ,エ
行こ	動詞,自立,*,*,五段・カ行促音便,未然ウ接続,行く,イコ,イコ
う	助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
!	記号,一般,*,*,*,*,!,!,!
EOS
$ echo "明日こそ、学校へ行こう!を見よう!" | mecab -d .
明日	名詞,副詞可能,*,*,*,*,明日,アシタ,アシタ
こそ	助詞,係助詞,*,*,*,*,こそ,コソ,コソ
、	記号,読点,*,*,*,*,、,、,、
学校へ行こう!	名詞,一般,*,*,*,*,学校へ行こう!,ガッコウヘイコウ,ガッコーエイコー
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見よ	動詞,自立,*,*,一段,未然ウ接続,見る,ミヨ,ミヨ
う	助動詞,*,*,*,不変化型,基本形,う,ウ,ウ
!	記号,一般,*,*,*,*,!,!,!
EOS

1サンプル学習させただけだけど、そこそこ正しく形態素として認識するようになってる気がする。

おしまい

とりあえず、手順だけ。
設定ファイルの細かいところとか、実務的なところに踏み込んだ内容は、もう少し勉強しないとダメだ。。。
#そして「学校へ行こう!」は、固有名詞だった。。。めんどいからそのまま