« L1-regularized CRFを実装してみた | メイン | AjaxIMEのHTTPサーバは pre-pthread »

2007年06月23日

Yahoo!の形態素解析をMeCabで無理やり再現してみる

MeCabで形態素解析器を作りたい場合は以下の二つの言語リソースが必要です。
1. 辞書 (単語と品詞のペアの集合)
2. 入力文と、それに対応する正解出力ペア(正解データ)

現在公開している mecab-ipadic は、ipadicとRWCPコーパスという正解データを使っています。

ここから分かるとおり、少なくともMeCabを使う場合は、コスト値を丹念にチューニング するといった職人芸は要りません。形態素解析への入力文とそれに対応する(理想)出力 があればコスト値を機械学習的なアプローチで構築することができます。

さらに、正解データを人手で作る必要は必ずしもありません。 すなわち、Yahoo!の形態素解析器の出力結果を「擬似正解」とみなして MeCabの学習プログラムを走らせれば、Yahoo!の出力を高い精度で再現できる MeCab用辞書を作成することが原理的に可能です。

ふだんはあまり触れられることのないMeCabの学習機能をとりあげるのに いい機会なので、おおまかな流れを紹介したいとおもいます。


今回タスクでは、リソース 1. の辞書は直接入手できません。 しかし、ipadic, jumandic, cannadic, さらにはwikipediaのエントリーなどを解析させて、 その結果を sort + uniq したものを「擬似辞書」と思えば、リーズナブルなサイズの 辞書を作ることができます。実際、ipadic のエントリは 4M = 4000K程度しかありません。 1リクエスト100kb なので、URLエンコーディングして辞書のサイズが5倍ぐらいになったとしても、 たった200リクエストでこの作業は完了します。また、wikipediaから自然文を抜き出して、それらの解析結果を sort + uniq してもいいでしょう。

問題は、動詞・形容詞の活用です。いくらたくさんあつめても、 すべての活用形を網羅的に集めることは難しいです。幸い、Yahoo!の形態素解析で 使われている品詞体系は、ipadicとかなり互換があり、活用形に関して言えば、ほぼ 1対1対応のようです。今回は ipadic の活用展開ルールを使うことにします。

2. の正解データの作成は簡単です。wikipedia からランダムに自然文を抜き出して、 それの解析結果を「擬似正解」として使います。ipadic や jumandic は およそ4万文程度の学習データを使っています。データは多いにこしたことはないのですが、 MeCabの学習プログラムは大量のメモリーを使うので、実際には5000~10000文程度 で十分かと思います。もちろん余裕があれば4万文のほうがbetterです。

以上が大きな流れです。結局は

1. Yahoo!の形態素解析結果をMeCabフォーマットで出力できるようなラッパースクリプト
2. 活用形を展開するスクリプト
3. Yahoo!の形態素解析器用のMeCab設定ファイル (rewrite.def, feature.def, char.def, unk.def)

を作ればよさそうです。
ここにスクリプトと設定ファイルをでっちあげてみました。 以下が実際の作業ログです。(参考ページ)

0. 準備
webma.plを編集して、$appid="" の部分に自分のアプリケーションIDを入れます。
% ./webma.pl
すもももももももものうち。
^D
すもも  名詞,名詞,*,すもも,すもも,すもも
も      助詞,係助詞,*,も,も,も
もも    動詞,マ五,未然ウ接続,もも,もも,もむ
もも    動詞,マ五,未然ウ接続,もも,もも,もむ
も      助詞,係助詞,*,も,も,も
の      助詞,助詞連体化,*,の,の,の
うち    名詞,名詞,*,うち,うち,うち
。      特殊,句点,*,。,。,。
EOS
のように解析されれば正常に動いています。ちなみに出力はまるでMeCabそのものです。 APIのフォーマット指定で "feature" を選ぶと、MeCabと同様CSVフォーマットの 素性列(品詞や読み)が取得できます。

1. いろいろな辞書やテキストを解析して「擬似辞書」を作る
% cat ipadic.txt wikipedia.txt sentence.txt | ./webma.pl -n 10000 > dic.tmp
-n は最大リクエストの数です。
ipadic.txt: ipadicの一番左のカラムにある単語を1行1単語でかいたもの
wikipedia.txt: のエントリー (<title>の中身) を抽出したファイル
sentence.txt: wikipediaから無作為に抽出した大量の文

wikipedia から生文を取り出す方法はこちら を参照するといいと思います。すべてのファイルの文字コードはutf8にします。もちろん、他のリソースを使ってもぜんぜんかまいません。

