-
Notifications
You must be signed in to change notification settings - Fork 218
/
dic-detail.html
329 lines (292 loc) · 7.99 KB
/
dic-detail.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
<!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>MeCab の辞書構造と汎用テキスト変換ツールとしての利用</h1>
<h2>概要</h2>
<p>単語辞書の構造を理解することで, MeCab を汎用的なテキスト変換ツールとして利用することができます. 例えば,
ひらがな to カタカナ変換, ローマ字 to ひらがな変換, Auto Link等を MeCab だけで実行できます
</p>
<h2>ファイル</h2>
<p>
単語辞書を構築するには, 最低以下のファイルを作成する必要があります.
</p>
<ul>
<li>*.csv ファイル (単語辞書)
<li>matrix.def (連接表)
<li>unk.def (未知語用品詞定義)
<li>char.def (未知語の文字定義)
<li>dicrc (設定ファイル)
</ul>
<h3>*.csv ファイル</h3>
<p>単語辞書です</p>
<p>エントリは, 以下のような CSV で追加します.</p>
<pre>
test,1223,1223,6058,foo,bar,baz
</pre>
<p>最初の4つは必須エントリで, それぞれ</p>
<ul>
<li>表層形
<li>左文脈ID (単語を左から見たときの文脈 ID)
<li>右文脈ID (単語を右から見たときの文脈 ID)
<li>単語コスト (小さいほど出現しやすい)
</ul>
<p>となっています. コスト値は short int (16bit 整数)
の範囲におさめる必要があります. </p>
<p>
5カラム目以降は, ユーザ定義の CSV フィールドです. 基本的に
どんな内容でも CSV の許す限り追加することができます.
</p>
<h3>matrix.def</h3>
<p>最初の行に連接表のサイズ(前件サイズ, 後件サイズ)を書きます. その後は,
連接表の前件の文脈 ID, 後件の文脈IDと, それに対応するコストを書きます.
</p>
<p>ある単語 A, B が連接をなすとき, </p>
<ul>
<li>前件文脈ID = 単語Aの右文脈ID
<li>後件文脈ID = 単語Bの左文脈ID
</ul>
<p>となります. つまり, 単語辞書に登録した ID が連接表を参照する際の
キーとなります. コスト値は short int (16bit 整数)
の範囲におさめる必要があります. </p>
<pre>
100 120
0 0 1
0 1 10
0 2 5
</pre>
<p>上記の例では, 前件の文脈のサイズが100, 後件の文脈のサイズが 120 となって
います. また, 前件文脈 0 から 後件文脈 1 への遷移コストが 10 となっています.
</p>
<h3>char.def</h3>
<p>未知語処理のルールです. <a href="learn.html">こちら</a>を御覧ください.
</p>
<p>以下が最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT 1 0 0
SPACE 0 1 0
0x0020 SPACE
</pre>
<h3>unk.def</h3>
<p>未知語に対する品詞列のテーブルです. <a href="learn.html">こちら</a>を
御覧ください. </p>
<p>以下が最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT,0,0,0,*
SPACE,0,0,0,*
</pre>
<h2>辞書のコンパイル</h2>
<p>次のコマンドを実行することで, 解析用のバイナリ辞書を作成します. </p>
<pre>
% /usr/local/libexec/mecab/mecab-dict-index
</pre>
</p>
<h2>ケーススタディ</h2>
<p>example ディレクトリにいくつかの応用例があります.</p>
<h3>Auto Link</h3>
<p>Hatena Keyword のような Auto Link を実装してみます</p>
<ul>
<li>url.csv
<p>単語としてキーワード, 品詞としてキーワードに対応する URL を書きます.
連接の状態は1状態で十分なので, 左文脈/右文脈IDともに 0 とします.
コスト値は長いキーワードが優先されるよう設定します. 例えば以下のような関数を使うとよいでしょう.</p>
<pre>cost = (int)max(-36000, -400 * (length^1.5)) </pre>
url.csv
<pre>
Google,0,0,-5878,http://www.google.com/
Yahoo,0,0,-4472,http://www.yahoo.com/
ChaSen,0,0,-5878,http://chasen.org/
京都,0,0,-3200,http://www.city.kyoto.jp/
...
</pre>
<li>matrix.def
<p>1 状態なので, 連接表のサイズは 1 x 1 となります.
後件 0 から前件 0 の連接コストは 0 とします.</p>
<pre>
1 1
0 0 0
</pre>
<li>char.def
<p>最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT 1 0 0
SPACE 0 1 0
0x0020 SPACE
</pre>
<li>unk.def
<p>最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT,0,0,0,*
SPACE,0,0,0,*
</pre>
<li>dicrc
<p>autolink というフォーマットを作成し, それがデフォルトの出力になるようにします</p>
<pre>
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=autolink
node-format-autolink = <a href="%H">%M</a>
unk-format-autolink = %M
eos-format-autolink = \n
</pre>
<li>コンパイル + テスト
<pre>
% /usr/local/libexec/mecab/mecab-dict-index -f euc-jp -c euc-jp
reading ./unk.def .. 2
emitting double-array: 100% |###########################################|
reading ./dic.csv .. 4
emitting double-array: 100% |###########################################|
emitting matrix : 100% |###########################################
done!
% mecab -d .
京都に行った.
<a href="http://www.city.kyoto.jp/">京都</a>に行った。
YahooとGoogle
<a href="http://www.yahoo.com/">Yahoo</a>と<a href="http://www.google.com/">Google</a>
</pre>
</ul>
<h3>ひらがな to カタカナ変換ツール</h3>
<ul>
<li>dic.csv
<p>単語としてひらがな1文字, 品詞として各ひらがな対応するカタカナ1文字を書きます.
連接の状態は1状態で十分なので, 左文脈/右文脈IDともに 0 とします.
曖昧性がないため コスト値は 0 とします</p>
<pre>
う゛,0,0,0,ヴ
あ,0,0,0,ア
い,0,0,0,イ
う,0,0,0,ウ
え,0,0,0,エ
お,0,0,0,オ
ぁ,0,0,0,ァ
ぃ,0,0,0,ィ
ぅ,0,0,0,ゥ
ぇ,0,0,0,ェ
ぉ,0,0,0,ォ
か,0,0,0,カ
き,0,0,0,キ
く,0,0,0,ク
け,0,0,0,ケ
こ,0,0,0,コ
が,0,0,0,ガ
ぎ,0,0,0,ギ
ぐ,0,0,0,グ
げ,0,0,0,ゲ
ご,0,0,0,ゴ
さ,0,0,0,サ
し,0,0,0,シ
す,0,0,0,ス
せ,0,0,0,セ
そ,0,0,0,ソ
ざ,0,0,0,ザ
じ,0,0,0,ジ
ず,0,0,0,ズ
ぜ,0,0,0,ゼ
ぞ,0,0,0,ゾ
た,0,0,0,タ
ち,0,0,0,チ
つ,0,0,0,ツ
て,0,0,0,テ
と,0,0,0,ト
だ,0,0,0,ダ
ぢ,0,0,0,ヂ
づ,0,0,0,ヅ
で,0,0,0,デ
ど,0,0,0,ド
っ,0,0,0,ッ
な,0,0,0,ナ
に,0,0,0,ニ
ぬ,0,0,0,ヌ
ね,0,0,0,ネ
の,0,0,0,ノ
は,0,0,0,ハ
ひ,0,0,0,ヒ
ふ,0,0,0,フ
へ,0,0,0,ヘ
ほ,0,0,0,ホ
ば,0,0,0,バ
び,0,0,0,ビ
ぶ,0,0,0,ブ
べ,0,0,0,ベ
ぼ,0,0,0,ボ
ぱ,0,0,0,パ
ぴ,0,0,0,ピ
ぷ,0,0,0,プ
ぺ,0,0,0,ペ
ぽ,0,0,0,ポ
ま,0,0,0,マ
み,0,0,0,ミ
む,0,0,0,ム
め,0,0,0,メ
も,0,0,0,モ
ゃ,0,0,0,ャ
や,0,0,0,ヤ
ゅ,0,0,0,ュ
ゆ,0,0,0,ユ
ょ,0,0,0,ョ
よ,0,0,0,ヨ
ら,0,0,0,ラ
り,0,0,0,リ
る,0,0,0,ル
れ,0,0,0,レ
ろ,0,0,0,ロ
ゎ,0,0,0,ヮ
わ,0,0,0,ワ
ゐ,0,0,0,ヰ
ゑ,0,0,0,ヱ
を,0,0,0,ヲ
ん,0,0,0,ン
</pre>
<li>matrix.def
<p>1 状態なので, 連接表のサイズは 1 x 1 となります.
後件 0 から前件 0 の連接コストは 0 とします.</p>
<pre>
1 1
0 0 0
</pre>
<li>char.def
<p>最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT 1 0 0
SPACE 0 1 0
0x0020 SPACE
</pre>
<li>unk.def
<p>最低限の設定 (DEFAULT と SPACE) です</p>
<pre>
DEFAULT,0,0,0,*
SPACE,0,0,0,*
</pre>
<li>dicrc
<p>katakana というフォーマットを作成し, それがデフォルトの出力になるよう
にします</p>
<pre>
dictionary-charset = euc-jp
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=katakana
node-format-katakana = %H
unk-format-katakana = %M
eos-format-katakana = \n
</pre>
<li>コンパイル + テスト
<pre>
% /usr/local/libexec/mecab/mecab-dict-index -f euc-jp -c euc-jp
reading ./unk.def .. 2
emitting double-array: 100% |###########################################|
reading ./dic.csv .. 4
emitting double-array: 100% |###########################################|
emitting matrix : 100% |###########################################
done!
% mecab -d .
これはてすとです
コレハテストデス
</pre>
</ul>
</body>
</html>