-
Notifications
You must be signed in to change notification settings - Fork 220
/
learn.html
634 lines (552 loc) · 24.4 KB
/
learn.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>MeCab: オリジナル辞書/コーパスからのパラメータ推定</title>
<link type="text/css" rel="stylesheet" href="mecab.css">
</head>
<body>
<h1>オリジナル辞書/コーパスからのパラメータ推定</h1>
<h2>概要</h2>
<p>学習用コーパスからパラメータ(コスト値)を推定することができます.
MeCab 自身は品詞体系に非依存な設計になっているため,
独自の品詞体系, 辞書, コーパスに基づく解析器を作成することができます.
パラメータ推定には Conditinoal Random Fields (<a href="http://www.cis.upenn.edu/~pereira/papers/crf.pdf">CRF</a>) を使っています. </p>
<p>
<h2>処理の流れ</h2>
<p>データフロー図は次のようになります. </p>
<img src="flow.png">
<p>パラメータ推定には以下のサブタスクがあります. </p>
<ul>
<li><a href="#seed">Seed辞書の準備</a>
<li><a href="#config">設定ファイルの準備</a>
<ul>
<li>dicrc
<li>char.def
<li>unk.def
<li>rewrite.def
<li>feature.def
</ul>
<li><a href="#corpus">学習用コーパスの準備</a>
<li><a href="#binary">学習用バイナリ辞書の作成</a>
<li><a href="#crf"><a href="http://www.cis.upenn.edu/~pereira/papers/crf.pdf">CRF</a> パラメータの学習</a>
<li><a href="#dist">配布用辞書の作成</a>
<li><a href="#test">解析用バイナリ辞書の作成</a>
<li><a href="#eval">評価</a>
<li><a href="#retrain">再学習</a>
</ul>
<p>それぞれ順に説明していきます. </p>
<h2><a name="seed">Seed辞書の準備</a></h2>
<p>MeCabの辞書は CSV で記述されます. Seed 辞書と配布辞書のフォーマッ
トは基本的に同一です. </p>
<p>以下が辞書のエントリの例です. </p>
<pre>
進学校,0,0,0,名詞,一般,*,*,*,*,進学校,シンガクコウ,シンガクコー
梅暦,0,0,0,名詞,一般,*,*,*,*,梅暦,ウメゴヨミ,ウメゴヨミ
気圧,0,0,0,名詞,一般,*,*,*,*,気圧,キアツ,キアツ
水中翼船,0,0,0,名詞,一般,*,*,*,*,水中翼船,スイチュウヨクセン,スイチューヨクセン
</pre>
<p>最初の4カラム目までは, 必須項目で, </p>
<ul>
<li>表層形 (単語そのもの)
<li>左連接状態番号
<li>右連接状態番号
<li>コスト
</ul>
<p>となっています. 左連接状態番号, 右連接状態番号, コストは, Seed 辞書では
使われないので 0 としておきます.</p>
<p>5カラム目以降は「素性」と呼ばれる項目です. MeCab は, システムの汎用性
を高めるために, 「品詞」「活用」「読み」「発音」といった「単語に付与され
る情報」をシステムは区別せず「素性」として扱っています. ユーザは CSV が
許す限り何個でも素性を付与することができます. ただし, 各カラムの素性の
定義はそろえておく必要があります. (5カラム目は品詞, 6カラム目は品詞再分
類等) 通常, 素性番号の若いものから順に一般的な素性を列挙していきます.
(例: 品詞, 品詞細分類, 活用型, 活用形, 原形, 読み, 発音)
</p>
<p>素性は内部的には配列として扱われます. 0番目の素性, 1番目の素性.. と
いう呼び方で素性を参照することがあります. 素性の番号と内部表現(品詞, 読
み等)は, ユーザ自身が管理してください. </p>
<p>上記の例は, ipadic の例です. 素性列として</p>
<ul>
<li>品詞
<li>品詞細分類1
<li>品詞細分類2
<li>品詞細分類3
<li>活用型
<li>活用形
<li>基本形
<li>読み
<li>発音
</ul>
<p>が定義されています. </p>
<p>MeCab は活用処理を行いません. 活用する語の場合は, ユーザが事前に活用
を展開する必要があります.
<pre>
連れ出す,0,0,0,動詞,自立,*,*,五段・サ行,基本形,連れ出す,ツレダス,ツレダス
連れ出さ,0,0,0,動詞,自立,*,*,五段・サ行,未然形,連れ出す,ツレダサ,ツレダサ
連れ出そ,0,0,0,動詞,自立,*,*,五段・サ行,未然ウ接続,連れ出す,ツレダソ,ツレダソ
連れ出し,0,0,0,動詞,自立,*,*,五段・サ行,連用形,連れ出す,ツレダシ,ツレダシ
連れ出せ,0,0,0,動詞,自立,*,*,五段・サ行,仮定形,連れ出す,ツレダセ,ツレダセ
連れ出せ,0,0,0,動詞,自立,*,*,五段・サ行,命令e,連れ出す,ツレダセ,ツレダセ
連れ出しゃ,0,0,0,動詞,自立,*,*,五段・サ行,仮定縮約1,連れ出す,ツレダシャ,ツレダシャ
</pre></p>
<h2><a name="config">設定ファイルの準備</a></h2>
<h3>dicrc</h3>
<p>
辞書のさまざまな動作を指定するファイルです. 以下が最低限の設定です. <p>
<pre>
cost-factor = 800
bos-feature = BOS/EOS,*,*,*,*,*,*,*,*
eval-size = 6
unk-eval-size = 4
config-charset = EUC-JP
</pre>
<ul>
<li>cost-factor: コスト値に変換するときのスケーリングファクターです.
700 から 800 で問題ありません.
<li>bos-feature: 文頭, 文末の素性です. CSV で表現します.
<li>eval-size: 既知語の時, 素性の先頭から何個合致すれば正解と認定するか
を指定します. 通常, 既知語は品詞, 活用といった情報のみが正解すればよいので, 「読み」「発音」といった素性は無
視するようにします. 上記の例では 6 となっているので, IPA品詞体系の
品詞, 品詞細分類1, 2, 3, 活用型, 活用形 の 6つが評価されます.
<li>unk-eval-size: 未知語の時, 素性の先頭から何個合致すれば正解と認定
するかを指定します.
<li>config-charset: dicrc, char.def, unk.def, pos-id.defファイルの文字コードです.
</ul>
<h3>char.def</h3>
<p>
未知語処理の定義ファイルです. 通常日本語の形態素解析では字種に基づく未知
語処理が行われます. MeCab では, どの文字をどの字種として定義するかといった設
定を細かく指定することができます. さらに, 各字種に対し, どのような未知語
処理を行うか細かく指定することができます.
</p>
<p>
ファイルの最初には, カテゴリ名の定義と, 各カテゴリの未知語処理の動作
を定義します.
<pre>
カテゴリ名 動作タイミング(0/1) グルーピング(0/1) 長さ(0,1, 2... n)
</pre>
<ul>
<li>カテゴリ名: カテゴリの名前です. <br>
HIRANA, KATAKANA.. といったカテゴリを定義します.DEFAULT と SPACE は必須のカテゴリです.
<li>動作タイミング: <br>
そのカテゴリにおいて, いつ未知語処理を動かすかを定義します.
<ul>
<li>0: 既知語がある場合は, 未知語処理を動作させません
<li>1: 常に未知語処理を動かします
</ul>
<li>グルーピング: 未知語の候補生成方法です.
<ul>
<li>0: 同じ字種でまとめません.
<li>1: 同じ字種でまとめます.
</ul>
<li>長さ: 未知語の候補生成方法です.
<ul>
<li>1: 1文字までの文字列を未知語とします.
<li>2: 2文字までの文字列を未知語とします. <br>
...
<li>n: n文字までの文字列を未知語とします. <br>
</ul>
グルーピングと長さは同時に指定することができます.
</ul>
<p>例</p>
<pre>
KANJI 0 0 2
SYMBOL 1 1 0
NUMERIC 1 1 0
ALPHA 1 1 0
HIRAGANA 0 1 2 </pre>
</p>
<p>次に, 各カテゴリがUCS2のコードポイントのどこに該当するか定義します. </p>
<pre>
codepoint デフォルトカテゴリ名 互換カテゴリ名1 互換カテゴリ名2 ..
</pre>
<p>もしくは,</p>
<pre>
low_codepoint..high_codepoint デフォルトカテゴリ名 互換カテゴリ名1 互換カテゴリ名2 ..
</pre>
<p>例</p>
<pre>
0x0009 SPACE
0x30A1..0x30FF KATAKANA
0x30FC KATAKANA HIRAGANA # ー
</pre>
<p>コードポイントは UCS2(Unicode)を 0x から始まる16進数で記述します.</p>
<p>
最初のカテゴリは, そのコードポイントのデフォルトカテゴリです.
さらに, 互換カテゴリを列挙することができます. 上記の例では, 長音記号「ー」
は, デフォルトではカタカナですが, 平仮名を互換カテゴリとして持ちます.
グルーピング動作の時に互換カテゴリは同じグループとしてみなされます.
</p>
<p>以下が char.def の具体例です.</p>
<pre>
DEFAULT 0 1 0 # DEFAULT is a mandatory category!
SPACE 0 1 0
KANJI 0 0 2
SYMBOL 1 1 0
NUMERIC 1 1 0
ALPHA 1 1 0
HIRAGANA 0 1 2
KATAKANA 1 1 0
KANJINUMERIC 1 1 0
GREEK 1 1 0
CYRILLIC 1 1 0
# SPACE
0x0020 SPACE # DO NOT REMOVE THIS LINE, 0x0020 is reserved for SPACE
0x00D0 SPACE
0x0009 SPACE
0x000B SPACE
0x000A SPACE
# ASCII
0x0021..0x002F SYMBOL
0x0030..0x0039 NUMERIC
...
# KATAKANA
0x30A1..0x30FF KATAKANA
0x31F0..0x31FF KATAKANA # Small KU .. Small RO
0x30FC KATAKANA HIRAGANA # ー
</pre>
<h3>unk.def</h3>
<p>
未知語用の辞書です. </p>
<pre>
DEFAULT,0,0,0,記号,一般,*,*,*,*,*
SPACE,0,0,0,記号,空白,*,*,*,*,*
KANJI,0,0,0,名詞,一般,*,*,*,*,*
KANJI,0,0,0,名詞,サ変接続,*,*,*,*,*
HIRAGANA,0,0,名詞,一般,*,*,*,*,*
HIRAGANA,0,0,0,名詞,サ変接続,*,*,*,*,*
HIRAGANA,0,0,0,名詞,固有名詞,地域,一般,*,*,*
...
</pre>
<p>
表層の部分を char.def で定義したカテゴリ名とした辞書ファイルです.
各カテゴリに対してどのような素生列を付与するかを定義します.
1つのカテゴリに複数の素性を定義してもかまいません. 学習後, 適切なコスト値が
自動的に与えられます.
</p>
<h3>rewrite.def</h3>
<p>
素性列から内部状態素生列に変換するマッピングを定義します.
</p>
<p>
<a href="http://www.cis.upenn.edu/~pereira/papers/crf.pdf">CRF</a>は, unigram, 左文脈 bigram, 右文脈 bigram の3情報を使って統計情報を計
算します. 例えば以下の「美しい川」という以下の例では, 辞書に定義されている素性から unigram素性,
左文脈素性(その形態素を左側から見た時の素性),
右文脈素性(その形態素を左側から見た時の素性)の3つが使われます.
rewrite.def は, 辞書の素性からそれぞれの内部素性へのマッピングを定義します.
<img src="feature.png">
</p>
<p>具体的に以下のようなことがマッピング関数を適切に定義することで実現できます. </p>
<ul>
<li>「来る」「くる」という二つの表記を「来る」にまとめて統計値を計算する.
<li>連接コストの計算の際, 品詞のみを使う/語彙化する.... 等々素性のどの部
分を使うかを細かく定義する.
</ul>
</p>
<p>
rewrite.def には 3 つのセクションがあります.
<ul>
<li>[unigram rewrite]: Unigram 内部状態へのマッピング
<li>[left rewrite]: 左文脈 bigram へのマッピング
<li>[right rewrite]: 右文脈 bigram へのマッピング
</ul>
<p>
それぞれのセクションの後に, 1行に1つのマッピングルールが続きます.
マッピングルールは
<pre>
マッチパターン 変換先
</pre>
という形式で記述します. マッピングルールは先頭から順に走査されて最初に
マッチしたものが使われます.
<p>
マッチパターンでは簡単な正規表現がを使うことができます.
<ul>
<li>*: すべての文字列にマッチ
<li>(AB|CD|EF): AB もしくは CD もしくは EF にマッチ
<li>AB: 文字列 AB のみに完全マッチ
</ul>
</p>
<p>
変換先は $1 $2, $3.. というマクロを使い 素性の各要素 (CSVで記された要素)
の内容を参照することができます.
</p>
<p>
例
<pre>
[unigram rewrite]
# 読み,発音をとりのぞいて, 品詞1,2,3,4,活用形,活用型,原形,よみ を使う
*,*,*,*,*,*,*,* $1,$2,$3,$4,$5,$6,$7,$8
# 読みがない場合は無視
*,*,*,*,*,*,* $1,$2,$3,$4,$5,$6,$7,*
[left rewrite]
(助詞|助動詞),*,*,*,*,*,(ない|無い) $1,$2,$3,$4,$5,$6,無い
(助詞|助動詞),終助詞,*,*,*,*,(よ|ヨ) $1,$2,$3,$4,$5,$6,よ
...
[right rewrite]
(助詞|助動詞),*,*,*,*,*,(ない|無い) $1,$2,$3,$4,$5,$6,無い
(助詞|助動詞),終助詞,*,*,*,*,(よ|ヨ) $1,$2,$3,$4,$5,$6,よ
..
</pre>
</p>
<h3>feature.def</h3>
<p>
内部状態の素生列から <a href="http://www.cis.upenn.edu/~pereira/papers/crf.pdf">CRF</a>の素生列を抽出するためのテンプレートを定義したファイルです
</p>
<p>各行が一テンプレートに対応します. UNIGRAM ではじまるものは UNIGRAM 用
のテンプレート, BIGRAM ではじまるものは連接用のテンプレートです. </p>
<p>
各テンプレートでは, 以下のマクロを使うことができます
<ul>
<li>%F[n]: ユニグラムの n番目の素性に展開されます.
<li>%F?[n] :ユニグラムの n番目の素性に展開されます. ただし, 未定義の場合そのテンプレー
トそのものは使われません.
<li>%t: 文字種情報に展開されます. 文字種は char.def で定義された
ものが使われます. (%t は ユニグラム素性の時のみ有効です)
<li>%L[n]: 左文脈の n番目の素性に展開されます.
<li>%L?[n]: 左文脈の n番目の素性に展開されます. ただし, 未定義の場合そのテンプレー
トそのものは使われません.
<li>%R[n]: 右文脈の n番目の素性に展開されます.
<li>%R?[n]: 左文脈の n番目の素性に展開されます. ただし, 未定義の場合そのテンプレー
トそのものは使われません.
</ul>
</p>
<p>
例
<pre>
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]
...
</pre>
<h2><a name="corpus">学習用コーパスの準備</a></h2>
<p>学習データは, MeCab のデフォルト出力と同一フォーマットで記述します.
</p>
<pre>
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は 助詞,係助詞,*,*,*,*,は,ハ,ワ
花子 名詞,固有名詞,人名,名,*,*,花子,ハナコ,ハナコ
が 助詞,格助詞,一般,*,*,*, が,ガ,ガ
好き 名詞,形容動詞語幹,*,*,*,*, 好き,スキ,スキ
だ 助動詞,*,*,*, 特殊・ダ,基本形,だ,ダ,ダ
. 記号,句点,*,*,*,*, . , . , .
EOS
焼酎 名詞,一般,*,*,*,*,焼酎,ショウチュウ,ショーチュー
好き 名詞,形容動詞語幹,*,*,*,*,好き,スキ,スキ
の 助詞,連体化,*,*,*,*, の,ノ,ノ
親父 名詞,一般,*,*,*,*,親父,オヤジ,オヤジ
. 記号,句点,*,*,*,*, . , . , .
EOS
...
</pre>
<p>
タブで区切られた最初の部分が表層文字です. 次に素性配列を CSVで表現した文
字列が続きます. 文の区切りには EOS のみの行を置きます.</p>
<h2><a name="binary">学習用バイナリ辞書の作成</a></h2>
<p>現在の作業ディレクトリを WORK とします. WORK 以下に seed と final と
いう二つのディレクトリを作ってください. </p>
<pre>
cd $WORK
mkdir seed final
</pre>
<p>seed ディレクトリにさきほど説明した以下のファイルをコピーします.
<ul>
<li>seed 辞書 (CSV のファイル集合)
<li>全設定ファイル (char.def, unk.def, rewrite.def, feature.def)
<li>学習用データ (ファイル名: corpus)
</ul>
<p>
例
<pre>
% cd $WORK/seed
% ls
Adj.csv Interjection.csv Noun.name.csv Noun.verbal.csv Symbol.csv rewrite.def
Adnominal.csv Noun.adjv.csv Noun.number.csv Others.csv Verb.csv unk.def
Adverb.csv Noun.adverbal.csv Noun.org.csv Postp-col.csv char.def
Auxil.csv Noun.csv Noun.others.csv Postp.csv corpus
Conjunction.csv Noun.demonst.csv Noun.place.csv Prefix.csv dicrc
Filler.csv Noun.nai.csv Noun.proper.csv Suffix.csv feature.def
</pre>
</p>
<p>以下のコマンドを実行して, 学習用バイナリ辞書を作成します.
<pre>
% cd $WORK/seed
% /usr/local/libexec/mecab/mecab-dict-index
以下のように -d, -o を使うこともできます.
% /usr/local/libexec/mecab/mecab-dict-index -d $WORK/seed -o $WORK/seed
</pre>
<ul>
<li>-d: seed 辞書, 設定ファイルがあるディレクトリ (デフォルトはカレント)
<li>-o: 学習用バイナリ辞書が出力されるディレクトリ (デフォルトはカレント)
</ul>
</p>
<h2><a name="crf"><a href="http://www.cis.upenn.edu/~pereira/papers/crf.pdf">CRF</a> パラメータの学習</a></h2>
<p>
<pre>
% cd $WORK/seed
% /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
</pre>
</p>
<ul>
<li>-d: 学習用バイナリ辞書があるディレクトリ (デフォルトはカレント)
<li>-c: <a href="http://www.cis.upenn.edu/~pereira/papers/crf.pdf">CRF</a>のハイパーパラメータ
<li>-f: 素性頻度の閾値
<li>-p NUM: NUM 並列で学習を実行 (デフォルトは1)
<li>corpus: 学習データのファイル名
<li>model: 出力される<a href="http://www.cis.upenn.edu/~pereira/papers/crf.pdf">CRF</a>パラメータのファイル名
</ul>
<p>
ハイパーパラメータCは, 学習の「強さ」を決めます.
C を大きくすると, 学習データにできるだけフィットしようとしますが,
過学習する可能性があります. 小さくすると, 過学習を避けようとしますが, 十分な学習ができない可能性があります.
適切な C は, 交差検定等のモデル選択手法で発見的に見つけるしかありません.
デフォルトの値は 1. 0 となっています. </p>
<p>
-f オプションによって素性頻度の閾値を指定することができます. 例えば, -f
3 とすると, 学習データ中に3回以上出現した素性のみを使います. 適切な
素性閾値は, 交差検定等のモデル選択手法で発見的に見つけるしかありません.
</p>
<p>
学習中, 以下のような情報が出力されます.
<pre>
reading corpus ... adding virtual node: 名詞,固有名詞,地域,一般,*,*,東日,トウニチ,トウニチ
adding virtual node: 副詞,助詞類接続,*,*,*,*,かなり,カナリ,カナリ
Number of sentences: 32
Number of features: 47547
eta: 0.00010
freq: 1
C(sigma^2): 1.00000
iter=0 err=1.00000 F=0.41186 target=1691.68869 diff=1.00000
iter=1 err=1.00000 F=0.68727 target=1077.14848 diff=0.36327
iter=2 err=0.87500 F=0.81904 target=621.20311 diff=0.42329
iter=3 err=0.81250 F=0.86354 target=384.72432 diff=0.38068
iter=4 err=0.68750 F=0.93685 target=233.72722 diff=0.39248
..
</pre>
<ul>
<li>adding virtual node: 未知語処理を行なっても処理できなかった
形態素で, 学習の際便宜的に追加される形態素です.
<li>iter: 学習回数
<li>err: 文レベルのエラー率
<li>F: F値(精度と再現率の調和平均)
<li>target: 目的関数の値. この値が収束すると学習が終了します.
<li>diff: 目的関数の相対的な差分. この値が 0. 0001 になると学習が終了しま
す.
</ul>
</p>
<p>
<h2><a name="dist">配布用辞書の作成</a></h2>
<pre>
% cd $WORK/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
</pre>
<ul>
<li>-d: seed 辞書があるディレクトリ (デフォルトはカレント)
<li>-o: 配布用辞書の出力先ディレクトリ
<li>-m: <a href="http://www.cis.upenn.edu/~pereira/papers/crf.pdf">CRF</a> のパラメータファイル
</ul>
<p>配布用辞書は, seed 辞書と別のディレクトリに出力しなければなりません.
通常, 配布辞書ディレクトリ final をアーカイブしてユーザに配布します. </p>
<h2><a name="test">解析用バイナリ辞書の作成</a></h2>
<pre>
% cd $WORK/final
% /usr/local/libexec/mecab/mecab-dict-index
以下のように -d, -o を使うこともできます.
% /usr/local/libexec/mecab/mecab-dict-index -d $WORK/final -o $WORK/final
</pre>
<p>
<ul>
<li>-d: seed 辞書, 設定ファイルがあるディレクトリ (デフォルトはカレント)
<li>-o: 学習用バイナリ辞書が出力されるディレクトリ (デフォルトはカレント)
</ul>
<p>今作った辞書を使って実際に解析してみます. </p>
<pre>
% mecab -d $WORK/final
焼酎好きの親父.
焼酎 名詞,一般,*,*,*,*,焼酎,ショウチュウ,ショーチュー
好き 名詞,形容動詞語幹,*,*,*,*,好き, スキ, スキ
の 助詞,連体化,*,*,*,*,の,ノ,ノ
親父 名詞,一般,*,*,*,*,親父, オヤジ, オヤジ
. 記号,句点,*,*,*,*,.,.,.
EOS
</pre>
</p>
<h2><a name="eval">評価</a></h2>
<p>
テストデータを用意します. テストデータは MeCab の
デフォルト出力と同一フォーマットで記述します.
</p>
<p>
まず, mecab-test-gen を使ってテストコーパス(test)から, 文のみ(test.sen)を抽出します.
<pre>
% /usr/local/libexec/mecab/mecab-test-gen < test > test.sen
</pre>
</p>
<p>test.sen をさきほど作った辞書で解析します. </p>
<pre>
% mecab -d $WORK/final test.sen > test.result
</pre>
</p>
<p>
評価スクリプト mecab-system-eval を実行します.
第一引数がシステムの結果, 第二引数が正解のファイルです.
<pre>
% /usr/local/libexec/mecab/mecab-system-eval test.result test
precision recall F
LEVEL 0: 98.6887(647112/655710) 98.9793(647112/653785) 98.8338
LEVEL 1: 98.2163(644014/655710) 98.5055(644014/653785) 98.3607
LEVEL 2: 97.2230(637501/655710) 97.5093(637501/653785) 97.3659
LEVEL 4: 96.8367(634968/655710) 97.1218(634968/653785) 96.9791
</pre>
</p>
<p>-l オプションによって, どの素性のレベルを使って評価するか指定できます.
<ul>
<li>-l 0: 0 番目の素性のみを使って評価します.
<li>-l 4: 0〜4 番目の素性を使って評価します
<li>-l -1: 全レベルの素性を使って評価します
<li>-l "0 1 2" 0番目, 0〜1番目, 0〜4番目の3つの評価を表示します.
<li>-l "0 1 -1" 0番目, 0〜1番目, 全レベルの3つの評価を表示します.
</ul>
<h2><a name="retrain">再学習</a></h2>
<p>
再学習とは, 現在の学習済みモデルと少量の追加学習データからモデルを再構築する仕組みです.
<b>元の学習データは必要ありません.</b> mecab-ipadic についてはモデルファイルを配布する予定です.
同モデルファイルと, お手元の少量の学習データや追加辞書を用いることで, 簡単なドメイン適応が可能となります.
</p>
<p>
再学習は, 以下のように -M オプションを用いて以前のモデルファイルを指定します.
初期学習時に用いた seed 辞書に新規語彙を追加しても構いません. corpus は再学習用の新規コーパスです.
</p>
<pre>
% cd $WORK/seed
% /usr/local/libexec/mecab/mecab-cost-train -c 1.0 -M old_model corpus model
以下のように -d を使って辞書を指定することもできます<
% /usr/local/libexec/mecab/mecab-cost-train -M old_model -d $WORK/seed -c 1.0 $WORK/seed/corpus $WORK/seed/model
</pre>
<p>
再学習は, 現在のパラメータをできるだけ変更せずに新しい学習データにできるだけ適応するような学習が行われます.
適応先のコーパスの性質が元のコーパスのそれと大きく変わる場合は、元の学習データに対する精度が低下する恐れがあります.
ご了承下さい
</p>
</p>
</body>
</html>