GPT-2に科研費報告書のデータを学習させて架空研究報告書を生成する

# はじめに
研究者にとって、研究費の申請書や報告書を書くのがしんどいのはよくあることです。
しんどさの軽減を試みるべく、GPT-2に報告書っぽいテキストを生成させてみました。
やっていることは[こちら](https://qiita.com/tset-tset-tset/items/ba8e67342a0147e0f60e)の二番煎じで、transformersパッケージのGPT-2に過去の科研費報告書のデータ（日本語）を学習させて自動生成をします。

# 環境
- Google Colaboratory GPUランタイム

# データの準備
深い意味はありませんが、この項目はローカルのjupyter notebookで実行しました。
## 科研費データベースからcsvのダウンロード
[科研費データベース](https://kaken.nii.ac.jp/)から、「コロナ」というキーワードで期間指定なしの2767件をcsvでダウンロードしました。
コロナウイルスだけでなく、太陽コロナなどに関する研究も含まれます。
ちなみに研究期間を2020年のみに指定すると、「コロナ」というキーワードでヒットする研究は55件でした。

## 研究報告のテキストデータをまとめる
科研費データベースからダウンロードしたcsvの扱いは、[こちら](https://qiita.com/kageazusa/items/f0c439e61be3240ffcc1)の記事を参照してください。研究概要に相当するテキストのリストを作ります。
[前例](https://qiita.com/tset-tset-tset/items/ba8e67342a0147e0f60e)では学習させるデータに対して形態素解析をしていないので、今回も形態素解析は省きます。

```python:python
import pandas as pd
df = pd.read_csv("corona.csv")

column_list = ['研究開始時の研究の概要', '研究概要', '研究成果の概要', '研究実績の概要']
abstracts = []

for column in column_list:
    abstracts.extend(df[column].dropna().tolist())
```
![スクリーンショット 2020-12-15 22.54.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/9a94c57d-2770-aed8-c73a-41f61559801b.png)


## train.txt, eval.txtに出力
リスト``abstracts``から、学習に必要な``train.txt``と``eval.txt``を作ります。
1行ずつに分けて行数で分割してもいいですが、今回は要旨単位で分けることにしました。
``eval``は予約語なので、``eval.txt``に出力したいデータの変数名は``test``にしてあります。

```python:python
from sklearn.model_selection import train_test_split
import codecs

train, test = train_test_split(abstracts, test_size = 0.1)

with codecs.open('train.txt', 'w', encoding='utf-8-sig') as f:
    for abstract in train:
        f.write("%s\n" % abstract)
        
with codecs.open('eval.txt', 'w', encoding='utf-8-sig') as f:
    for abstract in test:
        f.write("%s\n" % abstract)
```
![スクリーンショット 2020-12-15 23.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/6d288b26-cabc-b664-998d-65751f7a1d22.png)
![スクリーンショット 2020-12-16 20.13.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/22586406-754b-1cb5-0613-07cf0629817c.png)

## train.txt, eval.txtをGoogle Driveにコピー
所定のフォルダに入れておきます。

# GPT-2を学習させる
ここからGoogle Colabで実行しています。
基本的に[前例](https://qiita.com/tset-tset-tset/items/ba8e67342a0147e0f60e)に倣っています。
学習に3時間半ほどかかりました。

```python:python
# Google Driveをマウント
from google.colab import drive
drive.mount('/content/drive')
```
```python:python
# transformersをコピーしてくる
!git clone https://github.com/huggingface/transformers.git -b v3.4.0 '/content/drive/My Drive/transformers'
```
```python:python
# 環境構築
cd '/content/drive/My Drive/transformers'; pip install -e .
```

## 学習
```python:python
## 初回実行、まだチェックポイントが無い場合
!python ./examples/language-modeling/run_language_modeling.py \
    --output_dir=../GPT-2/output_gpt2 \
    --model_type=gpt2 \
    --model_name_or_path=gpt2 \
    --do_train \
    --train_data_file=../GPT-2/train.txt \
    --do_eval \
    --eval_data_file=../GPT-2/eval.txt \
    --per_device_train_batch_size=2 \
    --per_device_eval_batch_size=2 \
    --num_train_epochs=10 \
    --save_steps=5000 \
    --save_total_limit=3
```
``save_steps=5000``だと学習開始して1時間半ぐらい経ってからじゃないと途中のチェックポイントが保存されず不安になったので、容量に余裕があれば1000ぐらいがいいかもしれません。

## テキストの生成
元の例に倣って``length=1000``にするとなぜかRunTimeErrorになりました。
500にすると正常に生成されました。

```python:python
!python ./examples/text-generation/run_generation.py \
    --model_type=gpt2 \
    --model_name_or_path=../GPT-2/output_gpt2 \
    --prompt "本研究では、以下の成果を得た。" \
    --seed=${RANDOM} \
    --length 500
```

```text:出力結果1
=== GENERATED SEQUENCE 1 ===
本研究では、以下の成果を得た。
1.「気管呼吸」とされた「感情染晶磁性粒子の粒子血管膜の粒子量感染晶法」との関係、理論の基礎研究、世界の線数値シミュレーション研究、様々な本研究所本講演的な提案に基づく理論や心臓粒子の同定および解析研究所本講演の最適化
本研究では、3分散年齢の目標のデータを組み合わせる手法を開発し、以下の成果を得た。
1.「粒子の晶磁性粒子を持つ感染の粒子量感染晶法」により、細胞内の多くは生殖材料の研究と気管呼吸の原理に換えた場合、生殖材料の結合、それについて確立する解析を行った。
2.「アジアミング分散年齢の目標のデータ」によるデータは、生殖材料の会話、細胞内のそれ
```

```text:出力結果2
=== GENERATED SEQUENCE 1 ===
本研究では、以下の成果を得た。
1.アルゴリズムの計算機、アルゴリズム等の地球面の影響について、アルゴリズム等の遺伝子は、ビーム、ヌス、トラボ、分子過程、データ等の影響がある。
2.これらの原理によるステラ等に関する最適像領域では、シースを精製して、再生に関する領域である。面の影響についても、ステラ領域では、分子横軌道を側面に入って、シースを側面で進化させ、電力、ビームが混合しているが、面経験では保存なステラ領域である。また、その経験ではステラ領域ではステラ領域では、最も種々の生成に依存している。
3.次世代者と他代者の構成に関する研究を実施した。
4.メッシュのステラ等に関する伝送排出を行い、動作による要因の電磁界値が高いと考えられる。
5.生体の観測研究では、二値のステラ関数を印加するため
```

```text:出力結果3
=== GENERATED SEQUENCE 1 ===
本研究では、以下の成果を得た。
1.京都シート結果と双極端の相互作用シート法
シート結果は、双極端の相互作用シート法という主に近傍で、先端ずかに見られる原子エネルギーの構造を試みた。これまでにこのエネルギーの構造は、天然填麻磁鎖でも、精度の存在することが判明した。
2.ガスミッタ集合器の正学やラベル・アレイのモデルの開発
マルチディエンタンの非線形表面とラベルのセミナーションとの関連は、ネットワーク程度の測定で調べ、ディエンタンの研究により明らかにした。
3.レキュレーション機構の結果
平成30年度は、以下の成果を得た。
1.レキュレーション機構の結果
コンケール応用の実用化について、カベオリクス速度を持つチミュレーション効果を解析し、ナノチューブからの取り込まれる場合の運用を定量的に解析することができた。
2.ビジュールおよびビジュール基板・�
```
無意味ですが、それっぽいフレーズが出力されていますね。内容はともかく、箇条書きの番号がちゃんとしているのは少し驚きました。

# MeCabで分かち書きして学習させた結果
上記の例では、「感情染晶磁性粒子」「アジアミング分散年齢」「ヌス、トラボ」「天然填麻磁鎖」「ガスミッタ」「マルチディエンタン」「セミナーション」「レキュレーション」「コンケール」「カベオリクス」「チミュレーション」「ビジュール」など、それっぽいがよくわからない単語が出ていたため、MeCabで分かち書きすると改善するかな？と思い、やってみました。
``prompt``の文章も分かち書きしたものを使っています。
以下に示す結果は、原文に改行が少なくて見づらかったので、適宜改行を入れています。（例えば、「出力結果5」の原文にはまったく改行がありませんでした。）

```text:出力結果4
=== GENERATED SEQUENCE 1 ===
本 研究 で は 、 以下 の 成果 を 得 た 。 
( 1 ) シグナル 株 データ の 電気 流体力学 的 、 生体 的 な 実験 を 実施 し 、 実験 実験 によって 明らか に さ れ た 。 

本 研究 で は 明らか に する よう な コロナ質量放出 を 計測 する ため に 、 代表者 対象 における 放出 システム の 不断行論 的 手法 を 用い た 振動 実験 の 結果 、 外乱 部分 性 実験 用 の 製作 を 行い 、 放出 システム の 把握 を 行っ た 。 
また 、 放出 システム の 導出 を 実証 する こと で 検討 し た 。 
コロナ質量放出 分野 を 基本的 に する と 放出 システム の 双方 で の 実態 観測 を 目的 と し た 。 

本 研究 で は ， 空間 容器 において 放電 線 粒子 の 化学 計算 を 開発 する こ
```
```text:出力結果5
=== GENERATED SEQUENCE 1 ===
本 研究 で は 、 以下 の 成果 を 得 た 。 
1 ) 超 微細 波 の 分離 により 多く の 異なる 、 分離 及び 静 電 界 の 活性化 を 示す もの と 、 同じ で ある 現象 が ある 。 
2 ) 電子 の 異常 の プロモート を 介し た 細胞 に 拡張 し た プロモート の ディスク トリポン が 多く 、 宇宙 発光 が 現れる こと が 示唆 さ れ た 。 
3 ) 昨年度 の 結果 を まとめ て 、 分離 及び 静 電 界 活性化 は 今後 の 実現 として 検討 さ れ て いる が 、 微細 波 の 企画 を 生成 し て 細胞内 へ 伸び 共同 さ れる 。 
4 ) 宇宙 発光 測定 により 宇宙 発光 時 の 不明 で ある ステルコロナリング と プロパノール 転写真 を 使用 し て いる 。 また 、 昨年度 に 通常 の 応用 に 基づき 、 電子 の 昨年度 に 調べ た 方法 は
```
```text:出力結果6
=== GENERATED SEQUENCE 1 ===
本 研究 で は 、 以下 の 成果 を 得 た 。 
1. 単一 周波数 基盤 方式 の 適用 研究 の 国際 図 の 設計 値 を 評価 する ため に 、 成果 報告細胞 における 一方向 の 適用 研究 の 予想 と なる 設計 データ を 提案 し た 。 
2. 適用 研究 の 表面 地域 マウス を 加え た 適用 条件 を 進め て き た 。 また 、 適用 条件 の 重要性 を 明らか に し た 。 

本 研究 で は 、 正規模 の 情報 を 用い た 統計的 統計 的 相互作用 の 対象 を 図っ て 、 地下 観測 および 統計的 ・ 現在 、 地下 大気 による 接着 法 を 開発 し 、 地下 大気 面 と 編集 し た 場合 の 検討 の ため の 研究 を 行っ た 。 

本 研究 の 目的 は 、 新た に 研究
```
「ディスク トリポン」「ステルコロナリング」「転写真」「報告細胞」などの謎単語は出現しているものの、分かち書きしない場合に比べて頻度は下がったように見受けられます。一方で、定量化は難しいものの、なんとなく文章全体の不自然さが増したような印象もあります。
実用に耐える文章の自動生成まで、まだまだ道のりは遠そうです。

# 参考
- [huggingface/transformers のツールに GPT2 の fine-tuning と文章生成があったので日本語で試したら動いた](https://qiita.com/tset-tset-tset/items/ba8e67342a0147e0f60e)
- [科研費データベース](https://kaken.nii.ac.jp/)
- [【自然言語処理】科研費データベースからMeCab-ipadic-neologdとtermextractでキーワードを抽出する](https://qiita.com/kageazusa/items/f0c439e61be3240ffcc1)