2023年6月5日月曜日

自分のツイートからマルコフ連鎖で文章を自動生成してみる

自分のツイートからマルコフ連鎖で文章を自動生成してみる

概要

3万件ほどある自分の Twitter のアーカイブデータからマルコフ連鎖を使って文章を自動生成してみました

環境

  • Ubuntu 18.04
    • mecab 0.996
  • Python 3.10.2
    • mecab-python3 1.0.6
    • markovify

Twitter アーカイブデータの取得

Twitter の Web 画面から行います
データ量によっては 1日以上かかる場合もあります
ダウンロードできたら解凍しその中にある tweets.js を保存しておきます

ちなみに自分のツイートは執筆時点で 30220 ツイートありました

ツールインストール

  • sudo apt -y install mecab mecab-ipadic-utf8
  • sudo cp /etc/mecabrc /usr/local/etc/mecabrc
  • mecab -D
filename:       /var/lib/mecab/dic/debian/sys.dic
version:        102
charset:        UTF-8
type:   0
size:   392126
left size:      1316
right size:     1316

ライブラリインストール

  • pipenv install mecab-python3 markovify

サンプルコード

とりあえず動かすのが目的なのでクラス化などのリファクタリングはしていません

  • vim app.py
import markovify
import MeCab
import json

# tweets.js を読み込んでツイート情報を配列に格納
tweets = []
with open("./tweets.js", mode="r") as f:
    for tweet in json.loads(f.read().replace('window.YTD.tweets.part0 = ', '')):
        tweets.append(tweet['tweet']['full_text'])

# ツイートの配列情報を1行ごとにしてテキストファイルに保存
print(len(tweets))
with open('./input.txt', mode='w') as f:
    for tweet in tweets:
        f.write(f"{tweet}\n")

# 1行ごとに保存したツイート情報をmecabを使って分かち書きに変換、分かち書きも1ツイート1行にして保存
parsed_text = ""
with open("./input.txt", mode="r") as f:
    for line in f.read().split():
        tagger = MeCab.Tagger("-Owakati")
        parsed_text += f"{tagger.parse(line).strip()}\n"

# 分かち書きを1行ごとに保存したのでNewlineText を使って学習
text_model = markovify.NewlineText(parsed_text, state_size=1)

# 文章を10個生成してみる
for _ in range(10):
    sentence = text_model.make_short_sentence(100, tries=100)
    if sentence is None:
        continue
    print(sentence)

動作確認

  • pipenv run python app.py
プラットフォーム なんて やっ て みる か ー 、 あきらめる か 、 、 、 やっぱり 筋 トレ 始め たら 逆 に
の 調子 が 読み込ま れ て いる みたい に 含ま れ ちゃう だろ う か 、 、
を 要求 さ
もう 忘れ て ほしかっ た ほう が 少ない から コロナ は ステート フル カラー ボックス ない や で ない の か な 。 もはや 顔出し し たい 場合 は
うーん 明日 から 届か ない 気 が 多い の 見る の 圧力 センサー 系 も 夢 は
300 H 1 . co / LRgfICHpN 0 ZVHy
で 使っ て から 完全 に 見 た ほう が 自分 だけ で も 試し た 事 象っ て も 会わ ず 、 、
background - server
とか なる 可能 性 が ある か 、
を 送り 続け ない ん ? これ は タッチバーモデル しか 見 てる の ほう が 、

正直意味不明ですがツイートと言えばツイートっぽい気もします
URL なども学習させているのでこのあたりをクリーニングすればもっと良くなるかもです

トラブルシューティング: UnicodeEncodeError: ‘utf-8’ codec can’t encode characters in position 0-1: surrogates not allowed

mecab はデフォルトだと euc_jp なので python の文字コードと違うがあるため print などでエラーになっています
mecab-ipadic-utf8 をインストールし直しましょう

最後に

パラメータなどを調整したりデータのクリーニングをしたりすればもっと良くなると思います 内部的な使用は不明ですがデフォルトだと分かち書きをしたデータをただランダムに組み合わせているレベルにしかならないのかもしれません

参考サイト

0 件のコメント:

コメントを投稿