Web Analytics

K Lab.

モノ作りしたり、写真撮ったり。

【GPT-2】AIにツイートを学習させて文章を生成する。

f:id:KLAB:20211103131748j:plain

 

どうも皆さんこんにちは、K Labです。

今回はAIを使って、ツイートから学習して文章を生成したいと思います。

 

今回使うAIはGPT-2と言って、Open AIが作ったオープンソースのAIです。女子高生AI「りんな」なんかにも使われていたりします。それではさっそくやってみましょう。

 

 

1.Twitter APIの利用申請をする。

Twitterからツイートを取得するには、Twitter APIを使わなければいけません。

なのでまずはTwitter APIの利用申請を行ってください。

この記事で申請方法を紹介するのは長くなりすぎてしまうので割愛させていただきます。「Twitter API」などと調べると良い記事が見つかると思うのでその記事を参考に申請してみてください。

 

2.Google Colaboratoryにアクセス

Google Colabにアクセスしましょう。Google ColabはPCのスペック関係なしに機械学習を実行できます。いろいろと制限はありますが、対策すれば制限もあまり気にならなくなりますよ。

 

3.Google Driveをマウント

Google Colabでは一定時間が過ぎるとファイルが消えてしまいます。なのでGoogle Driveをマウントして大事なデータを保存します。

画像にある四角で囲ってあるところをクリックするとマウントできます。

f:id:KLAB:20211102154011j:plain

 

4.ツイート取得

ライブラリをインストール。

!pip install tweepy

 

ツイート取得コード

このコードは実行する前にtweetというフォルダを/content/drive/MyDrive/tweetとなるように作成しておいてください。


import tweepy
import csv
import pprint
import pandas as pd
import os
import time
import datetime
import re
import itertools

#Twitter API
consumer_key = ''
consumer_secret = ''
access_token = ''
access_token_secret = ''
auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

#ツイートを保存するGoogle Driveのディレクトリです。事前に作っておきましょう。
drive_path = '/content/drive/MyDrive/tweet'
#学習用のデータセットで必要なツイート数を指定しています。
max_tweets = 10000

def getMtTweet():
  #取得したツイートを格納するための配列
  global tweets
  tweets = []
  num = 0
  i = 1
  print('page ' + str(i))
  #タイムラインを取得するためにapi.home_timelineを使用します。
  tweet_data = api.home_timeline(include_rts=False,exclude_replies=True,count=100)
  if(len(tweet_data) > 0):
    for tweet in tweet_data:
      #データセット用に各ツイートの最後に<|endoftext|>をつけて整形します。
      
      tweets.append([tweet.text+"<|endoftext|>"])
      num += 1
    i += 1
    next_max_id = tweet_data[-1].id
  while True:
      print('page ' + str(i))
      tweet_data = api.home_timeline(include_rts=False,exclude_replies=True,count=100, max_id=next_max_id-1)
      if(len(tweet_data) > 0):
        next_max_id = tweet_data[-1].id
        for tweet in tweet_data:
          tweets.append([tweet.text+"<|endoftext|>"])
          num += 1
        if(num >= max_tweets):
          break
        i += 1
        #Twitter API制限の上限でエラーにならないようにディレイをかけています。
        time.sleep((15*60)/180)
      else:
        break
      saveTweets(tweets)
  else:
    print('zero tweet')

def saveTweets(tweets):
  ut = time.time()
  #テキストファイルで保存
  file_path = drive_path+'myTweets_' + str(ut) + '.txt'
  file = open(file_path, 'w')
  w = csv.writer(file)
  w.writerows(tweets)
  file.close()
  
  #余計な文字列を削除
  with open(file_path) as f:
      tweets = f.read()
      tweets=re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-…]+', "", tweets)
      tweets=re.sub('RT', "", tweets)
      tweets=re.sub('お気に入り', "", tweets)
      tweets=re.sub('まとめ', "", tweets)
  
  #上書き保存
  with open(file_path,'w') as f:
      f.write(tweets)
  
  with open(file_path) as f:
      print(f.read())


getMtTweet()

 

このコードはこちらのサイトのコードを参考に改良したものです。

【GPT2】AIに自分のツイートを学習させてツイートを生成する - Qiita

こちらのサイトを見れば取得するツイートの種類も変更できます。

APIリファレンス — tweepy 3.6.0 ドキュメント

 

5.GPT-2をインストール

編集→ノートブックの設定→ハードウェアアクセラレータでGPUを選択。

以下のコマンドを順に実行してください。

 

GPT-2インストール

# gpt2-japaneseのインストール
!git clone https://github.com/tanreinama/gpt2-japanese
%cd gpt2-japanese
!pip uninstall tensorflow -y
!pip install -r requirements.txt

 

モデルをダウンロード

!wget https://www.nama.ne.jp/models/gpt2ja-small.tar.bz2
!tar xvfj gpt2ja-small.tar.bz2

 

6.データセットを作成

コマンドを実行する前に、gpt2-japanese直下に先ほど作成したtweetフォルダを移動させておいてください。

以下のコマンドでfinetune.npzに変換しています。

!git clone https://github.com/tanreinama/Japanese-BPEEncoder.git
!python ./Japanese-BPEEncoder/encode_bpe.py --src_dir tweet --dst_file finetune

 

7.ファインチューニング

Colabからrun_finetune.pyをダウンロードしてrun_finetune.pyを以下のように書き換えてください。

 


        try:
            for i in range(300): # for文に変更
            # while True: # 無限ループをコメントアウト
           
                〜省略〜
               
            save() # 保存を追加
        except KeyboardInterrupt:
            print('interrupted')
            save()

書き換えたらColabにあるrun_finetune.pyを削除してrun_finetune.pyを最初、run_finetune.pyがあった場所にアップロードしてください。

以上のことを終えたら以下のコマンドを実行してファインチューニングをしてください。


!python run_finetune.py --base_model gpt2ja-small --dataset finetune.npz --run_name gpr2ja-finetune_run1

 

8.モデルで文章を生成する。

gpt2-generate.pyをColabからダウンロードして、以下のように書き換えて下さい。


ckpt = tf.train.latest_checkpoint("/content/gpt2-japanese/checkpoint/gpr2ja-finetune_run1")

 

書き換え終えたらColabにあるgpt2-generate.pyを削除してgpt2-generate.pyを最初、gpt2-generate.pyがあった場所にアップロードしてください。

以上のことを終えたら以下のコマンドを実行してみましょう。

上手くいっていれば生成された文章が表示されるはずです。

!python gpt2-generate.py --model checkpoint/gpr2ja-finetune_run1-small --num_generate 10

 

ここまで読んでいただきありがとうございました!!

 

参考元 : 

note.com