渋谷駅前で働くデータサイエンティストのブログ

元祖「六本木で働くデータサイエンティスト」です / 道玄坂→銀座→東京→六本木→渋谷駅前

AutoML Natural Languageで青空文庫に収録された作家8名の文章を分類してみる


先日の記事ではAutoML Tablesを試してみましたが、調子に乗ってこれまで触ってこなかったAutoML Natural Languageも試してみようと思ったのでした。


以前の記事にも書いたように、僕は元々自然言語処理が苦手でTensorFlow Hubのpre-trained modelによるfine-tuningが登場するまでは殆ど自分ではテキスト分析をやったことがなく、出来ればもっとずっと簡単にやれる方法はないのかなと思っていました。そういう意味ではTF-Hubは渡りに船だったんですが、何ならノンプログラミングでサクサク回せた方がずっと良いわけで、AutoML Natural Languageはまさに僕にとっては願ったり叶ったりのプロダクトです。ということで、実際に触ってみたのでそのレポートをつらつら書いてみようと思います。



ちなみに、実はこちらの記事が公開されると知らずに今回の記事を書いていたので、内容が似通っているのは完全に単なる偶然である旨予めお断りしておきます。またいつもながら生半可な知識で適当にやっているだけですので、おかしなところや正した方が良い点を見つけたらどしどしご指摘くださいm(_ _)m


データセット



この記事では僕のGitHubに上げてあるaozora_8writers_train.csvというファイルを使います。青空文庫から芥川龍之介谷崎潤一郎江戸川乱歩正岡子規二葉亭四迷夏目漱石小林多喜二島崎藤村の8名の作品を概ね1000行ずつ取ってきて、分かち書き処理を行った上でtrain / testでsplitしたものです。前処理として、擬音や間投詞が延々と続くような行は目視で削除し、さらに半角英字を削除したりしてあります*1


ちなみに僕の怠慢で、青空文庫XHTMLデータに入っているルビ(ふりがな)は全てそのままにしてあります。これが結構影響している気もするんですが、今回はごめんなさいということで。気になる方は皆さん自身で削除してください。。。


AutoML Natural Languageでモデルを学習させる


データをDLしてきたらAutoML Natural Languageに移りましょう。まず、画面左のツールバーのARTIFICIAL INTELLIGENCEのグループにあるNatural Languageを選択します。

f:id:TJO:20190530153405p:plain

するとこういう画面が出てくるので、AutoML Text ClassificationのLaunch appをクリックします。

f:id:TJO:20190530153822p:plain

NEW DATASETをクリックすると、データインポートの設定画面が出てきます。

f:id:TJO:20190530154028p:plain

Objectiveは分類ラベルの与え方ですが、特に何も理由がなければsingle-labelで大丈夫です。というかmulti-labelにしてもラベル自体が3つ以上あるとほぼ同じ結果が返ってくるので、差異が良く分からない感じです。

f:id:TJO:20190530154118p:plain

学習データは各ラベルごとに100行以上必要な点に注意。データのインポートはローカルのCSVファイルやTXT/ZIPファイル、Cloud Storage上のCSVファイルなどが選べます。ただしBQからテーブルを取ってくるというのはここでは使えません。またデータフォーマットとして、

  1. ヘッダ行は入れない
  2. 1列目にダブルクォーテーションで囲んでテキスト
  3. 2列目にダブルクォーテーションで囲んで半角英数字でラベル*2

と予め決められていて、これらを守らないとエラーを返してきます。これは現段階の仕様ゆえ仕方ないので、前処理で何とかしておきましょう。


f:id:TJO:20190529235744p:plain

aozora_8writers_train.csvをインポートすると、このような画面が出てくるはずです(インポートが終わるとメールで通知が飛んできます)。各ラベルにどれくらいのサンプル(行数)があるかが出てきます。あとはTRAINタブに移って、学習させるだけです。学習が終わるとメールで通知が飛んできます。。。が、データインポート時の通知メールと全く同じ文面で飛んでくるので(笑)そこだけご注意ください。データ量にも依存しますが、今回のデータであれば大体3時間ぐらいで学習が終わると思います。


