mecab-NEologdを使うと語彙はどのくらい増えるのか
mecab-ipadic-neologdを使って形態素解析すると語彙が増えすぎてしまうんじゃないかという心配があったので調べてみた。
(追記訂正:最初のデータは間違っていました。ごっそり消してwikipediaの詳細データだけ掲載します。すみません。)
コーパスのテキスト量と増加率の関係を見たかったのでwikipediaの日本語版を項目数(記事数)で483分割して処理。コーパスNo.がおおよそのコーパステキスト量に該当します。コーパスNo.10はNo.1のおおよそ10倍のテキスト量。ただあくまで「項目数」での分割なので正確なデータでは無いです。
コーパスNo | デフォルト | NEolodg | 増加率(%) | |
---|---|---|---|---|
1 | 46258 | 58556 | 26.6 | |
2 | 68258 | 88678 | 29.9 | |
3 | 84709 | 111791 | 32.0 | |
4 | 99337 | 132455 | 33.3 | |
5 | 113074 | 152992 | 35.3 | |
6 | 122964 | 168559 | 37.1 | |
7 | 132508 | 182266 | 37.6 | |
8 | 144769 | 199847 | 38.0 | |
9 | 158041 | 218060 | 38.0 | |
10 | 168850 | 233722 | 38.4 | |
11 | 179991 | 249132 | 38.4 | |
12 | 189231 | 263175 | 39.1 | |
13 | 199275 | 277872 | 39.4 | |
14 | 208830 | 291307 | 39.5 | |
15 | 216722 | 303374 | 40.0 | |
16 | 223735 | 314840 | 40.7 | |
17 | 231265 | 325952 | 40.9 | |
18 | 239104 | 337614 | 41.2 | |
19 | 246950 | 349032 | 41.3 | |
20 | 254110 | 359583 | 41.5 | |
21 | 261795 | 370543 | 41.5 | |
22 | 269645 | 381550 | 41.5 | |
23 | 277826 | 392692 | 41.3 | この辺から増加率は減少 |
24 | 286525 | 404269 | 41.1 | コーパスの5% |
25 | 293764 | 414527 | 41.1 | |
26 | 300150 | 423689 | 41.2 | |
27 | 308806 | 435006 | 40.9 | |
28 | 317068 | 445591 | 40.5 | |
29 | 323247 | 454250 | 40.5 | |
30 | 328518 | 461914 | 40.6 | |
31 | 334377 | 470542 | 40.7 | |
32 | 339846 | 478158 | 40.7 | |
33 | 344783 | 485576 | 40.8 | |
34 | 350621 | 493363 | 40.7 | |
35 | 356892 | 501996 | 40.7 | |
36 | 363141 | 510389 | 40.5 | |
37 | 368756 | 517924 | 40.5 | |
38 | 375833 | 527029 | 40.2 | |
39 | 381728 | 534884 | 40.1 | |
40 | 388231 | 543156 | 39.9 | |
41 | 394783 | 551588 | 39.7 | |
42 | 400534 | 559312 | 39.6 | |
43 | 405993 | 566811 | 39.6 | |
44 | 411687 | 574370 | 39.5 | |
45 | 417879 | 582061 | 39.3 | |
46 | 422953 | 589005 | 39.3 | |
47 | 427705 | 595386 | 39.2 |
諸事情によりここでストップ。
増えすぎるのが嫌だったわけ
Chainerで言語モデルを作るときに使うEmbedIDが語彙の数だけ線形でメモリ消費量が増えるので貧弱GPUだと辛い。
まあこのくらいの増加率だとよほど大規模コーパスじゃ無い限りは~100MB程度の増加で済みそうなので一安心。もっといいGPU欲しいなあ。すみませんプログラムミスでいい加減なデータでした。このデータも正しいのか不安です。
実際はかなり差がありますね。このくらい差があるとかなりメモリ確保量に差が出てしまいます。
自分の環境だと語彙30万/512次元でEmbedID作った直後で1200MBのGPUメモリを確保していました。
NEolodgの方が1.4倍ほど語彙が多いのでメモリ確保量もそれだけ増えることになります。
2GBクラスはもちろんのこと4GBクラスでも心もとないですね。
もう一つの懸念
例えば校名が変わった大学があるとする。
旧)はてな大学 → 新)びっくり大学
デフォルト辞書だと「びっくり+大学」になるはずがNEologdは「びっくり大学」とやってくれるはず。
ところがこれは良い面ばかりでもなさそうで、校名が変わった直後はまだコーパスにそれがあまり出てこないので、RNN等で言語モデルを作った時に「びっくり大学」の意味を判断できない可能性が高そう。もし「びっくり+大学」と分けた場合なら「大学」が入っているので学校関係という情報が入ってくれるはず。
あるいは新興企業の「はてな不動産」という会社があった場合に「はてな+不動産」で区切ってくれると不動産屋という情報が入ってくれそう。この辺は善し悪しだなと。
コーパスにあまり出てこない新単語の場合はデフォルト辞書の形態素区切りでの情報も使ってみるといいのかな。
http://www.hshindo.com/data/shindo-NL150927-talk.pdfのように単語区切りだけの情報を使うのではなくて文字をCNNでまとめた情報も使うとか。全ての単語もやっちゃうと弊害が大きそうなのでコーパスにあまり出てこない単語だけやるようにすればいいいのだろうか。