マルコフ連鎖による文章自動生成
ちょっと文章の自動生成に興味が湧いたので、試してみることにしました。まずは事前調査したところ、既にやっている例がたくさんみつかりました。記事末の参考リンクにまとめましたので興味ある方は参照ください。Deep Learningやマルコフ連鎖を使うのがトレンド(?)のようです。本当はDeep Learningでやってみたかったのですが、何度か環境変えてチャレンジしたのですが、悉くエラーが出て失敗したため(chainerのバージョンアップの影響?)、諦めてマルコフ連鎖で実現することにしました。マルコフ連鎖に関してはここでは詳細は説明しませんので、興味ある方は自分で調べてみて下さい。自分もちゃんと理解できませんでした。イメージ的には、元となる文章の文章の流れのようなものを解析して、その解析した流れを元に、ある単語から順番に連想ゲームのように単語を並べていって文章を生成する感じかな?
今回使用したのは、ともっくすさんが開発されたTextGeneratorというプログラムです。
このプログラムそのままでほぼできてしまうのですが、テキストをプログラムにベタ書きするのと、生成する文章の数が固定だったのがちょっと使いにくそうだったので、forkしてテキストファイルを読み出す機能と、コマンドライン引数で文章数を可変できるよう自分で改造してみました。改造したプログラムは以下です。
マルコフ連鎖を用いた文章自動生成手順
以下Mac、Raspberry Piでの文章自動生成の手順を記載します。Linuxは未確認ですが、Raspberry Piとほぼ同様の要領でできると思います。
MeCabセットアップ
事前にMeCabというライブラリをpythonから使えるようにセットアップしておく必要があります。Macの場合とRaspberry Piで異なるので、それぞれの例を記載します。
Macの場合
Homebrewを使ってMeCabをインストールします。Homebrewに関しては以下参照下さい。
ターミナルから以下実行してください。
$ brew install mecab $ brew install mecab-ipadic
以下でmecabを起動して、適当な文字入力して動作したらMeCabのインストールはOKです。
$ mecab
例えばからあげ
と入力すると以下のように表示されます。
からあげ から 助詞,格助詞,一般,*,*,*,から,カラ,カラ あげ 動詞,自立,*,*,一段,連用形,あげる,アゲ,アゲ
続けてMeCabをpythonから使えるようにするためのpythonのバインディングをセットアップします。pythonはMacからデフォルトで入っているpython2を想定しています(python3では動きません、すみません)。
pythonはpyenvを使った仮想環境に環境を構築しても問題ありません。pyenvを使いたい場合は、以下記事参照下さい(pyenvに興味が無い、良くわからないならここは飛ばしてもOKです)。
pythonの準備ができたら、以下サイトからmecab-python-0.996.tar.gz
をダウンロードしてください。
続いて、以下を実行すればMeCabをpythonから使えるようになります。
$ pip install mecab-python-0.996.tar.gz
pythonで以下のようにmecabをインポートしてエラーが出なければ問題ありません。
$ python
>>> import MeCab
Raspberry Piの場合
以下記事を参考に基本的なセットアップを完了させます。
あとは、以下コマンドでMeCabのセットアップは完了です。
$ sudo apt-get install update $ sudo apt-get install mecab $ sudo apt-get install libmecab-dev $ sudo apt-get install mecab-ipadic-utf8 $ sudo apt-get install python-mecab
ソフトのセットアップ
まずターミナルで以下コマンドでプログラムをclone(コピー)します。
$ git clone https://github.com/karaage0703/TextGenerator.git
$ cd TextGenerator
あとは元となる文章を用意して下さい。自分のメールの文章とか、青空文庫とかの文章を等好きな文章をコピーして例えばsample.txt
というファイル名に保存して以下コマンドを実行して下さい。
$ python PrepareChain.py sample.txt
これで元となる文章の解析が終わり、データベースファイルが作成されました。後は、以下コマンドを実行するたびに文章が自動で生成されます。GenerateText.py
の後の数字は文章数を表します。生成したい文章の長さに合わせて調整して下さい。
$ python GenerateText.py 10
文章自動生成例
例えば、フミコフミオ (id:Delete_All)先生の人気記事の以下の文章で実施した例です。
会社で起こるんじゃない、現場では月末会議で吊し上げにあい、幹部の前で社訓を絶叫させられていた。「事件は会議室じゃない、現場で起こるんじゃない、現場で起こってるんだ!」という発言に嫌な予感がしたばかりの新規取引見込先の担当者にばったり会った。「事件は会議室で起こるのだ。風呂桶の栓をせずにお湯を垂れ流し続け、オヤジに顔が変形するほど殴られた苦い記憶が蘇って吐き気。そこで人事に頼み込んで新人を中途採用していたのもある。
その事件が些細なものであれ、退職につながるような深刻なものであれ、退職につながるようなやり取りが連日繰り返されていたのは「退職」「本日です。ピンクチョッキ君は「申し訳ありません」「本日です。残念ながら《ほとんどの事件は現場で起こってるんだ!」という映画の台詞があったがまったく当たりがない。採用の決め手になってしまった。きっつー。
すごく、フミコフミオです…これで誰でも憧れのフミコフミオ先生っぽい文章が書けるね!
元となる文章の抽出
ただ、フミコフミオ先生の文章使うのも、ちょっと申し訳ないので自分の文章を使うことにしました。文章の選定は集合知であるはてなブックマークに頼ることにします。つまり、ブックマーク数が多いものを10記事ほど選定します。はてなブックマークのトップページにいって、自分のブログのURLで検索するとブックマーク多い記事が出てきます。
ただ、プログラム関係の記事だとコマンドの羅列になってしまいイマイチだったので、極力文章の多い記事を手作業で抜き出しました。ここで、自分が最近プログラム関係の記事や、写真貼って一言ばっかで全然文章を書いていないという驚愕の事実に気づく。いや、知ってたけども。
後は、ベースとなる文章をブログから抜き出す場合、記事だけたくさんコピぺするの大変なので、少しだけ自動化しましたので手順をメモっておきます。
以下のツールを使用します。
以下でインストール
$ sudo pip install readability-lxml
あとは、以下コマンド実行すればブラウザ上に抽出された本文が表示されます。
$ python -m readability.readability -b -u http://karaage.hatenadiary.jp/entry/2014/12/20/115252
ただ、これでも写真へのリンクとか、手作業で削除する作業必要で、大量に抜き出すならもっとインテリジェントな方法が必要になりそうです。
自動生成した記事でブログ作った
実験的に新しいブログを作ってみました。1日100記事とかいてあるカテゴリの記事は、全て自動生成した記事で、はてなブログの投稿上限である100記事を毎日実験的に更新しています。
自動生成だけど、なんか自分の文章っぽくてちょっと笑いました。
はてなへの投稿は、「post-hatena」という自作の投稿スクリプトと、簡単な自動投稿スクリプトを用いて自動化しています。
以下面白かった文章を紹介します。
そして、はてなTシャツゲットとはてなオフィスへの訪問を実現するぞ!おー!」といいます。
めちゃくちゃいいそうw
ウォズさんの凄さが分かるといいながら答えだけ書いています。pngとかでも保存できます。あとはお待ちかねの(退屈な?ソフトと関係ないところで時間かかりましたw超オシャレ!一番はやはりお金でしょう。こんにちは、はてなさん。できる男として基本ノートをみれば、はてなブログも4年は安定してくれるような気がします。
意味不明だけど、なんかそれっぽい。あと、タイトルが秀逸。
反省点
元の文章にはてなidが紛れていたので、何人かの人にめっちゃ迷惑かけてしまいました。元文章からリンクとか、はてなidは消したほうがよいです。気をつけましょう。
からあげ先生のテキスト自動生成ぽい電波ブログでめっちゃ私の名前とIDが連呼される事案が発生中w
— OKP (@iamadog_okp) January 17, 2016
あと、はてなの新着に乗り続けるのも凄い申し訳ない気がするので、基本的にはスクリプト使って一気に100記事投稿するようにしました。
まとめ
これでブログの記事をいくらでも自動生成できるようになりました。とりあえず1000記事くらい投稿してみてどうなったか結果を紹介してみようと思います。正直今の技術だとディープラーニングを用いても自動での文章生成はまだまだという感じなのですが、今後シンギュラリティを迎えて、例えばフミコフミオ先生の文章を元に、本物に限りなく近い文章を自動生成できるようになったとして、その文章の著作権は誰のものになるのでしょうね?今後、そんな問題が多くなってくるのかもしれません。ただ、今の技術の延長線だと難しそうなので、いくつか技術的なジャンプが必要そうですが。
もともと自分がブログに自分に関する情報をアップロードし続けている理由の一つとして、ネット上に仮想的なもう一人の自分を構築することなので、自分が死ぬまでに技術が確立されて、バーチャルアイドルとしてネット上に輪廻転生できればよいかなと思っています。
追記(2016/02/01)
はてなブログで12日で1000日投稿したら恐ろしいことになりました。試してみようと思っている人は、まず上記記事を読むことをお勧めします。
関連記事
変更履歴
- 2017/11/29 Pythonに関して追記
- 2017/01/13 MeCabセットアップ方法、関連記事追記