概要
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 件のコメント:
コメントを投稿