2. MeCab用辞書の作成。
mkmecabdic.pl を動かします。基本的に活用形を展開しているだけです。
% sort dic.tmp | uniq | ./mkmecabdic.pl | sort | uniq > dic.csv


3. 学習データ作り
% ./webma.pl -s 5000 sentence.txt > train.data
-s 5000は5000文, 正確には5000行(1行1文なので)抜き出すということです。 メモリに余裕があれば、10000文でもいいと思います。

4. 学習用辞書の作成
% /usr/local/libexec/mecab/mecab-dict-index -f utf8 -t utf8


5. CRFによるパラメータ学習
% /usr/local/libexec/mecab/mecab-cost-train train.data model
...
..
Number of sentences: 9075
Number of features:  703119
eta:                 0.00100
freq:                1
threads:             2
C(sigma^2):          1.00000

iter=0 err=1.00000 F=0.29640 target=485296.36725 diff=1.00000
iter=1 err=0.91328 F=0.71708 target=300421.11341 diff=0.38095
iter=2 err=0.90512 F=0.73370 target=158776.14010 diff=0.47149
iter=3 err=0.86645 F=0.78158 target=117409.39675 diff=0.26054
iter=4 err=0.80782 F=0.82014 target=80331.79304 diff=0.31580
..
..

iter=97 err=0.07317 F=0.99542 target=9218.43135 diff=0.00223
iter=98 err=0.07218 F=0.99547 target=9211.00788 diff=0.00081
iter=99 err=0.07140 F=0.99544 target=9204.09402 diff=0.00075
iter=100 err=0.07229 F=0.99540 target=9199.63197 diff=0.00048

Done! writing model file ...
時間とメモリを食います。じっと耐え忍びます。がまんできないときは、学習データ量を 減らします。-p2とすればマルチスレッドで学習し、ちょっと高速になります。 ちなみに F=0.99540 とは学習データに対して、99.54%の精度で出力を 再現できたという意味です。

6. 最終辞書の作成
webmadicといディレクトリを作って、CRFの結果ファイル(model)から辞書を作ります。 webmadicに辞書が作成されます。
% mkdir webmadic
% /usr/local/libexec/mecab/mecab-dict-gen -d. -o webmadic -m model
reading ./unk.def ... 87
reading ./dic.csv ... 392018
emitting webmadic/eft-id.def/ final/right-id.def
emitting webmadic/unk.def ... 87
emitting webmadic/dic.csv ... 392018
emitting matrix      : 100% |###########################################|
copying ./char.def to webmadic/char.def
copying ./rewrite.def to webmadic/rewrite.def
copying ./dicrc to webmaidc/dicrc
copying ./feature.def to webmadic/feature.def

done!

7. 辞書のコンパイル + 実際に解析
% cd webmadic; /usr/local/libexec/mecab/mecab-dict-index -f utf8 -t utf8

mecab で解析
% mecab -d webmadic
Yahoo!JAPANで使われている日本語形態素解析エンジンのAPIを公開。文章に含まれる特徴的な単語などが分かり、他のAPIと組み合わせたマッシュアップなどの活用を期待している。 
Yahoo   名詞,名詞,*,*,*,*
!      特殊,句点,*,!,!,!
JAPAN   名詞,名詞,*,*,*,*
で      助詞,格助詞,*,で,で,で
使わ    動詞,ワ五,未然形,使わ,つかわ,使う
れ      助動詞,助動詞一段,連用形,れ,れ,れる
て      助詞,接続助詞,*,て,て,て
いる    助動詞,助動詞一段,基本形,いる,いる,いる
日本語  名詞,名詞,*,日本語,にっぽんご,日本語
形態素  名詞,名詞,*,形態素,けいたいそ,形態素
解析    名詞,名サ他,*,解析,かいせき,解析
エンジン        名詞,名詞,*,エンジン,えんじん,エンジン
の      助詞,助詞連体化,*,の,の,の
API     名詞,名詞,*,*,*,*
を      助詞,格助詞,*,を,を,を
公開    名詞,名サ他,*,公開,こうかい,公開
。      特殊,句点,*,。,。,。
文章    名詞,名詞,*,文章,ぶんしょう,文章
に      助詞,格助詞,*,に,に,に
含ま    動詞,マ五,未然形,含ま,ふくま,含む
れる    助動詞,助動詞一段,基本形,れる,れる,れる
特徴的  形容動詞,形動,*,特徴的,とくちょうてき,特徴的
な      助動詞,助動詞だ,体言接続,な,な,だ
単語    名詞,名詞,*,単語,たんご,単語
など    助詞,副助詞,*,など,など,など
が      助詞,格助詞,*,が,が,が
分かり  動詞,ラ五,連用形,分かり,わかり,分かる
、      特殊,読点,*,、,、,、
他      名詞,名詞,*,他,た,他
の      助詞,助詞連体化,*,の,の,の
API     名詞,名詞,*,*,*,*
と      助詞,格助詞,*,と,と,と
組み合わ        動詞,ワ五,未然形,組み合わ,くみあわ,組み合う
せ      助動詞,助動詞一段,連用形,せ,せ,せる
た      助動詞,助動詞た,基本形,た,た,た
マッシュ        名詞,名詞,*,マッシュ,まっしゅ,マッシュ
アップ  名詞,名サ自,*,アップ,あっぷ,アップ
など    助詞,副助詞,*,など,など,など
の      助詞,助詞連体化,*,の,の,の
活用    名詞,名サ他,*,活用,かつよう,活用
を      助詞,格助詞,*,を,を,を
期待    名詞,名サ他,*,期待,きたい,期待
し      助動詞,助動詞する,連用形,し,し,する
て      助詞,接続助詞,*,て,て,て
いる    助動詞,助動詞一段,基本形,いる,いる,いる
。      特殊,句点,*,。,。,。
EOS

