「青空文庫で作者っぽさ判定(KERAS+character-level cnn)」をやってみた

書籍ではありませんが、青空文庫で作者っぽさ判定(KERAS + character-level cnn)を試してみました。

準備

プログラムのダウンロード

  1. shibuiwilliam/aozora_classification: This project aims to classify Japanese sentence to how well similar to some Japanese classical writers, such as Soseki Natsume, Ogai Mori, Ryunosuke Akutagawa and so on.にアクセスします。
  2. 「Clone or download」をクリックします。
  3. 「Download ZIP」をクリックします。

    「aozora_classification-master.zip」ファイルがダウンロードされます。
  4. 「aozora_classification-master.zip」ファイルを解凍して、フォルダ名を変更し、以下の画面のようにします。

TensorFlow with GPU supportのインストール

以下の記事をご覧ください。

TensorFlow with GPU supportをインストールしてみた

BeautifulSoupのインストール

以下の記事をご覧ください。

Pythonによるスクレイピング&機械学習 開発テクニック「BeautifulSoupでスクレイピングしよう」(P.31)をやってみた

lxmlのインストール

以下の記事をご覧ください。

lxmlをインストールしてみた

h5pyのインストール

以下の記事をご覧ください。

h5pyをインストールしてみた

まずはデータを集めよう

Windows 10で試す場合は、aozora_scrape.pyの194行目を修正する必要があります。
修正前:

  f = open(file_name, 'r')

修正後:

  f = open(file_name, 'r', encoding="utf-8")
  1. 」をクリックし、「Anaconda3 (64-bit)」→「Anaconda Prompt」の順番にクリックします。
  2. 「conda info -e」と入力して、Enterキーを押します。

    「tensorflow」実行環境が作成されていることを確認します。
  3. 「activate tensorflow」と入力して、Enterキーを押します。
  4. 「D:」と入力して、Enterキーを押します。
  5. 「cd aozora_classification」と入力して、Enterキーを押します。
  6. 「python aozora_scrape.py」と入力して、Enterキーを押します。

    データが集められ、csvファイルが作成されます。

character-level cnn

Windows 10で試す場合は、aozora_cnn.pyの206行目、213行目、216行目を修正する必要があります。
修正前(206行目):

  target = os.path.join('/tmp', 'weights.*.hdf5')

修正後(206行目):

  target = os.path.join('tmp', 'weights.*.hdf5')

修正前(213行目):

  csv_logger_file = '/tmp/clcnn_training.log'

修正後(213行目):

  csv_logger_file = 'tmp/clcnn_training.log'

修正前(216行目):

  checkpoint_filepath = "/tmp/weights.{epoch:02d}-{loss:.2f}-{acc:.2f}-{val_loss:.2f}-{val_acc:.2f}.hdf5"

修正後(216行目):

  checkpoint_filepath = "tmp/weights.{epoch:02d}-{loss:.2f}-{acc:.2f}-{val_loss:.2f}-{val_acc:.2f}.hdf5"
  1. 」をクリックし、「Anaconda3 (64-bit)」→「Anaconda Prompt」の順番にクリックします。
  2. 「conda info -e」と入力して、Enterキーを押します。

    「tensorflow」実行環境が作成されていることを確認します。
  3. 「activate tensorflow」と入力して、Enterキーを押します。
  4. 「D:」と入力して、Enterキーを押します。
  5. 「cd aozora_classification」と入力して、Enterキーを押します。
  6. 「python aozora_cnn.py」と入力して、Enterキーを押します。

    1エポックあたり3分程度で、100エポックまで頑張りました。
    30エポック目が最高値でした。モデルのファイル名は「weights.30-0.09-0.96-0.60-0.88.hdf5」でした。判定するときに使います。

判定してみましょう

手元で計算したモデルで試す場合は、aozora_classfication.pyの14行目を修正する必要があります。また、任意の文章で試す場合は、同15行目を修正します。
修正前:

model_file = "/tmp/weights.07-0.22-0.92-0.35-0.88.hdf5"
raw_txt = "隴西の李徴は博學才穎、天寶の末年、若くして名を虎榜に連ね、ついで江南尉に補せられたが、性、狷介、自ら恃む所頗る厚く、賤吏に甘んずるを潔しとしなかつた。"

修正後:

model_file = "tmp/weights.30-0.09-0.96-0.60-0.88.hdf5"
raw_txt = "春はあけぼの。やうやう白くなりゆく山際、少し明かりて、紫だちたる雲の細くたなびきたる。"
  1. 」をクリックし、「Anaconda3 (64-bit)」→「Anaconda Prompt」の順番にクリックします。
  2. 「conda info -e」と入力して、Enterキーを押します。

    「tensorflow」実行環境が作成されていることを確認します。
  3. 「activate tensorflow」と入力して、Enterキーを押します。
  4. 「D:」と入力して、Enterキーを押します。
  5. 「cd aozora_classification」と入力して、Enterキーを押します。
  6. 「python aozora_classification.py」と入力して、Enterキーを押します。

    データが集められ、csvファイルが作成されます。

    「春はあけぼの」は、芥川龍之介の可能性が最も高くなりました。

おまけ

試しに、以下の文章を判定してみたら、坂口安吾率が高い。

raw_txt = "青空文庫のテキストを利用して、任意の日本語文の作者っぽさを判定するモデルを作ってみました。"
           夏目漱石         芥川龍之介           森鴎外      坂口安吾
0  4.803161e-09  5.211149e-07  7.031461e-13  0.995002

朝日新聞デジタルのニュースの1段落を判定してみても、坂口安吾でした。

           夏目漱石         芥川龍之介           森鴎外      坂口安吾
0  2.609980e-08  7.711994e-10  1.840337e-12  0.982999

今の書き言葉は、坂口安吾の言葉と近いのでしょうか。