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

一つ前にGPT2を使って↓こういう記事を書きました。
面白かったので今度はツイートでやってみます。

[【GPT2】AIにラノベのタイトルを作らせてみる](https://qiita.com/atsonic/items/802ce98c127b4960dd93)


##Twitter Developerで認証用のキーデータを取得する
まずはツイートを取得する前準備として[Twitter Developer](https://developer.twitter.com/en)にログインしてアプリケーション登録をし以下の情報を取得します。

**・Consumer Key
・Consumer Secret
・Access Token
・Access Token Secret**

↓こちらで詳しく解説されています。
[PythonでTwitter API を利用していろいろ遊んでみる](https://qiita.com/bakira/items/00743d10ec42993f85eb)

##自分のツイートを取得する
###Colabの準備
[Google Colaboratory](https://colab.research.google.com/)にアクセスして新しくNotebookを作成します。
※ツイートを取得するだけであればGPUは使わなくて大丈夫なのでNotebook settingsは変更しなくて大丈夫です。

また取得したツイートを保存するためにGoogle Driveをマウントします。
↓Notebookをツリー表示して出てくるDriveのアイコンをクリックするとマウントできます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31194/b0bc11c6-9cf3-3705-bdc0-43679dbf0468.png" alt="image" width="400px">

###ツイートの取得
まず初めにpipでtweepyをインストールします。

```python
!pip install tweepy
```

そしてツイートを取得するPythonのコードです。
↓こちらを参考にさせていただき一部改良しています。

[Twitterのつぶやきを一度に大量取得する](https://qiita.com/sartan123/items/08b8f9e2bb11cf119ad6)

ここで気をつけるべきところはTwitterのAPI制限です。
取得するためには特に以下を気をつける必要があります。
**・1リクエストで取得できるツイート数は100
・15分間に180リクエストまで**
ツイート数が多い方は取得にそれなりに時間がかかると思います。

```python
import tweepy
import csv
import pprint
import pandas as pd
import os
import time

#ここはお決まりです。
consumer_key = 'xxxxxxxx'
consumer_secret = 'xxxxxxxx'
access_token = 'xxxxxxxx'
access_token_secret = 'xxxxxxxx'
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/xxxxx/'
#学習用のデータセットで必要なツイート数を指定しています。
max_tweets = 10000

def getMtTweet():
  #取得したツイートを格納するための配列
  tweets = []
  num = 0
  i = 1
  print('page ' + str(i))
  #自分のタイムラインを取得するためuser_timelineを使用します。1リクエストで取得できるツイートの上限数は100です。
  tweet_data = api.user_timeline(count=100)
  if(len(tweet_data) > 0):
    for tweet in tweet_data:
      #データセット用に各ツイートの最後に
をつけて整形します。
      tweets.append([tweet.text+"
"])
      num += 1
    i += 1
    next_max_id = tweet_data[-1].id
    while True:
      print('page ' + str(i))
      tweet_data = api.user_timeline(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+"
"])
          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()
  #csv使ってますがデータセット用にテキストファイルで保存します。
  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:
      print(f.read())

getMtTweet()
```

これでツイートがテキストファイルに保存されました。


##学習から生成
あとは↓こちらを元に学習と生成をすれば完了です。
[【GPT2】AIにラノベのタイトルを作らせてみる](https://qiita.com/atsonic/items/802ce98c127b4960dd93)

ちなみに自分の結果は↓こんな感じでした。

なんか微妙に言い回しが自分ぽくないんですが、、
**自分のツイートを元に生成したと考えるとなんとも言えない感情に襲われますね。🤔**

```

@usbに接続した音楽データが自動で再生へ持ってこいの時は自動でPOIが終了するって話じゃなかったんだな
========
PS3とMSIの対応の違いって、どう違うのかな？
========
Flex_IPが10MBって超超便利すぎ。
========
scalaはGLSLのコードで実装する。pdfとかThunderbirdとかTouchDesignerって言ったらあれだけどね。
========
@touchdのserviceの値がnullに変わってる
========
TwitterでFOMAのことしかできない人は多い。
========
Twitterのつぶやきはこういうのもあるよー。「おいしそうなものがたくさんあるぞ」ってね。
```