スポンサードリンク



こんにちは。sinyです。

この記事ではchABSA-datasetという日本語のデータセットを使ってネガポジ分類アプリを作った際のまとめ記事です。
今回は、自然言語処理(NLP)のTransformerという手法を用いてDjangoでネガポジ分類アプリを作ってみました。

早速ですが、まずはデモ動画から。

 

chABSA-datasetデータセットから有価証券報告に関するインプットデータを入力すると、入力した文章が「Negative or Positive」かを判定します。

また、Transformerで利用されているAttentionの重み値を利用して、文章にAttentionが強くかかっている(=Attentionの重み値が大きい)単語の背景色をより濃い赤色に着色することで「どの単語を重視して判定したか?」を可視化しています。

chABSA-datasetについては以下の関連記事を参照してください。

 

本アプリは書籍「つくりながら学ぶ! PyTorchによる発展ディープラーニング」の「第7章:自然言語処理による感情分析(Transformer)」を元に作成していますので、基本コードについては書籍を参照してください。

   

上記書籍では、英語の映画レビューのデータセット(IMDB)を使うことを前提に書かれていますが、実務などで活用することを考えると日本語データセットでモデルを構築したいところです。

そこで、書籍のコードをベースに日本語モデルの感情分析モデルの構築を行いDjangoアプリ化まで実施してみました。

Transformerの詳細や細かいコード内容については書籍のコードを見ていただくこととし、「つくりながら学ぶ! PyTorchによる発展ディープラーニング」のコードをベースに「どこをどのようにカスタマイズすれば日本語データセットのモデルを構築できるか?」を中心に解説していきます。

なお、書籍のコードについては以下のGithubで公開されていますのである程度知識のある方はソースを見ればわかると思います。
初級者の方は、一度書籍を元に英語ベースのモデル構築を学習後に本記事の内容を試してみることをお勧めします。

日本語モデルに作り直した全コードは私のGithubで公開しています。

 発展ディープラーニングの著者である小川さんとは何度か実際にお会いしたことがありますが、とても丁寧に教えてくださる方です!
書籍についてもかなり丁寧に解説してくれていますので、ディープラーニングを一歩深く学びたい方にはお勧めです。

 

chABSA-datasetから訓練、テストデータを作成

まずは、chABSA-datasetから訓練、テストデータを作成します。

作成手順については以下の関連記事で紹介していますので参考にしてみてください。

上記手順を踏むと、以下のデータが生成されます。

  • train.tsv(訓練データ7割)
  • test.tsv(テストデータ3割)

 

chABSA-datasetからDataLoaderを作成

続いて、作成したtrain.tsvとtest.tsvを元にpytorchでDataLoaderを作成します。

今回は日本語データが対象ということもあり、以下の点が書籍とは異なっています。

単語分割にMeCab(neologd)を利用する。

日本語データの形態素解析用にMeCabを利用するように変更しています。
具体的には以下のtokenizer_mecabメソッドを新たに定義しています。

テキストデータの前処理をカスタマイズ

 

テキストデータの前処理はpreprocessing_textメソッドに定義されていますが、以下の処理を追加しました。

・preprocessing_textメソッドにテキストデータすべて半角→全角へ変換する処理を追加(ライブラリーmojimojiを利用)
・preprocessing_textメソッドに数値を0化する処理を追加。

前処理関数を以下のように変更しています。

 

これで、日本語の入力データを以下のように形態素解析してくれます。

 

DataLoaderの作成

続いてDataLoaderの作成です。

ここは、書籍のコードと同じです。

 

なお、データ数は以下の通りです。

 

fastTextの学習済み日本語モデルを利用する。

書籍ではfastTextの英語版の学習済みモデルを利用していましたが、今回は日本語データを扱うため日本語学習済みのfastTextモデル(model.vecファイル)を使います。

ダウンロード手順は以下の通りです。

1.fastTextの日本語学習済みモデルをhttps://qiita.com/Hironsan/items/8f7d35f0a36e0f99752cからダウンロードする。

2.「URL2:Download Word Vectors(NEologd)」部分のリンクhttps://drive.google.com/open?id=0ByFQ96A4DgSPUm9wVWRLdm5qbmcからGoogle Driveのリンクに飛んで「vector_neologd.zip」をダウンロードして解凍したfastTextの日本語学習済みモデル「model.vec」を利用する。

日本語のボキャブラリーを作成する。

ここも書籍とほぼ同じコードですが、読み込むモデルを「model.vec」に変更します。

 

日本語学習済みのfastTextモデルは、以下の通り300次元になっていますが、書籍で扱っている英語版は200次元なのですべてのコードで200次元になっている箇所は300次元を扱うように変更する必要があります。

 

あとは、書籍と同じように以下のコードで日本語データのボキャブラリーデータセットが出来上がります。

 

 

データローダの作成も書籍と基本的に同じです。

 

以下の通り、TEXT部分にINDEX化された日本語データが、LABEL部分にネガティブorポジティブを表す1,0データセットが生成されます。

 

Transformerモデルによるネガポジ分類実装

モデル実装部分も基本的に書籍と同じですが、これまで説明してきた通り日本語データセットを扱うようなget_chABSA_DataLoaders_and_TEXTメソッドを新規に作成しています。

 

また、fastText日本語学習済みモデルは300次元なので、PositionalEncoder、Attention、ClassificationHeadクラス内で定義している「d_model=200」という部分をすべて300次元に変更しています。

モデル実装部分で変更している点は以上です。

 

 Transformerの学習・推論、判定根拠の可視化

学習、推論、可視化の部分についてはほぼ書籍通りの内容でそのまま利用できました。

ちなみにchABSA-datasetデータセットを利用して学習した結果は以下の通りです。

30エポック学習させましたが、正解率は85%前後で頭打ちになりました。
今回は14エポック目でベストスコア(バリデーションの正解率85.8%)となりました。

以上でchABSA-datasetデータセットを用いたTransformerによるネガポジ分類機の実装と学習、可視化までが完了します。

詳細なコードは以下のGithubで公開していますので気になる方はぜひチャレンジしてみてください。

記事が長くなってしまったので、次回の記事でDjangoアプリ実装部分を簡単に解説したいと思います。

 

 

おすすめの記事