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つのサブディレクトリが作成されます.
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-indexreading ./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
出力の結果.それが「信託」を分けたのを見た.信託基金は金融分野の常用語である.可視語彙や辞書には金融分野の語がカバーされていない.これもなぜ自分の分詞システムがあるのか.