目的
自動で何か喋ってくれるTwitterのbotを作りたい。
そのために、まずは自分のツイートをもとに新しい文章を生成する機能を作ってみる。
方法
文章の自動生成については、マルコフ連鎖というものを使ってみる。
元となるデータは自分の過去1か月のツイートとする。
開発環境
・Windows 10
・Python 3.10.7
やったこと
1.Pythonのインストール
2.MeCabのインストール
3.Twitterからデータをダウンロード
4.ダウンロードしたデータを形態素解析して整形する
5.整形したデータを元にしてマルコフ連鎖を用いて文章を生成
1.Pythonのインストール
以下の公式サイトから最新安定板をダウンロード
https://www.python.org/
このとき、通常のインストールだと何故か端末の個人フォルダの下にインストールされた。
そのため、一度アンインストールして再度、Python用のフォルダを指定してインストールし直した。
また、後の手順でpipを使用するのでここでpipにパスを通しておく。
pipはPythonインストールフォルダのScriptsフォルダ下にある。
2.MeCabのインストール
64bit版が以下からダウンロードできるようです。
https://github.com/ikegami-yukino/mecab/releases/tag/v0.996.2
文字コードはUTF-8を指定してインストール。
2-1.MeCabを試してみる
インストールできたら、実際にMeCabを使って形態素解析をやってみる。
C:\dev\python\markov>py
>>> import MeCab
>>> tagger = MeCab.Tagger('-Owakati')
>>> print(tagger.parse("本日はお日柄もよく"))
本日 は お 日柄 も よく
Tagger
関数の引数にフォーマットを指定しています。
-Owakati
は分かち書きを表します。
「本日はお日柄もよく」というテキストを単語ごとに分かち書きにして
「本日 は お 日柄 も よく」とスペース区切りで出力されています。
いい感じですね。
3.Twitterからデータをダウンロード
Twitterには過去のツイートの内容をCSVで出力する機能があります。
ツイッターアナリティクスから自分の直近1か月のツイートをダウンロードします。
しかし、このCSVにはツイートの本文以外にもURLやいいね数などの情報も一緒になっています。
そこから本文だけを抜き出して、ざっと内容を確認してみました。
@
を使ったリプライなども混じっているようです。
文章を自動生成する場合に、勝手に他人にリプライを送るわけにはいかないので、@
から始まる文字列を正規表現を使って空白にリプレース。
同様にリンクも変なURLにならないように消しました。
4.ダウンロードしたデータを形態素解析して整形する
しかしこれだけでも、自動生成に使うにはまだ足りません。
先ほどのMeCabを使って単語を分かち書きにします。
import MeCab
input = open('./data.txt', 'r', encoding='utf-8') # 元となるツイートのデータ
output = open('./splitted.txt', 'w', encoding='utf-8') # ツイートを分かち書きしたもの
mecab = MeCab.Tagger("-Owakati")
for line in input.read().split('\n'):
splittedLine = ' '.join(mecab.parse(line).split())
output.write(splittedLine)
output.write('\n')
input.close()
output.close()
注意した点としては、open()
関数の引数encoding
の存在です。
Pythonはインストールした環境の文字エンコーディングがデフォルトとなるそうで、僕はWindows環境にインストールしたのでcp932
になっているようです。
そのままopen
しようとすると、UnicodeDecodeError: 'cp932' codec can't decode・・・
とエラーが出ます。
そのため、UTF-8
指定しているということです。
このsplitted.py
ファイルを実行することで、ツイートの本文データを自動生成に使えるフォーマットに整形することができました。
5.整形したデータを元にしてマルコフ連鎖を用いて文章を生成
文章の自動生成はマルコフ連鎖を用います。
Pythonにはこのマルコフ連鎖ライブラリmarkovify
というものがありますので、まずこれをインストールします。
pip install markovify
インストールが成功したら、実際にmarkovify
を使ったコードを書きます。
import markovify
input = open('./splitted.txt', 'r', encoding='utf-8')
model = markovify.NewlineText(input.read())
sentence = model.make_sentence()
# 文章は分かち書きで出力されるのでスペースをトリミング
print(sentence.replace(" ",""))
input.close()
では、いよいよgenerate.py
を実行して文章を自動生成してみましょう。
C:\dev\python\markov>py generate.py
神奈川県で聖地巡りしたいもっともっとフィルタリングしたんだよ…
C:\dev\python\markov>py generate.py
誰か詳しい人の積みプラというものを愛せるようになるバッグ
C:\dev\python\markov>py generate.py
旅行の写真は粗が見えないかな
うん。いい感じですね。
文章はちょっとハチャメチャ感がありますが、お遊びで作るbotには逆に可愛げがあって良いでしょう。
これをベースにしておもしろいbotを作って遊びましょう。
参考資料