"BOKU"のITな日常

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

ニュース記事を学習させて記事の内容による分類に挑戦してみる/Neural Network Console応用編

自然言語処理とは、言葉や文章を機械学習のデータとして扱う方法のことです。

Neural Network Console(ニューラルネットワークコンソール 以後NNCと書きます)で自然言語処理をやってみる試みとして、ジャンルの異なるニュース記事を学習させて、分類できるかがテーマです。

f:id:arakan_no_boku:20190326212937j:plain

 

前回のおさらい

 

前回、自然言語の文章を、Neural Network Console(ニューラルネットワークコンソール。以後、NNCと書きます)で学習可能なデータに変換する汎用的な方法として、文字コードに着目して出現頻度で数値データ化する方法をためしました。 

元ネタとして、livedoorニュースコーパスのテキストを使わせていただき、とりあえず、2ジャンルを変換してみました。

arakan-pgm-ai.hatenablog.com

 

元にしたテキストはニュースコーパス 

 

どのようなデータを生成したのかを、おさらいしときます。 

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

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株式会社様に感謝です。 

このうちの、「sports Watch」と「Peachy」を使いました。 

 

1バイトコードで256列の数値データに変換

 

こんな文章のままでは、NNCで使えないので、文章をUTF-8文字コードを構成する'00'~'FF'の集合と捉えて、出現頻度をもとに数値化して、256列(次元)のこんなデータにしました。(途中は省略してます)

0.005860805860805861,0.002197802197802198,

0.0014652014652014652,0.0014652014652014652,

0.0007326007326007326,0.0014652014652014652,

0.0029304029304029304,0.0014652014652014652,

0.007326007326007326,・・・・,

0.0007326007326007326,0.0007326007326007326,

0.005128205128205128,0.0029304029304029304,

0.005860805860805861,0.0007326007326007326

 

ここまでが前回の話です。 

 

データセットCSVをトレーニング用と評価用にわける

 

出来上がったデータ・セットCSVは、トレーニング用と評価用にわけておきます。 

f:id:arakan_no_boku:20180215200408j:plain

 

0フォルダの下にはこんな感じで1行ずつのCSVファイルがあります。

f:id:arakan_no_boku:20180120212945j:plain

 

これらを適当なフォルダにコピーして、データの準備は完了です。

 

NNCで新規プロジェクト

 

NNCを立ち上げます。 

適当なプロジェクトを作って、Afineとsigmoidの組み合わせを4層ほどかさねて、最後は2値なので、BinaryCrossentropyにしておきます。

f:id:arakan_no_boku:20180120214041j:plain

 

お断りしておきますが、このネットワークはかなり適当です。 

あくまで、データ・セットの感触を確かめるために、「とりあえず組んでみました」的なものでしかない点、ご容赦くださいね。 

 

プロジェクトにデータ・セットを関連づけ

 

DATASETタブを選んで、trainingとvalidationのそれぞれに、下記の赤丸のボタンを押して、作成したデータ・セットCSVを関連づけます。

f:id:arakan_no_boku:20180215201854j:plain

 

上の赤丸ボタンを押すと、以下のような画面が開くので、ここで「OpenDataset」を使ってCSVフィルを指定します。

f:id:arakan_no_boku:20180215202237j:plain

 

各レイヤーの設定

 

上記のネットワークの各レイヤーを作成したデータセットにあわせていきます。

 

inputレイヤーの設定

 

これは作成したCSVデータのサイズにあわせます。 

用意したテキストデータによって、できるデータの列数が異なるので、必ずデータ・セットタブを見て判断します。(下の赤枠部分)

f:id:arakan_no_boku:20180215202635j:plain

 

それと同じ内容をinputタブに設定します。

f:id:arakan_no_boku:20180215202848j:plain

 

Affineレイヤーの設定

 

後、AffineのOutputは とりあえず、「1」でいいんじゃないですかね。

f:id:arakan_no_boku:20180215203033j:plain

 

DATASETタブの設定

 

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

ポイントは、「Image Normalization」のチェックをはずすことです。

f:id:arakan_no_boku:20180215203259j:plain

 

あと、評価用はShuffleもはずしといた方が良いですね。

f:id:arakan_no_boku:20180215203321j:plain

 

COFIGタブの設定

 

とにかく「Batch Size」と「Max Epoch」を増やしておきます。 

Max Epochは、1000位にした方がいいです。 

今回は、「Batch Size」=128、「Max Epoch」=1000 でやりました。

f:id:arakan_no_boku:20180215214458j:plain

 

さて、これで保存します。

 

学習の実行

 

学習した結果のグラフです。 

epoch数が200くらいまでは、横に伸びるばかりです。 

300に近づくあたり、急激に損失率が低くなってきてます。 

f:id:arakan_no_boku:20180215214839j:plain

 

評価の実行

 

それで評価です。 

f:id:arakan_no_boku:20180215215024j:plain

 

97.14%です。 

140個中、4つ間違えたというわけですね。 

 

まとめ

 

正直、予測よりも良い結果です。 

スポーツよりか、女性向けかのテーマは違えど、同じネタ元のニュースです。 

記事のテーマも毎回違いますしね。 

女性向きといっても、料理だったり、美容だったり・・とか、バラバラです。 

なにより、ネットワークも適当で、何のチューニングもしてませんし。 

だから、一発目で90%以上いくのは、相当難しいんじゃないかと思ってました。 

ところが、間違えたのは4つだけ。 

あらためて、すごいなと。 

しかも、間違えたのは例えばこんな内容のものです。

小島:どう考えたって、顔の出来不出来はどっかの時点で気がつきますよ。足が早ければリレーの選手になるだろうし、計算が得意だったら理系の仕事に就こうと思うのと同じように、顔が良ければこの顔を使って何か世の中を渡っていこうと思うのは当たり前じゃないですか。

犬山:足が早い人がオリンピックに出たらみんなで応援するくせに。

 

女性向きニュースのジャンルですけど、話題に「リレーの選手」とか「オリンピック」とかスポーツの話題がでてるわけです。 

Peachyのニュースだったから、スポーツが不正解になっているだけで、内容を事前にチェックしてたら、スポーツが正解でもおかしくないのです。 

うーーん。 

これはいいかもしれないです。 

 

追記(関連記事です)

この記事から派生して、いくつかの改良版・発展版があります。

 

テキストデータの符号化する処理をクラス化して使いやすくしてみたバージョン

arakan-pgm-ai.hatenablog.com

 

イベントで発表した資料

今回の内容を元に、記事をEXCELで入力したら、それが女性向けの記事として適切かどうかを判定する「AI編集長」のデモを作って、イベントで発表したバージョン

arakan-pgm-ai.hatenablog.com

 

文字コードを2バイトコードに拡張して、日本語の精度をあげられるかを試みた件

arakan-pgm-ai.hatenablog.com

 

 

f:id:arakan_no_boku:20171115215731j:plain