Pythonによる自然言語処理として今回はマルコフ連鎖を使って簡単に文章を生成してみます。
ワードサラダではどこかで使える文章ではないですが、順に自動作成の文章の質を上げていきましょう。
Contents
マルコフ連鎖とは
マルコフ連鎖とは、確率過程の一種であるマルコフ過程のうち、とりうる状態が離散的(有限または可算)なもの(離散状態マルコフ過程)をいう。また特に、時間が離散的なもの(時刻は添え字で表される)を指すことが多い(他に連続時間マルコフ過程というものもあり、これは時刻が連続である)。マルコフ連鎖は、未来の挙動が現在の値だけで決定され、過去の挙動と無関係である(マルコフ性)。各時刻において起こる状態変化(遷移または推移)に関して、マルコフ連鎖は遷移確率が過去の状態によらず、現在の状態のみによる系列である。特に重要な確率過程として、様々な分野に応用される。
マルコフ連鎖でどう文章を生成するのか
元となる文章を形態素解析でバラバラにします。
単語A~Fがあって
ABCADBCFと並んでいた場合
Aの次にはBまたはDが来る
Bの次にはCが来る
とある単語の次に来る単語が予測できる(頻度が高いほど確率が高い)
Aの次にC
AC
Cの次にA
ACA
ACABCF
というように与えた文章を元に生成する。
ある意味並び替えているようなものなので、与えた文章が短いとほぼ同じになってしまう。
単語の並びをペアとして保持していけば自力で行えるが、今回はライブラリでさくっと行う。
用意するもの
Python実行環境
Pythonで行うので当然必要です!
MeCabをPythonから使えるようにする
- mecab
- mecab-python3
形態素解析を行うのに使います。
markovify
Pythonマルコフ連鎖生成ライブラリです。
jsvine/markovify
pipで入れちゃう。
$ sudo pip install markovify
元となる文章
好きな文章を用意しましょう!
ある程度の長さがあったほうがいい。
自分で作成するのでもどっかからコピってくるのでも、スクレイピングでひっぱてくるのでも。
実際に文書を生成する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import markovify # Get raw text as string. with open("/path/to/my/corpus.txt") as f: text = f.read() # Build the model. text_model = markovify.Text(text) # Print five randomly-generated sentences for i in range(5): print(text_model.make_sentence()) # Print three randomly-generated sentences of no more than 140 characters for i in range(3): print(text_model.make_short_sentence(140)) |