9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

マルコフ連鎖で文章を自動生成する【Python+MeCab】

Posted at

目的

自動で何か喋ってくれる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を使って単語を分かち書きにします。

splitted.py
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を使ったコードを書きます。

generate.py
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を作って遊びましょう。

参考資料

9
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?