Open24

AI近藤春菜作ってみる

Pythonを使ってTwitterに自動投稿するbotを作りたい。

必要なもの

1.TwitterAPIキー
2.ツイート内容を決め、ツイートを行うPythonプログラム
3.2のプログラムを定期実行する仕組み

Twitter APIキーの取得

Gmailアカウントとbot用のTwitterアカウントを用意。
こちらを参考に各種キーを取得することができた。

https://tech-lab.sios.jp/archives/21238#i
30分かからないくらいでできる。

ツイート内容について

自然言語処理で何か作ってみたい。内容は検討中。

実際にtweetする部分について

Tweepyというライブラリが使えるらしいので、そちらを探る。

プログラムの定期実行

自然言語処理することを考えるとGoogle Colabか自宅PCかは使わないといけない。
Google Colabの定期実行とかできたらカッコいいけど難しそう。
GASからColab動かせたら未来ですよねー。
RaspberryPiでGoogleドライブ開いてマウスとキーボードの自動操作とかならいけるかも。
あんまりかっこよくない・・・
自宅PCならタスクスケジューラでなんとかなりそうなのでハードル低めかも。

認証レベルが足りない!

とりあえずホームタイムライン取得が第一歩と思いきや認証レベルがEssentialなのでTwitter API V2の機能しか使えないらしい。
色々不便なのでElevatedレベルの承認申請した。
あとapp permissionsの設定が必要だったので設定&アクセスキーの再発行をした。

自分のツイート取得できた

import tweepy
import os
from dotenv import load_dotenv

#envから各種キーを取得
load_dotenv()
consumer_key = os.environ['CONSUMER_KEY']
consumer_secret = os.environ['CONSUMER_SECRET']
access_token = os.environ['ACCESS_TOKEN']
access_token_secret = os.environ['ACCESSS_TOKEN_SECRET']
bearer_token = os.environ['BEARER_TOKEN']
Client = tweepy.Client(bearer_token, consumer_key, consumer_secret, access_token, access_token_secret)

#最新のツイートを取得
user =Client.get_user(username='rira100000000')
timelines =Client.get_users_tweets(id=user[0]['id'])
print(timelines[0][0])

色々やりすぎてわけわからなくなってきた!
tweepyは認証通るまで検索が使えなかったのでTwitter API V2を使い始めた
検索ワードと関連する言葉を抽出するPythonプログラム作ろうと考える
検索した直近7日間、100件のツイートをMeCabで形態素解析する
精度がいまいちなのでMecabの辞書をNEologdにしたくなる
NEologdのインストールに手こずりUbuntuからインストールしてコピーすることにする
この記事がめちゃくちゃ役に立った↓

https://qiita.com/ku_a_i/items/cf9fc9636958adafc690

現在の様子

菅田将暉 で検索すると

('ミステリ', 0.9970409870147705)
('02', 0.9967736601829529)
('2022', 0.9967241883277893)
('t', 0.9967008233070374)
('co', 0.9966678023338318)
('https', 0.9965382218360901)
('1', 0.9964796900749207)
('将暉', 0.9963600635528564)
('CRYSTAL', 0.9963106513023376)
('8', 0.996193528175354)

ドラマのタイトルの一部が抽出されるゾ。

しかしそれ以外の関連ワードがほぼ全部ゴミデータなのが問題だな。
これは地道に拾う以外に何かいい案はないものだろうか。

AI近藤春奈にしよう

○○じゃねーよ!と自動でつぶやくように設定します。

とりあえずできた

固有名詞だけ拾うようにする+正規表現で半角文字列削除で前述のゴミデータはだいぶ綺麗にできた。
新たな問題は知らない単語だと変な区切りで解釈してしまう。
この場合は鹿楓堂が正解。
これもなんとかしたい。

投稿済みツイートについたいいねの数を重みにできる?
リプを返すことはできる?

リプ返すようになった

rinnaが提供しているモデルにファインチューニングしたいんだけど、GPUメモリが0になってしまう。
バッチサイズを小さくしても効果なし、というか本当に小さくなってるのかわからない…

ローカルPCのメモリが小さすぎるようなのでColabでやったら無事できた。

急にちゃんと喋るときがある

リプライをするためにTwitterで検索したリプライ500件をコーパスとしてファインチューニングしてみた。
ツイートっぽさ+返信っぽさを学習できたかな?

Mecabを使って人名に反応するようにした。

学習データにTwitterのリプライの往復まで含めた方がいいのだろうか?
今はA「雪が降りそうだね」→B「こっちはもう降ってますよ」の場合のBの発言しか学習させてない。
今のモデルへの入力が『雪が降りそうだね』の時、何やら天気に関する話はしてくれるけど、そこに返事の概念があるかどうか怪しい。

生成した文章がmax_lengthでぶった切られることがある。
これは生成した文章中に現れる最後の「!?。」の位置でスライスすることで対応した。

model.generateパラメータ動かした感覚
【temperature】
低いほど文章の多様性が低くなり、ファインチューニングの影響が出やすくなる。
0.35切ると仕事の話ばっかりし始める。
0.4くらいだと程よく与えられた話に関わる気がする。

どうもTwitterから作り出したコーパスに引っ張られすぎる気がする。
検索ワードを"私" にしていたのだけど、何言っても私も私もと言い始める。仕事のスケジュールの話も多すぎる。

でもリプライを学習させたおかげか生成される文に返答感がでるのでそれはよかった。

会話に幅を持たせるためにランダムな検索ワードでリプライツイートを抽出したらどうだろうか。

ログインするとコメントできます