AutoML Natural Languageのモデル評価をしてみる


EVALUATEタブに飛ぶと詳細なパフォーマンス評価を見ることができます。全体としてはこんな感じのパフォーマンスでした。

f:id:TJO:20190529235916p:plain

Avg precisionが0.945とそれほど悪くはなさそうです。多クラス分類なのでconfusion matrixも見ておきたいところですが、これもデフォルトで表示されるので簡単に確認できます。

f:id:TJO:20190529235828p:plain

これを見ると漱石の分類はうまくいっているものの、false positiveとして漱石に分類されてしまうものも結構多いことが分かります。もしかしたら漱石の文体がある程度他の7名との共通点が多いということなのかもしれませんが、詳細は分かりません。また谷崎潤一郎のテキストにもかかわらず江戸川乱歩と間違えられる割合がかなり高いことも見て取れます。


なお、LABEL STATSでラベルの分布を見ることができますが、そこまで極端な不均衡データでないことが分かります。

f:id:TJO:20190530000113p:plain

こんな感じで大体のモデル評価が出来ます。


試しにテストデータから色々予測させてみる


予測は、AutoML Tablesとは異なりバッチでまとめて(例えば)CSVファイル単位で予測するということが出来ないので、web UIから直接入力するか、APIを叩いて行単位で予測させるかのどちらかしか出来ない点にご注意ください。


以下、適当にweb UIで遊んでみます。まずはテストデータの漱石の文章から1行取ってきて予測させてみます。

f:id:TJO:20190531161659p:plain

こゝろ』の第三部で「先生」の親戚が財産を騙し取ろうとしていたことを回想するくだりですが、正しく漱石だと分類されています。では、二葉亭四迷ではどうでしょうか?

f:id:TJO:20190531161908p:plain

これも正しく二葉亭四迷だと分類されました。小林多喜二はどうでしょうか?

f:id:TJO:20190531162022p:plain

やはり小林多喜二だと正しく分類されました。島崎藤村で見てみましょう。

f:id:TJO:20190531162120p:plain

正しく藤村と判定されました。正岡子規ではどうでしょうか。

f:id:TJO:20190531162231p:plain

これまた正しく正岡子規と分類されました。芥川はどうでしょうか? 実は彼だけ複数作品をまとめているので、難しいかもしれません。

f:id:TJO:20190531162405p:plain

一応正しく芥川と判定されていますが、思ったよりもクラス分類確率が低めに出ています。代わりに小林多喜二の確率が少しだけ高くなっています。では、谷崎潤一郎はどうでしょう?

f:id:TJO:20190531162602p:plain

これも一応正しく谷崎潤一郎と分類されましたが、江戸川乱歩の確率が僅かに高くなっています。最後に、その江戸川乱歩はどうでしょうか。

f:id:TJO:20190531162724p:plain

ちなみに、遊びでこんなことをしてみました。

f:id:TJO:20190530000203p:plain
f:id:TJO:20190531162908p:plain

おい!(笑) 今回のモデルは『我輩は猫である』は藤村の作品だと、『草枕』は子規の作品だと判断したようです。。。ということで、お後がよろしいようで。


参考


f:id:TJO:20190531163236p:plain

一応、以前と同じやり方でTensorFlow HubのNNLMによるfine tuningで128次元ベクトルに直したものを、チューニング一切なし決め打ちのDNNで分類した時のnotebookをGitHubに上げてありますので、興味のある方はご覧ください。AutoML Natural Languageの方ではtrainデータをさらにtrain / dev / testにsplitした上でパフォーマンス評価を出しているのに対して、こちらではtrain / testのsplitのみで(AutoMLでは使われていない)testに対するパフォーマンスを出しているだけなので、両者を直接は比較できないのですが、ご参考までに。

*1:なので実際には作家ごとに行数が結構異なっている

*2:現段階ではマルチバイト文字に対応していないため