"BOKU"のITな日常

還暦越えの文系システムエンジニアの”BOKU”は新しいことが大好きです。

テキストを「'00'から'FF'の出現頻度で符号化」する自然言語前処理のクラス化:/Neural Network Console応用編

今回は自然言語の文章を、Neural Network Consoleで扱えるように「'00'から'FF'の出現頻度で符号化」する処理を汎用的に使いやすくするためにクラス化します。

f:id:arakan_no_boku:20190326212937j:plain

 

今回のテーマの前提

 

何度か、自然言語の文章を、Neural Network Console(ニューラルネットワークコンソール。以後、NNCと書きます)での分類問題に使えるデータに変換するテーマで、試行錯誤をやって、それを記事にしてます。

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にあげました

 

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

github.com

make_nnc_data.pyの方です。

 

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

 

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

f:id:arakan_no_boku:20180215193802j:plain

 

livedoorニュースコーパス

 

記事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あたりから横ばいで下がらなくなります。 

まあ。

文章の前後のつながりとか全然みてませんからね。

でも、手軽さ・わかりやすさとかを含めてトータル的に考えれば、このやり方も・・十分・・アプローチとしてはアリじゃないかなと・・いうことでまとめときます。

 

追加(この記事の改良・派生版です)

このクラスを使って、EXCELで入力した記事を「女性向け」かどうか判定する「AI編集長」のデモを作ってDelta#3で発表してます。

arakan-pgm-ai.hatenablog.com

 

このクラスを拡張して2バイトコードでの出現頻度を数えるようにした改良版です。

arakan-pgm-ai.hatenablog.com

 

f:id:arakan_no_boku:20171115215731j:plain