Mastodonに流れてくる投稿からマルコフ連鎖をさせ、投稿する。

はじめに

マルコフ連鎖というものを使って、Mastodon 上に流れる投稿から要素を見つけ、それを再構築して投稿する。

マルコフ連鎖については、ニコニコ大百科にわかりやすく書いてある。→ニコニコ大百科 - マルコフ連鎖

Git から落としてくる

terminal
1
https://github.com/m0r016/mastodon-markov-bot.git

Mastodon のアクセストークンを取得する

新規アプリにアクセス。

で適当に名前を決めて変更を保存。

アプリページに飛ばされるので、作成したアプリのページを開き、アクセストークンをコピーしてくる

config をいじる

terminal
1
cp src/config.ini.sample src/config.ini
src/config.ini
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[read]
// 学習元アカウントの情報をここに入力
// domain にはインスタンスのドメイン(https://抜き)・access_token にはアクセストークンを入力

- domain =

* domain = slum.cloud

- access_token =

* access_token = get_account_token
[write]
// 投稿用アカウントの情報をここに入力
// access_token にはアクセストークンを入力
// 学習用アカウントと同じアカウントを利用したい場合は同じアクセストークンを入力(非推奨)

- access_token =

* access_token = post_account_token

設定がすんだら docker を立ち上げる。

terminal
1
2
3
$ pip install attrs
$ docker-compose up -d
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

というエラーが出てくるので、

Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[read]
FROM python:3.8.5

- RUN apt update

* RUN apt-get update

- RUN apt install -y mecab libmecab-dev mecab-ipadic-utf8 swig

* RUN apt-get install -y mecab libmecab-dev mecab-ipadic-utf8 swig
RUN git clone --depth=1 https://github.com/neologd/mecab-ipadic-neologd
RUN cd ./mecab-ipadic-neologd && ./bin/install-mecab-ipadic-neologd -y -p /var/lib/mecab/dic/mecab-ipadic-neologd
RUN rm -rf ./mecab-ipadic-neologd
RUN ln -s /var/lib/mecab/dic /usr/lib/mecab/dic
RUN mkdir /var/app
WORKDIR /var/app
COPY src/Pipfile ./
COPY src/Pipfile.lock ./
RUN pip install pipenv
RUN pipenv install --system

aptapt-getに変更。

terminal
1
docker-compose up -d

時間はかかるがきちんと実行される。

はじめて投稿されたツイートがこれ・・・?おもしろい。

#bot がついているのが気に入らないので、app.py にアクセスし、#bot を消す。

src/app.py
33
34
35
36
37
38
39
40
41
42
with open("./chainfiles/{}@{}.json".format(account_info["username"].lower(), domain)) as f:
textModel = markovify.Text.from_json(f.read())
sentence = textModel.make_sentence(tries=300)

- sentence = "".join(sentence.split()) + ' #bot'

* sentence = "".join(sentence.split())
sentence = re.sub(r'(:.*?:)', r' \1 ', sentence)
print(sentence)

投稿する頻度を 20 分から 1 時間にする。

src/app.py
45
46
47
48
49
50
51
52
53
54
55
56
57
58

- def schedule(f, interval=3600, wait=True):

* def schedule(f, interval=1200, wait=True):
base_time = time.time()
next_time = 0
while True:
t = threading.Thread(target=f)
t.start()
if wait:
t.join()
next_time = ((base_time - time.time()) % interval) or interval
time.sleep(next_time)

設定がすんだら docker を立ち上げる。

コメント