studylog/北の雲

chainer/python/nlp

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でまとめた情報も使うとか。全ての単語もやっちゃうと弊害が大きそうなのでコーパスにあまり出てこない単語だけやるようにすればいいいのだろうか。