LoginSignup
5
4

More than 3 years have passed since last update.

【GRU,RNN,LSTM】作家の作品をもとに作家らしい文章生成をしてみよう

Last updated at Posted at 2020-12-21

はじめに

この記事は筆者が学習上作成したnlpモデルを説明したものです。初学者向けの内容になります。具体的にはGRU,LSTM,RNNを使用して芥川龍之介を再現しました。

環境

Google Colaboratoryを使いますので、googleアカウントを持っている方なら誰でも使うことができます。
言語はPythonです。

Google Colaboratoryとは

Googleが提供しているデータサイエンス用のノート型シェルです。言語はPythonだけでなく他の言語も対応しています。Google Colaboratoryは非常に手軽かつGPUを使用でき、機械学習や大規模の数理モデルの計算に通常のCPUだと30分かかるところを数分ほどで計算できます。

コードとコーパスの配布

こちらのgithubにて配布しております。
https://github.com/Kokusho-gif/nlp_akutagawa
akutagawa.ipynbというファイルとコーパス(未整形の学習元データ)が入っているフォルダです。
ノート(ipynb)にはあらかじめコードの説明文を記載しているので、それらを読めばこの記事は必要ないかもしれません。これらのファイルをGoogleDriveにアップロードしてください。akutagawaフォルダごとあげると楽かと思います。

僕の場合My Drive直下にakutagawaフォルダを置きました。
GoogleDriveにアップできましたら、akutagwa.ipynbファイルを右クリックし、アプリで開く→Google Colaboratoryを選択して開きましょう。
キャプチャ.PNG

コード説明

Google Driveにアップロードしたテキスト(学習用データ)にアクセスできるようにする
上2行はGoogleDriveを参照するために必要なコードです。

from google.colab import drive
drive.mount('/content/drive')

My Driveへパスを移動したいます。自分の場合このフォルダ直下のakutagwaフォルダにファイルがあります。ここは皆さんのアップした場所によって変わります。

%cd drive/'My Drive'
%ls

要インストール:ノート内で%pip install globとうって実行してください。

glo.glob関数を用いて、学習用に用いるテキストファイルをlist形式で得る。

import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline
import glob
files = glob.glob("./akutagawa/corpus/*.txt")
print(len(files))

mecabライブラリが標準で入っていないのでGoogleColabにインストールします。

!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7

Mecabを用いて文章を単語ごとに分割します、がその前に元の文章には不要な記号や記述、学習を妨げる特殊な文字(いわゆる外れ値)があるので、
まずreライブラリを用いて消去してます。

その後、Mecab.Tagger()ドライバを用いてフォルダにあるテキストファイル20個までについて形態素解析(単語へ分割)したのち、一つのリスト(text_all)へ格納。できればファイルの数だけ読み込みをしたかったがデータ量が莫大になってしまったため20個に断念。

import re
def making_data(file):
  with open(file,mode='r',encoding='shift_jis', errors='ignore') as f:
    text_original = f.read()

  text = re.sub("《[^》]+》", "", text_original) # ルビの削除
  text = re.sub("[[^]]+]", "", text) # 読みの注意の削除
  text = re.sub(".*-", "", text, flags=re.DOTALL) #-より上の部分の削除
  text = re.sub("([大正|明治.年]+.*", "", text, flags=re.DOTALL) ##地付きより下の部分の削除
  text = re.sub("\n.\n", "", text, flags=re.DOTALL) #題名の削除
  text = re.sub("\n", "", text) #改行の削除
  text = re.sub("[0-9]+|[0-9]+", "", text, flags=re.DOTALL) #数字の削除
  text = re.sub("[A-Z]+|[A-Z]+|[a-z]+", "", text, flags=re.DOTALL) #全角英語の削除
  text = re.sub("[|  ―\,\,./「」\:\:()*×…※△『』〜\/]", "", text) # 各種記号の削除
  text = re.sub("\[\[", "", text)
  text = re.sub("\]\]", "", text)





  return text
import MeCab
m = MeCab.Tagger('-Owakati')
text_all = []
for i in range(20):
    text = making_data(files[i])
    text = m.parse(text)
    text = text.split(' ')
    text_all.extend(text)

以降続きは配布したノートに書いてあるのでそちらを参照してください。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4