PerlとMXNetで文章生成: 日本語の文字レベル学習と文章生成

[17/08/06 23:47 更新]

char_lstm_train.plchar_lstm_gen.plを、日本語に対応する。データとしては、私が独自に作った語録集から、私の言葉を抜き出したものを使う。(kgk_words.txt) jfortune形式で書いているが、文字コードはUTF8である。

学習と保存 (char_lstm_jp_train.pl)

char_lstm_train.plchar_lstm_jp_train.plにコピーしておく。GetOptionsの中のprefixのデフォルトを変更。


    'prefix=s'       => \(my $prefix  = 'lstm_jp' ),

後半のpackage main;が始まるまでは変更なし。日本語を扱うためにEncodeを読み込み、データファイル名を変更、utf8から読み込むモードでopen。


use Encode;

my $file = "data/kgk_words.txt";
open(F, "<:utf8", $file) or die "can't open $file: $!";

変更終了。

Epoch数25で実行してみると、こんな感じ。


Epoch[0] Train-Perplexity=47.340639
Epoch[0] Time cost=23.909
Epoch[1] Train-Perplexity=7.792494
Epoch[1] Time cost=22.940
Epoch[2] Train-Perplexity=2.793955
Epoch[2] Time cost=23.278
Epoch[3] Train-Perplexity=1.909530
Epoch[3] Time cost=24.496
Epoch[4] Train-Perplexity=1.517504
Epoch[4] Time cost=24.768
Epoch[5] Train-Perplexity=1.352104
Epoch[5] Time cost=24.688
Epoch[6] Train-Perplexity=1.298741
Epoch[6] Time cost=25.410
Epoch[7] Train-Perplexity=1.250809
Epoch[7] Time cost=25.430
Update[1002]: Changed learning rate to 9.90000e-04
Epoch[8] Train-Perplexity=1.220032
Epoch[8] Time cost=25.713
Epoch[9] Train-Perplexity=1.196657
Epoch[9] Time cost=25.320
Epoch[10] Train-Perplexity=1.177160
Epoch[10] Time cost=25.646
Epoch[11] Train-Perplexity=1.164436
Epoch[11] Time cost=25.471
Epoch[12] Train-Perplexity=1.155473
Epoch[12] Time cost=25.848
Epoch[13] Train-Perplexity=1.144101
Epoch[13] Time cost=25.378
Epoch[14] Train-Perplexity=1.138491
Epoch[14] Time cost=25.923
Epoch[15] Train-Perplexity=1.130483
Epoch[15] Time cost=25.770
Update[2002]: Changed learning rate to 9.80100e-04
Epoch[16] Train-Perplexity=1.127876
Epoch[16] Time cost=25.559
Epoch[17] Train-Perplexity=1.120702
Epoch[17] Time cost=25.630
Epoch[18] Train-Perplexity=1.116583
Epoch[18] Time cost=25.716
Epoch[19] Train-Perplexity=1.112624
Epoch[19] Time cost=25.740
Epoch[20] Train-Perplexity=1.110295
Epoch[20] Time cost=26.084
Epoch[21] Train-Perplexity=1.107469
Epoch[21] Time cost=26.497
Epoch[22] Train-Perplexity=1.104525
Epoch[22] Time cost=27.531
Epoch[23] Train-Perplexity=1.101416
Epoch[23] Time cost=25.648
Epoch[24] Train-Perplexity=1.100197
Epoch[24] Time cost=25.917
Saved checkpoint to "lstm_jp-0025.params"

呼出と文章生成 (char_lstm_jp_gen.pl)

char_lstm_gen.plを改造。

まず、GetOptionsの中で、prefixのデフォルトをchar_lstm_jp_train.plに合わせておく。


    'prefix=s'       => \(my $prefix  = 'lstm_jp' ),

最後のsub sampleの中の出力部分、


        print "$reverse_vocab{$next_char}";

を、日本語用に変更。


        print encode_utf8($reverse_vocab{$next_char});

以上。

実行結果はこんな感じ。


いかない。
 うまくいかない。
%%
人生にゴれでったるも%%
感出なりも的と見は、型を見て、走り出す。
%
明日はどっちだ?
明後日の方向だ!
%%
人は生まれて 人は育ち 人を愛して やがて死ぬ
いうなれば それだけのこと
%%
今日は昨日を後iって基しい情報としいいの判断はその恵め
%
ある研究者はそれを丸いと言い、別の研究者はそれを丸いと言い、別の研究者はそれを四角いと言う。
それが実

日本語的におかしい部分とコピペ的な部分が混在してる感じ。

[次の「日本語の単語レベル学習と文章生成」へ] [「英語の単語レベル学習と文章生成」に戻る] [「PerlとMXNetで文章生成」に戻る] [「あえてのPerl」に戻る]