はじめに
この記事は筆者が学習上作成した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を選択して開きましょう。
##コード説明
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)
以降続きは配布したノートに書いてあるのでそちらを参照してください。