Upgrade to Pro — share decks privately, control downloads, hide ads and more …

僕っぽいことを喋るBotをマストドンで育てています / I'm growing a bot on mastodon that talks like me.

僕っぽいことを喋るBotをマストドンで育てています / I'm growing a bot on mastodon that talks like me.

Hiroya-W

April 21, 2023
Tweet

More Decks by Hiroya-W

Other Decks in Technology

Transcript

  1. 自己紹介 n HN | ゆゆ ゆゆ君@Hyuyu_kun Hiroya-W • 京都工芸繊維大学 情報工学専攻

    M2 • ソフトウェア工学の研究をしています n 好きなこと 2
  2. 4

  3. 6

  4. 7

  5. 8

  6. 10

  7. 11

  8. 14

  9. Mastodon(マストドン) 19 n 基本的な機能はTwitterと似ている n 分散型SNS • 各開設者が管理者として独自のルールや利用規約を 定めて運営することが出来る •

    TwitterはTwitterだけで管理しているので 中央集権型SNS n オープンソースソフトウェア • コードが公開されているのでどうやって作られているか 分かる • ライセンスに従っていれば自由に使ってヨシ https://mstdn.jp/about
  10. 20

  11. 23

  12. 24

  13. 28 実際のソースコード 1 from mastodon import Mastodon 2 3 api

    = Mastodon( 4 api_base_url=os.environ.get("MASTODON_API_BASE_URL"), 5 client_id=os.environ.get("MASTODON_CLIENT_KEY"), 6 client_secret=os.environ.get("MASTODON_CLIENT_SECRET"), 7 access_token=os.environ.get("MASTODON_ACCESS_TOKEN"), 8 ) 9 10 api.toot(”Hello aquatan.net!”) # ここでトゥート
  14. 30

  15. 39 ツイートの一覧(JSON形式でリストになってる) { "tweet" : { "edit_info" : { "initial"

    : { "editTweetIds" : [ "1302065175718105088" ], "editableUntil" : "2020-09-05T02:35:03.749Z", "editsRemaining" : "5", "isEditEligible" : true } }, "retweeted" : false, "source" : "<a href=¥"https://mobile.twitter.com¥" rel=¥"nofollow¥">Twitter Web App</a>", "entities" : { "hashtags" : [ ], "symbols" : [ ], "user_mentions" : [ ], "urls" : [ ] }, "display_text_range" : [ "0", "36" ], "favorite_count" : "2", "id_str" : "1302065175718105088", "truncated" : false, "retweet_count" : "0", "id" : "1302065175718105088", "created_at" : "Sat Sep 05 02:05:03 +0000 2020", "favorited" : false, "full_text" : "論理回路勉強すると、Minecraftで作りたくなるやつ、めっちゃわかる", "lang" : "ja" } },
  16. 40 ツイートの一覧(JSON形式でリストになってる) { "tweet" : { "edit_info" : { "initial"

    : { "editTweetIds" : [ "1302065175718105088" ], "editableUntil" : "2020-09-05T02:35:03.749Z", "editsRemaining" : "5", "isEditEligible" : true } }, "retweeted" : false, "source" : "<a href=¥"https://mobile.twitter.com¥" rel=¥"nofollow¥">Twitter Web App</a>", "entities" : { "hashtags" : [ ], "symbols" : [ ], "user_mentions" : [ ], "urls" : [ ] }, "display_text_range" : [ "0", "36" ], "favorite_count" : "2", "id_str" : "1302065175718105088", "truncated" : false, "retweet_count" : "0", "id" : "1302065175718105088", "created_at" : "Sat Sep 05 02:05:03 +0000 2020", "favorited" : false, "full_text" : "論理回路勉強すると、Minecraftで作りたくなるやつ、めっちゃわかる", "lang" : "ja" } },
  17. 45 MeCabでわかち書き 論理回路 名詞,固有名詞,一般,*,*,*,論理回路,ロンリカイロ,ロンリカイロ 勉強 名詞,サ変接続,*,*,*,*,勉強,ベンキョウ,ベンキョー する 動詞,自立,*,*,サ変・スル,基本形,する,スル,スル と 助詞,接続助詞,*,*,*,*,と,ト,ト

    、 記号,読点,*,*,*,*,、,、,、 Minecraft 名詞,固有名詞,一般,*,*,*,Minecraft,マインクラフト,マインクラフト で 助詞,格助詞,一般,*,*,*,で,デ,デ 作り 動詞,自立,*,*,五段・ラ行,連用形,作る,ツクリ,ツクリ たく 助動詞,*,*,*,特殊・タイ,連用テ接続,たい,タク,タク なる 動詞,自立,*,*,五段・ラ行,基本形,なる,ナル,ナル やつ 名詞,代名詞,一般,*,*,*,やつ,ヤツ,ヤツ 、 記号,読点,*,*,*,*,、,、,、 めっちゃ 副詞,一般,*,*,*,*,めっちゃ,メッチャ,メッチャ わかる 動詞,自立,*,*,五段・ラ行,基本形,わかる,ワカル,ワカル import Mecab m = Mecab.Tagger(”-Owakati”) print(m.parse(“論理回路勉強すると、Minecraftで作りたくなるやつ、めっちゃわかる”) 論理回路 勉強 する と 、 Minecraft で 作り たく なる やつ 、 めっちゃ わかる 品詞分解の結果
  18. 47 markovifyでマルコフ連鎖のモデルを作成 import markovify all_wakatigaki = [] for tweet in

    tweets: # 全部のツイートに対して wakatigaki = m.parse(tweet) # わかち書き all_wakatigaki.append(wakatigaki) # 配列につっこむ corpus = “¥n”.join(all_wakatigaki) # 1行1文で連結
  19. 48 markovifyでマルコフ連鎖のモデルを作成 import markovify all_wakatigaki = [] for tweet in

    tweets: # 全部のツイートに対して wakatigaki = m.parse(tweet) # わかち書き all_wakatigaki.append(wakatigaki) # 配列につっこむ corpus = “¥n”.join(all_wakatigaki) # 1行1文で連結 論理回路 勉強 する と 、 Minecraft で 作り たく なる やつ 、 めっちゃ わかる せっかく な ので ISUCON 向け に Makefile を 書い て いる 後は ポート 開放 の ツール と か な Minecraft の ツイート 見かけ て 、 こんな の あっ た なー と 思い出し た
  20. 49 markovifyでマルコフ連鎖のモデルを作成 import markovify all_wakatigaki = [] for tweet in

    tweets: # 全部のツイートに対して wakatigaki = m.parse(tweet) # わかち書き all_wakatigaki.append(wakatigaki) # 配列につっこむ corpus = “¥n”.join(all_wakatigaki) # 1行1文で連結 model = markovify.NewlineText(corpus, state_size=3, well_formed=False) # モデルを作成 論理回路 勉強 する と 、 Minecraft で 作り たく なる やつ 、 めっちゃ わかる せっかく な ので ISUCON 向け に Makefile を 書い て いる 後は ポート 開放 の ツール と か な Minecraft の ツイート 見かけ て 、 こんな の あっ た なー と 思い出し た
  21. 53

  22. 55 scheduleで定期的に実行する import schedule def job() -> None: sentence =

    model.make_short_sentence(140) sentence = "".join(sentence.split(" ")) api.toot(sentence) def main() -> None: schedule.every(60).minutes.do(job) # 1時間に1回job関数を実行 while True: schedule.run_pending() time.sleep(1)
  23. 56

  24. これからやりたいこと n 機能的な話 • フォローされたらフォローを返すようにしたい • リプライに反応出来るようにしたい • 僕のリプライの記録から、それっぽいリプライを返せるように n

    プログラム的な話 • いろんな機能をつけたしていくので、付け足していきやすい設計をしたい • ジョブをキューにつっこんで、順番に処理させるとか? 59