アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

その5(まとめ):自然言語文章をNeural Network Consoleで分類を行える様に符号化する/使い方30

使い方26から29まで、自然言語の文章を、Neural Network Console(ニューラルネットワークコンソール。以後、NNCと書きます)での分類問題に使えるデータに変換するテーマで、試行錯誤をやりました。

 

それで、前回・前々回でためした「'00'から'FF'の256列(次元)の出現頻度で符号化」する方法が結構いい感じだというのがわかりました。

arakan-pgm-ai.hatenablog.com

 

それをもう少し整備してみます。

 

今回することは以下の3つです。

 

さて、やってみます。

 

データ・セット変換プログラムをクラス化する

 

クラスの名前は、「MakeNnc」にします。

 

保存するpythonファイル名は「make_nnc_data.py」です。

 

使うときは、以下のようにします。

from make_nnc_data import MakeNnc         
            
m = MakeNnc()
m.make_data('01_all_text.csv','0_out')

 

引数の' 01_all_text.csv’は、変換対象のテキストファイルのパスと分類の正解ラベルを列記した以下のようなCSVファイルです。

C:\news\dokujo-tsushin\dokujo-tsushin-4778030.txt,0
C:\news\dokujo-tsushin\dokujo-tsushin-4778031.txt,0
C:\news\dokujo-tsushin\dokujo-tsushin-4782522.txt,0
C:\news\dokujo-tsushin\dokujo-tsushin-4788357.txt,0
C:\news\dokujo-tsushin\dokujo-tsushin-4788362.txt,0
C:\news\dokujo-tsushin\dokujo-tsushin-4788373.txt,0

 

正解ラベルは数字にします。

 

今回は基本、記事が分類されているフォルダ毎に0~9の数字にわけることになります。

 

数字ではなく、「dokujo-tsushin」のようなフォルダ名 にすればわかりやすいのですけど、NNCで使うには、数字が良いですから。

 

第二引数の「'0_out'」 はデータセットCSVのファイル名のもとになります。

 

データを8:2の割合で、学習データと推論データにわけます。

 

そのアウトプットファイルは、たとえば「0_out」と指定した時。

  • 0_out_train.csv
  • 0_out_valid.csv

の2ファイルを生成します。

 

ソースコードはこちらにあげてます。

 

github.com

 

make_nnc_data.pyの方です。

 

livedoorニュースコーパス全分類(9分類)の記事をデータセット化する。

 

元にしたニュースコーパスこちらから取得したものです。

f:id:arakan_no_boku:20180215193802j:plain

 

記事1本1ファイルになっています。

 

こんな内容。

http://news.livedoor.com/article/detail/4403717/
2009-10-19T19:10:00+0900
鉄道好きの女の子が旅行の時に聞きたい15曲って?
 旅や鉄道好きの女の子だけで結成された“鉄旅(てつたび)ガールズ”が、ゆったりとした電車の旅、どこか懐かしい旅気分を味わえる曲を選んだコンピレーションCD「tabiuta -旅へ 歌と-〜鉄旅ガールズrecomend〜」が10月21日に発売される。秋の旅行シーズンのお供に、楽しみたいちょっとセンチメンタルな選曲が魅力的。

 

サイズも1ファイル当たり数KB程度と、非常に使いやすいデータです。

 

NHN Japan株式会社様が、クリエイティブ・コモンズライセンスで公開いただいているものです。

 

クリエイティブ・コモンズライセンスは、https://creativecommons.org/licenses/by-nd/2.1/jp/を参照ください。

 

今回は、記事を数値化したりしてますが、記事の内容自体には一切手を加えてませんので、特に問題はないと解釈しています。

 

記事数が約7600くらいあって、変換にも、それなりに時間がかかります。

 

それで一応変換済のデータを、GitHubにあげてます。

github.com

 

GitHubに1フォルダ1000ファイルまでしかおけないので、フォルダ毎ZIPファイルにまとめたものをおいてます。

 

nnc_data0.zipです。

 

解凍すると、14000個以上のファイルがあって、かなりでかいです。 

 

なお、上記には、livedoorニュースコーパスの内容が含まれています。

 

一応、クリエイティブ・コモンズライセンスの内容を確認して、問題ないと思ってますが、もし、指摘等あればデータは消すかもしれません。

 

その時はご容赦ください。

 

9分類の文章データの分類をNNCで行う

 

NNCを立ち上げます。

 

プロジェクトを作ります。

 

今回は、全結合層(Affine)をベースにします。

 

データが1行256列で画像みたいに「形状」を意識する必要がないため、全結合のみで十分だと考えてます。

 

活性化関数は「sigmoid」です。

 

もとのデータが、0.0~1.0の間のデータ(出現頻度)なので、マイナスの範囲を意識するハイポリックタンジェントtanh)や、ReLu系の関数は不適切だと思うので。

 

あと、BatchNormarizationを使います。

 

BatchNormarizationは、入力値を平均が0で分散が1になるように正規化してくれるので、今回みたいな0.0~1.0の範囲の出現頻度みたいなデータに対して適用すると非常に相性がよいはずだからです。

 

とりあえず、こんな感じで組みました。

f:id:arakan_no_boku:20180217181332j:plain

 

AffineとSigmoidの間に、BatchNormaraizationを挟み込んだ感じです。

 

最後は、SoftmaxCrossEntropyです。

 

データ・セットの関連付けや各レイヤーの設定は割愛します。

 

前回までの記事とほぼおなじなので。

arakan-pgm-ai.hatenablog.com

 

COFIGタブの設定は変わります

 

プロジェクトのDATASETタブで、テキストデータから作成したデータ・セットCSVを学習用と評価用にそれぞれ登録する時のポイントも、前回までと同じです。

 

違うのは、COFIGタブ。

 

データ量が増えてるので、「Batch Size」と「Max Epoch」は普通に戻します。

 

Max Epochは、300位にしました。

 

何回か試した結果、「Batch Size」=100、「Max Epoch」=300 でやりました。

f:id:arakan_no_boku:20180217205504j:plain

 

学習・評価をやってみます

 

 

今回は先に評価の結果をのせます。

 

何回か、いろいろパラメータやネットワークモデルを触りながら、半日くらい繰り返したうちの一番良かったものです。

f:id:arakan_no_boku:20180217205855j:plain

 

84.23%です。

 

だいたい、20回くらいやりましたが、半分くらいは学習が収束しなくなって途中で止めて、最後までいけた10回くらいは、だいたい80%~84%でした。

 

色々、調べたのですが、やはり7600本もの記事があると、10行もないような短い記事もあり、かつ、別カテゴリの記事の中で例えばスポーツの話題とかが取り上げられていたりするので難しいです。

 

特徴的だったのが、学習曲線です。

f:id:arakan_no_boku:20180217210818j:plain

 

VALIDATION ERRORだけが、0.5あたりから横ばいで下がらなくなります。

 

学習データのラベルが不正確なのかな?

 

単に、ニュースのカテゴリでラベルをつけたので、内容的に同じような特徴をもったデータに違うラベルがついてしまっているとか・・。

 

そんなことを考えてます。

 

このへんは、じっくりテキストの内容とかを見ながら、継続して工夫していきます。

 

まあた、なんかわかれば、追記するか記事にします。

 

とりあえず、今回の試行錯誤の結論としては、このやり方は・・十分・・アプローチとしてはアリじゃないかなと・・いうことでまとめときます。

f:id:arakan_no_boku:20171115215731j:plain