【python入門】マルコフ連鎖の簡単な文章作成
こんにちは。
今回はPythonでMecabの形態素解析・markovifyのマルコフ連鎖で簡単な自動作文をしようと奮闘中です。
とりあえずwikiから最近の語句で自動作文してみました。
◾️環境
・Jupyter notebook
・MeCabをpipインストール済み
・markovifyをpipインストール済み
1.インストールしたライブラリ
2.マルコフ連鎖とは
3.形態素解析やってみた
4.マルコフ連鎖やってみた
→wikiから自動作文した結果
1.インストールしたライブラリ
◾️MeCab
形態素解析のライブラリです。
taku910.github.io
($ pip install mecab-python3 でmecab-python3をインストールしています。)
◾️markovify
マルコフ連鎖のライブラリです。
github.com
2.マルコフ連鎖とは
マルコフ連鎖は、未来の挙動が現在の値だけで決定され、過去の挙動と無関係である(マルコフ性)。各時刻において起こる状態変化(遷移または推移)に関して、マルコフ連鎖は遷移確率が過去の状態によらず、現在の状態のみによる系列である。特に重要な確率過程として、様々な分野に応用される。
(wikipediaより)
マルコフ連鎖 - Wikipedia
簡単に言うと、「私 は ネコ で ある」と「私 は イヌ で は ない」という文章から「私 は ネコ で は ない」など、形態素解析した結果からランダムに次に繋がる語ができるというイメージでしょうか。
うんうん。。
スペースで区切られているのがMeCabで形態素解析した1単語です。
元の文はこちら
ではやってみましょう。
(コードはmarkovifyのgithubのコードと先ほどのMeCabのコードの組み合わせです。)
同じ文が何度も、、
これは英語だと.(カンマ)で区切られているが日本語だと。句読点などを認識しないことによるらしいです。
また()や[]など特定の文字列を解析することでもmarkovifyが動かないようです。
Cannot combine Text models if they contain ()"'[] in the string · Issue #84 · jsvine/markovify · GitHub
そのためMeCabで形態素解析後 → markovifyでマルコフ連鎖で文を作成する前に、
それらの文字があれば削除し「。」の後に半角スペースを入れたり解析文を整えてあげないといけないようです。
しかし自分でごりごりコードを書くにはまだ至っていないので、こちらの方のコードを参考にさせていただき正規表現や排除文字のところを少し変更して再チャレンジしました。
qiita.com
◾️結果
「明日 は 早く 起き て ラジオ 体操 を し まし た が 、なかなか うまく いか ず 悲しい です 。」
あんまり変わっていなくて私が悲しいです。。
形態素解析はうまくいっているので、MeCabで作成された文章からマルコフ連鎖で自動作文するときにうまくいっていないようです。
wikiから「コロナ感染症」「鬼滅の刃」「ルパンの娘」の文章を繋げて元の文章を作成しても、マルコフ連鎖の結果がほぼ同じ内容(形態素解析したのに文単位で文章を作成してしまう)になり、ダメでした。
もう少し解析してみます☺️
【追記】
元の文章を増やすと良かったみたいです。それなりに変な文章が生成されました。
(wikiの「コロナ感染症」「鬼滅の刃」「ルパンの娘」「エヴァンゲリオン」「野球」「サブスプリクション」の”概要”だけ抜き取りました。文字数だと3924文字ほどです。)
◾️結果
”放送 時 の 視聴 率 は 低かっ た 上 に 、放送 終了 後 に は 、ヒト に 感染 する コロナ ウイルス HCoV 229 E 、HCoVOC 43 、HCoVNL 63 、HCoVHKU 1 による 感染 症 を 指す こと が ほとんど で ある 。”
”大 災害 「 セカンド インパクト 」 が 起き た 世界 2015 年 8 月 26 日 まで フジテレビ 系 木曜 劇場 で テレビ ドラマ 化 さ れ て いる 456 。”
”略称 は 鬼 滅 の 刃 きめ つ の チーム が 守備 側 と 攻撃 側 に 分かれ 、守備 側 の 打者 が バット で 打ち 、設置 さ れ た 。”