どうも皆さんこんにちは、K Labです。
今回はAIを使って、ツイートから学習して文章を生成したいと思います。
今回使うAIはGPT-2と言って、Open AIが作ったオープンソースのAIです。女子高生AI「りんな」なんかにも使われていたりします。それではさっそくやってみましょう。
- 1.Twitter APIの利用申請をする。
- 2.Google Colaboratoryにアクセス
- 3.Google Driveをマウント
- 4.ツイート取得
- 5.GPT-2をインストール
- 6.データセットを作成
- 7.ファインチューニング
- 8.モデルで文章を生成する。
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をマウントして大事なデータを保存します。
画像にある四角で囲ってあるところをクリックするとマウントできます。
4.ツイート取得
ライブラリをインストール。
ツイート取得コード
このコードは実行する前に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インストール
モデルをダウンロード
6.データセットを作成
コマンドを実行する前に、gpt2-japanese直下に先ほど作成したtweetフォルダを移動させておいてください。
以下のコマンドでfinetune.npzに変換しています。
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があった場所にアップロードしてください。
以上のことを終えたら以下のコマンドを実行してみましょう。
上手くいっていれば生成された文章が表示されるはずです。
ここまで読んでいただきありがとうございました!!
参考元 :