Webmaで解析
% ./webma.pl
Yahoo!JAPANで使われている日本語形態素解析エンジンのAPIを公開。文章に含まれる特徴的な単語などが分かり、他のAPIと組み合わせたマッシュアップなどの活用を期待している。
Yahoo   名詞,名詞,*,Yahoo,Yahoo,Yahoo
!      特殊,句点,*,!,!,!
JAPAN   名詞,名詞,*,JAPAN,JAPAN,JAPAN
で      助動詞,助動詞だ,連用形,で,で,だ
使わ    動詞,ワ五,未然形,使わ,つかわ,使う
れ      助動詞,助動詞一段,連用形,れ,れ,れる
て      助詞,接続助詞,*,て,て,て
いる    助動詞,助動詞一段,基本形,いる,いる,いる
日本語  名詞,名詞,*,日本語,にっぽんご,日本語
形態素  名詞,名詞,*,形態素,けいたいそ,形態素
解析    名詞,名サ他,*,解析,かいせき,解析
エンジン        名詞,名詞,*,エンジン,えんじん,エンジン
の      助詞,助詞連体化,*,の,の,の
API     名詞,名詞,*,API,API,API
を      助詞,格助詞,*,を,を,を
公開    名詞,名サ他,*,公開,こうかい,公開
。      特殊,句点,*,。,。,。
EOS
文章    名詞,名詞,*,文章,ぶんしょう,文章
に      助詞,格助詞,*,に,に,に
含ま    動詞,マ五,未然形,含ま,ふくま,含む
れる    助動詞,助動詞一段,基本形,れる,れる,れる
特徴的  形容動詞,形動,*,特徴的,とくちょうてき,特徴的
な      助動詞,助動詞だ,体言接続,な,な,だ
単語    名詞,名詞,*,単語,たんご,単語
など    助詞,副助詞,*,など,など,など
が      助詞,格助詞,*,が,が,が
分かり  動詞,ラ五,連用形,分かり,わかり,分かる
、      特殊,読点,*,、,、,、
他      名詞,名詞,*,他,た,他
の      助詞,助詞連体化,*,の,の,の
API     名詞,名詞,*,API,API,API
と      助詞,助詞副詞化,*,と,と,と
組み合わせ      動詞,一段,連用形,組み合わせ,くみあわせ,組み合わせる
た      助動詞,助動詞た,基本形,た,た,た
マッシュ        名詞,名詞,*,マッシュ,まっしゅ,マッシュ
アップ  名詞,名サ自,*,アップ,あっぷ,アップ
など    助詞,副助詞,*,など,など,など
の      助詞,助詞連体化,*,の,の,の
活用    名詞,名サ他,*,活用,かつよう,活用
を      助詞,格助詞,*,を,を,を
期待    名詞,名サ他,*,期待,きたい,期待
し      助動詞,助動詞する,連用形,し,し,する
て      助詞,接続助詞,*,て,て,て
いる    助動詞,助動詞一段,基本形,いる,いる,いる
。      特殊,句点,*,。,。,。
EOS


それなりに正しく解析できています。すばらしい。

最後になりましたが、このtipsは完全に無保証です。 ライセンス問題が当然発生しますし、個人利用でも使用条件にひっかるかもしれません。 いかなる問題の責任は負いかねます。

投稿者 taku : 2007年06月23日 00:57

トラックバック

このエントリーのトラックバックURL:
http://chasen.org/~taku/blog/mt-tb.cgi/229