MeCabで自分の分詞器を作る(二)
9133 ワード
MeCabで自分の分詞器を作る(一)操作に従って、MeCabを取り付けました.
次に、指定した方法で語彙、辞書、プロファイルを整理し、独自の分詞システムを構築します.
backoff 2005のマイクロソフト研究院の中国語分詞語彙を利用して、簡単な分詞システムを訓練し、私たちの総目標を徐々に深く達成します.
現在のディレクトリは$WordSegで、マイクロソフトの語彙を現在のディレクトリにダウンロードし、解凍し、msr_を作成します.mecab_testディレクトリ.
~/Project/WordSeg$ ls icwb2-data icwb2-data.zip msr_mecab_test
icwb 2-dataディレクトリには、次のファイルがあります.
~/Project/WordSeg/icwb2-data$ ls doc gold README scripts testing training
ここでtrainingディレクトリにはトレーニング用語が格納され,goldには辞書ファイルが格納されている.
~/Project/WordSeg/icwb2-data/training$ ls as_training.b5 cityu_training.txt msr_training.txt pku_training.txt as_training.utf8 cityu_training.utf8 msr_training.utf8 pku_training.utf8 ~/Project/WordSeg/icwb2-data/gold$ ls as_testing_gold.txt cityu_test_gold.txt msr_test_gold.txt pku_test_gold.txt as_testing_gold.utf8 cityu_test_gold.utf8 msr_test_gold.utf8 pku_test_gold.utf8 as_training_words.txt cityu_training_words.txt msr_training_words.txt pku_training_words.txt as_training_words.utf8 cityu_training_words.utf8 msr_training_words.utf8 pku_training_words.utf8
この2つの語彙によってMeCabに必要な辞書と訓練語彙を作成し,我々のモデルを構築することができる.フィーチャー関数テンプレートの指定、ログインしていない処理方法など、プロファイルも必要です.
msr_mecab_testディレクトリの下に、seed,final,scriptの3つのサブディレクトリが作成されます.
~/Project/WordSeg/msr_mecab_test$ ls final script seed
seedディレクトリに切り替えます.
1.icwb 2-dataで提供されている辞書を、MeCab形式に変換します.
1123項,0,0,0,0,0,0,0,0,0,0佳醸,0,0,0,0,0,0沿道,0,0,0,0,0,0,0,0,0三四十歳,0,0,0,0,0,0,0,0,0,0統建,0,0,0,0,0,0,0蓓蕾,0,0,0,0,0,0,0李祐生,0,0,0,0,0,0,0,0,0,0,0,0,0
各行には7つのフィーチャーが含まれており、詳細は後述します.分詞機能だけなら、後の6つはゼロにすればいいです.
2、プロファイルの準備
seedディレクトリの下にdicrc,char.def,unk.def,rewrite.def,feature.defの5つの最も基本的なプロファイルを用意します.
1) dicrc:このファイルに辞書の各種動作を設定する場合、以下は最小構成です.
2) char.def:未登録語処理のファイルを定義します.通常、日本語の文法分析は文字の種類に基づいて未登録語を処理し、Mecabのどの文字がどの文字の種類に属するか、ユーザーは細かく指定することができます.各文字カテゴリについて,どの未登録語の識別処理を採用する必要があるか,詳細な定義も可能である.
3) unk.def:単語が登録されていない辞書です.
4) rewrite.def:フィーチャー列から内部状態フィーチャー列への変換マッピングを定義します.
5) Feature.def:内部状態の素生列からCRFの素生列を抽出するテンプレートを定義します
msrが提供する語彙フォーマットは、次のとおりです.
人々 常に 言う 生活する はい 1 部 教科書 , そして 血 と 火 の 戦争 さらに はい 得がたい の 教科書 , 彼女 確かに はい 名実ともに の ‘ わたし の 大学 ’ . “ 心 静 だんだん 知る 春 に似ている 海 , 花 深さ 毎 覚 影 生 香 . “ 食べる 糞 の もの , つながる 1 バンドル 麦 同じく 押し切る いいえ 動く やれやれ ? 彼 “ 厳格な要求 自分自身 , から 1つ 科挙 出身 の 進士 になる 1つ 偉大である の 民主主義 者 , さらに になる 1 ビット すばらしい の 党外 共産主義 戦士 , 身をささげる 于 崇高である の 共産主義 事業 .
分詞はスペースで区切られていますが、MeCabのトレーニング用語は辞書のフォーマットとよく似ています.各行の先頭に単語があり、tabキーで区切られています.後に単語に関連する特徴、例えば語性、発音などがあります.分詞機能だけで、後ろにゼロを置けばいいです.
人々 0,0,0,0,0常 0,0,0,0,0説 0,0,0,0,0生活 0,0,0,0,0は 0,0,0,0,1 0,0,0,0,0部 0,0,0,0,0教科書 0,0,0,0,0,0 , 0,0,0,0,0 0,0,0,0,0血 0,0,0,0,0と 0,0,0,0,0火 0,0,0,0,0の 0,0,0,0,0戦争 0,0,0,0,0より 0,0,0,0,0は 0,0,0,0,0は得られない 0,0,0,0,0の 0,0,0,0,0教科書 0,0,0,0,0,0 , 0,0,0,0,0彼女 0,0,0,0,0は確かに 0,0,0,0,0は 0,0,0,0,0,0
seedディレクトリの下に2つのファイルが追加されました.corpusとmsr_words.csvです.
これまで、トレーニング用の辞書、プロファイル、トレーニング用語が用意されています.
seed辞書(CSV形式ファイルセット)すべてのプロファイル(char.def,unk.def,rewrite.def,feature.def)トレーニング用データ(ファイル名:corpus)
4、トレーニング用のバイナリ辞書を生成する
seedディレクトリで次のコマンドを実行し、学習用のバイナリ辞書を生成します.
/usr/local/libexec/mecab/mecab-dict-index
コマンド/usr/local/libexec/mecab/mecab-dict-index-d$WORK/seed-o$WORK/seed-d:seed辞書とプロファイルを含むディレクトリ(デフォルトは現在のディレクトリ)-o:トレーニング用バイナリ辞書の出力ディレクトリ(デフォルトは現在のディレクトリ)を実行するには、-d,-oオプションで入出力ディレクトリを指定します.
5、CRFモデルパラメータトレーニング
seedディレクトリでCRFモデルを訓練するコマンドを実行します:/usr/local/libexec/mecab/mecab-cost-train -c 1.0 corpus model
-dパラメータを使用して、使用する辞書/usr/local/libexec/mecab/mecab-cost-trainを指定できます. -d$WORK/seed-c 1.0$WORK/seed/corpus$WORK/seed/model-d:トレーニング用バイナリ辞書を含むディレクトリ(デフォルトは現在のディレクトリ)-c:CRFのスーパーパラメータ(hyper-parameter)-f:特徴周波数のしきい値-p NUM:NUM個の並列トレーニングを実行(デフォルトは1)corpus:トレーニングデータファイル名model:出力CRFパラメータファイル名
この訓練過程にはしばらく時間がかかり、最終的な出力は大体以下の通りである.
6、配布用辞書の生成
seedディレクトリの下で実行:
/usr/local/libexec/mecab/mecab-dict-gen -o ../final -m model
-d-oオプションを使用して、辞書/usr/local/libexec/mecab/mecab-dict-gen-o$WORK/final-d$WORK/seed-m$WORK/seed/model-d:seed辞書とプロファイルを含むディレクトリ(デフォルトは現在のディレクトリ)を指定することもできます.-o:パブリッシュ用辞書の出力ディレクトリ-m:CRFのパラメータファイルパブリッシュ用辞書はseed辞書とは異なるディレクトリに出力する必要があり、通常はパブリッシュ辞書を含むfinalディレクトリをパッケージ化してパブリッシュ用に使用する.
7、解析器用辞書を生成finalディレクトリの下にcd.../final実行/usr/local/libexec/mecab/mecab-dict-index
-d-oオプションを使用して、辞書usr/local/libexec/mecab/mecab-dict-index-d$WORK/final-o$WORK/final-d:seed辞書とプロファイルを含むディレクトリ(デフォルトは現在のディレクトリ)-o:解析器用バイナリ辞書の出力ディレクトリ(デフォルトは現在のディレクトリ)を指定することもできます.
これで、MeCab中国語の分詞に必要な辞書とモデルファイルの準備が整い、finalディレクトリの下で、テストして、前の階層のディレクトリ(cd.)に戻って、実行することができます.
どうぞ 0,0,0紹介状 0,0,0托 0,0,0基金 0,0,0の 0,0,0の場合 0,0,0 EOS
出力の結果.それが「信託」を分けたのを見た.信託基金は金融分野の常用語である.可視語彙や辞書には金融分野の語がカバーされていない.これもなぜ自分の分詞システムがあるのか.
次に、指定した方法で語彙、辞書、プロファイルを整理し、独自の分詞システムを構築します.
backoff 2005のマイクロソフト研究院の中国語分詞語彙を利用して、簡単な分詞システムを訓練し、私たちの総目標を徐々に深く達成します.
現在のディレクトリは$WordSegで、マイクロソフトの語彙を現在のディレクトリにダウンロードし、解凍し、msr_を作成します.mecab_testディレクトリ.
~/Project/WordSeg$ ls icwb2-data icwb2-data.zip msr_mecab_test
icwb 2-dataディレクトリには、次のファイルがあります.
~/Project/WordSeg/icwb2-data$ ls doc gold README scripts testing training
ここでtrainingディレクトリにはトレーニング用語が格納され,goldには辞書ファイルが格納されている.
~/Project/WordSeg/icwb2-data/training$ ls as_training.b5 cityu_training.txt msr_training.txt pku_training.txt as_training.utf8 cityu_training.utf8 msr_training.utf8 pku_training.utf8 ~/Project/WordSeg/icwb2-data/gold$ ls as_testing_gold.txt cityu_test_gold.txt msr_test_gold.txt pku_test_gold.txt as_testing_gold.utf8 cityu_test_gold.utf8 msr_test_gold.utf8 pku_test_gold.utf8 as_training_words.txt cityu_training_words.txt msr_training_words.txt pku_training_words.txt as_training_words.utf8 cityu_training_words.utf8 msr_training_words.utf8 pku_training_words.utf8
この2つの語彙によってMeCabに必要な辞書と訓練語彙を作成し,我々のモデルを構築することができる.フィーチャー関数テンプレートの指定、ログインしていない処理方法など、プロファイルも必要です.
msr_mecab_testディレクトリの下に、seed,final,scriptの3つのサブディレクトリが作成されます.
mkdir seed
mkdir final
mkdir script
~/Project/WordSeg/msr_mecab_test$ ls final script seed
seedディレクトリに切り替えます.
1.icwb 2-dataで提供されている辞書を、MeCab形式に変換します.
1123項,0,0,0,0,0,0,0,0,0,0佳醸,0,0,0,0,0,0沿道,0,0,0,0,0,0,0,0,0三四十歳,0,0,0,0,0,0,0,0,0,0統建,0,0,0,0,0,0,0蓓蕾,0,0,0,0,0,0,0李祐生,0,0,0,0,0,0,0,0,0,0,0,0,0
各行には7つのフィーチャーが含まれており、詳細は後述します.分詞機能だけなら、後の6つはゼロにすればいいです.
2、プロファイルの準備
seedディレクトリの下にdicrc,char.def,unk.def,rewrite.def,feature.defの5つの最も基本的なプロファイルを用意します.
1) dicrc:このファイルに辞書の各種動作を設定する場合、以下は最小構成です.
cost-factor = 800
bos-feature = BOS/EOS,*,*,*,*,*,*,*,*
eval-size = 6
unk-eval-size = 4
config-charset = UTF-8
2) char.def:未登録語処理のファイルを定義します.通常、日本語の文法分析は文字の種類に基づいて未登録語を処理し、Mecabのどの文字がどの文字の種類に属するか、ユーザーは細かく指定することができます.各文字カテゴリについて,どの未登録語の識別処理を採用する必要があるか,詳細な定義も可能である.
DEFAULT 0 1 0 # DEFAULT is a mandatory category!
SPACE 0 1 0
CJK 0 0 2
# SPACE
0x0020 SPACE # DO NOT REMOVE THIS LINE, 0x0020 is reserved for SPACE
0x00D0 SPACE
0x0009 SPACE
0x000B SPACE
0x000A SPACE
3) unk.def:単語が登録されていない辞書です.
DEFAULT,0,0,0,unk,*,*
SPACE,0,0,0,unk,*,*
CJK,0,0,0,unk,*,*
4) rewrite.def:フィーチャー列から内部状態フィーチャー列への変換マッピングを定義します.
[unigram rewrite]
*,*,* $1,$2,$3
[left rewrite]
*,*,* $1,$2,$3
[right rewrite]
*,*,* $1,$2,$3
5) Feature.def:内部状態の素生列からCRFの素生列を抽出するテンプレートを定義します
UNIGRAM W0:%F[6]
UNIGRAM W1:%F[0]/%F[6]
UNIGRAM W2:%F[0],%F?[1]/%F[6]
UNIGRAM W3:%F[0],%F[1],%F?[2]/%F[6]
UNIGRAM W4:%F[0],%F[1],%F[2],%F?[3]/%F[6]
UNIGRAM T0:%t
UNIGRAM T1:%F[0]/%t
UNIGRAM T2:%F[0],%F?[1]/%t
UNIGRAM T3:%F[0],%F[1],%F?[2]/%t
UNIGRAM T4:%F[0],%F[1],%F[2],%F?[3]/%t
BIGRAM B00:%L[0]/%R[0]
BIGRAM B01:%L[0],%L?[1]/%R[0]
BIGRAM B02:%L[0]/%R[0],%R?[1]
BIGRAM B03:%L[0]/%R[0],%R[1],%R?[2]
BIGRAM B04:%L[0],%L?[1]/%R[0],%R[1],%R?[2]
BIGRAM B05:%L[0]/%R[0],%R[1],%R[2],%R?[3]
BIGRAM B06:%L[0],%L?[1]/%R[0],%R[1],%R[2],%R?[3]
3、
msrが提供する語彙フォーマットは、次のとおりです.
人々 常に 言う 生活する はい 1 部 教科書 , そして 血 と 火 の 戦争 さらに はい 得がたい の 教科書 , 彼女 確かに はい 名実ともに の ‘ わたし の 大学 ’ . “ 心 静 だんだん 知る 春 に似ている 海 , 花 深さ 毎 覚 影 生 香 . “ 食べる 糞 の もの , つながる 1 バンドル 麦 同じく 押し切る いいえ 動く やれやれ ? 彼 “ 厳格な要求 自分自身 , から 1つ 科挙 出身 の 進士 になる 1つ 偉大である の 民主主義 者 , さらに になる 1 ビット すばらしい の 党外 共産主義 戦士 , 身をささげる 于 崇高である の 共産主義 事業 .
分詞はスペースで区切られていますが、MeCabのトレーニング用語は辞書のフォーマットとよく似ています.各行の先頭に単語があり、tabキーで区切られています.後に単語に関連する特徴、例えば語性、発音などがあります.分詞機能だけで、後ろにゼロを置けばいいです.
人々 0,0,0,0,0常 0,0,0,0,0説 0,0,0,0,0生活 0,0,0,0,0は 0,0,0,0,1 0,0,0,0,0部 0,0,0,0,0教科書 0,0,0,0,0,0 , 0,0,0,0,0 0,0,0,0,0血 0,0,0,0,0と 0,0,0,0,0火 0,0,0,0,0の 0,0,0,0,0戦争 0,0,0,0,0より 0,0,0,0,0は 0,0,0,0,0は得られない 0,0,0,0,0の 0,0,0,0,0教科書 0,0,0,0,0,0 , 0,0,0,0,0彼女 0,0,0,0,0は確かに 0,0,0,0,0は 0,0,0,0,0,0
seedディレクトリの下に2つのファイルが追加されました.corpusとmsr_words.csvです.
これまで、トレーニング用の辞書、プロファイル、トレーニング用語が用意されています.
seed辞書(CSV形式ファイルセット)すべてのプロファイル(char.def,unk.def,rewrite.def,feature.def)トレーニング用データ(ファイル名:corpus)
4、トレーニング用のバイナリ辞書を生成する
seedディレクトリで次のコマンドを実行し、学習用のバイナリ辞書を生成します.
/usr/local/libexec/mecab/mecab-dict-index
コマンド/usr/local/libexec/mecab/mecab-dict-index-d$WORK/seed-o$WORK/seed-d:seed辞書とプロファイルを含むディレクトリ(デフォルトは現在のディレクトリ)-o:トレーニング用バイナリ辞書の出力ディレクトリ(デフォルトは現在のディレクトリ)を実行するには、-d,-oオプションで入出力ディレクトリを指定します.
5、CRFモデルパラメータトレーニング
seedディレクトリでCRFモデルを訓練するコマンドを実行します:/usr/local/libexec/mecab/mecab-cost-train -c 1.0 corpus model
-dパラメータを使用して、使用する辞書/usr/local/libexec/mecab/mecab-cost-trainを指定できます. -d$WORK/seed-c 1.0$WORK/seed/corpus$WORK/seed/model-d:トレーニング用バイナリ辞書を含むディレクトリ(デフォルトは現在のディレクトリ)-c:CRFのスーパーパラメータ(hyper-parameter)-f:特徴周波数のしきい値-p NUM:NUM個の並列トレーニングを実行(デフォルトは1)corpus:トレーニングデータファイル名model:出力CRFパラメータファイル名
この訓練過程にはしばらく時間がかかり、最終的な出力は大体以下の通りである.
adding virtual node: 0,0,0,0,0,0
adding virtual node: 0,0,0,0,0,0
adding virtual node: 0,0,0,0,0,0
adding virtual node: 0,0,0,0,0,0
...
Number of sentences: 86918
Number of features: 28
eta: 0.00005
freq: 1
eval-size: 6
unk-eval-size: 4
threads: 1
charset: EUC-JP
C(sigma^2): 1.00000
iter=0 err=0.29595 F=0.94870 target=2267078.26396 diff=1.00000
iter=1 err=0.13623 F=0.97665 target=1056367.13470 diff=0.53404
iter=2 err=0.13849 F=0.97610 target=1005496.50043 diff=0.04816
iter=3 err=0.14630 F=0.97388 target=924449.25300 diff=0.08060
iter=4 err=0.13693 F=0.97643 target=891815.15638 diff=0.03530
iter=5 err=0.13537 F=0.97672 target=869032.52748 diff=0.02555
iter=6 err=0.11850 F=0.98127 target=854787.02218 diff=0.01639
iter=7 err=0.10803 F=0.98411 target=845031.70611 diff=0.01141
iter=8 err=0.08712 F=0.98848 target=838863.46990 diff=0.00730
iter=9 err=0.07940 F=0.99001 target=835481.49751 diff=0.00403
iter=10 err=0.07276 F=0.99114 target=833719.13204 diff=0.00211
iter=11 err=0.06556 F=0.99263 target=833462.32905 diff=0.00031
iter=12 err=0.06569 F=0.99258 target=831886.20533 diff=0.00189
iter=13 err=0.06568 F=0.99259 target=831739.11465 diff=0.00018
iter=14 err=0.06559 F=0.99262 target=831643.59710 diff=0.00011
iter=15 err=0.06531 F=0.99266 target=831599.69205 diff=0.00005
iter=16 err=0.06502 F=0.99274 target=831544.40251 diff=0.00007
iter=17 err=0.06480 F=0.99279 target=831518.14668 diff=0.00003
iter=18 err=0.06475 F=0.99280 target=831504.33361 diff=0.00002
iter=19 err=0.06470 F=0.99281 target=831502.92263 diff=0.00000
Done! writing model file ...
6、配布用辞書の生成
seedディレクトリの下で実行:
/usr/local/libexec/mecab/mecab-dict-gen -o ../final -m model
model is not a binary model. reopen it as text mode...
reading ./unk.def ... 3
reading ./msr_words.csv ... 88119
emitting ../final/left-id.def/ ../final/right-id.def
emitting ../final/unk.def ... 3
emitting ../final/msr_words.csv ... 88119
emitting matrix : 100% |###########################################|
emitting matrix : 133% |########################################### copying ./char.def to ../final/char.def
copying ./rewrite.def to ../final/rewrite.def
copying ./dicrc to ../final/dicrc
copying ./feature.def to ../final/feature.def
copying model to ../final/model.def
done!
-d-oオプションを使用して、辞書/usr/local/libexec/mecab/mecab-dict-gen-o$WORK/final-d$WORK/seed-m$WORK/seed/model-d:seed辞書とプロファイルを含むディレクトリ(デフォルトは現在のディレクトリ)を指定することもできます.-o:パブリッシュ用辞書の出力ディレクトリ-m:CRFのパラメータファイルパブリッシュ用辞書はseed辞書とは異なるディレクトリに出力する必要があり、通常はパブリッシュ辞書を含むfinalディレクトリをパッケージ化してパブリッシュ用に使用する.
7、解析器用辞書を生成finalディレクトリの下にcd.../final実行/usr/local/libexec/mecab/mecab-dict-index
reading ./unk.def ... 3
emitting double-array: 100% |###########################################|
./pos-id.def is not found. minimum setting is used
reading ./msr_words.csv ... 88119
emitting double-array: 100% |###########################################|
reading ./matrix.def ... 3x3
emitting matrix : 100% |###########################################|
done!
-d-oオプションを使用して、辞書usr/local/libexec/mecab/mecab-dict-index-d$WORK/final-o$WORK/final-d:seed辞書とプロファイルを含むディレクトリ(デフォルトは現在のディレクトリ)-o:解析器用バイナリ辞書の出力ディレクトリ(デフォルトは現在のディレクトリ)を指定することもできます.
これで、MeCab中国語の分詞に必要な辞書とモデルファイルの準備が整い、finalディレクトリの下で、テストして、前の階層のディレクトリ(cd.)に戻って、実行することができます.
/WordSeg/msr_mecab_test$ mecab -d ./final/
どうぞ 0,0,0紹介状 0,0,0托 0,0,0基金 0,0,0の 0,0,0の場合 0,0,0 EOS
出力の結果.それが「信託」を分けたのを見た.信託基金は金融分野の常用語である.可視語彙や辞書には金融分野の語がカバーされていない.これもなぜ自分の分詞システムがあるのか.