PythonRenardこの記事は、traP夏のブログリレー29日目の記事です。はじめにこんにちは!皆さんはめちゃ面白い小説を読んだとき、「おもしろ小説書きて~」と思った事はありませんか?私は小説最近”三体”という凄まじく面白い小説を読んで「おもしろ小説書きて~」と思い、過去に全く同じことを思った過去の私が勢いそのままに『小説家になろう』へ小説を投稿していたのを思い出しました。それを読んでみたのですが、めちゃめちゃつまらなかったです。既存の文章をお手本にして新たに文章を生成する方法としてはマルコフ連鎖RNN(LSTM)GAN等色々ありますが、今回はマルコフ連鎖を用いて実装しようと思います。(最後のほうにチラッとLSTMの実装も置いておきます)﻿GANも面白そうなのですが、私の理解力が足らず断念しました。モデルの学習については小説投稿サイト”小説家になろう”から文章をお借りして学習データとします。出来るだけ意味の分かる文章が作れると良いですね実装なろう小説のサイトからスクレイピングによって小説本文を取得し、分かち書きして保存するモデルに学習させる構築したモデルを用いて文章を生成するといった流れで作っていきます。実装にはPythonを使用します。N階マルコフ連鎖モデルを作るを使用しましたこの記事で説明するコードは全てこのリポジトリにあります。小説本文のスクレイピング、分かち書きモデルの学習毎にスクレイピングをするとサーバーへ負担をかけてしまうので、目次ページURL、ページ数を入力すると分かち書き後、文章単位で改行された本文を保存してくれるスクリプトを作ります。(:〜~+=)/*&^%$#@!~`){}[]...\[\]\"\'\”\’:;<>?<>〔〕〈〉?、。pages_num)save_novel.py目次ページURL保存するページ数を入力し、実行するとsave/n2267be/1.txtのように各ページが保存されます分かりにくい部分の解説format_text(t)markovifyには読み込むとエラーを吐き出す文字があるので、それを除去する関数ですget_num_of_pages(url)小説の全ページ数を返します。"novel_honbun"})[0].findAll("p")によって一括で取得していますそしてformat_text(body.get_text())にて得られたフォーマット後の文章をtagger.parse(formatted)で分かち書きしています。+'\n'と改行を加えているのは後に使用するmarkovify.NewlineText()メソッドに形式を合わせる為です。状態履歴の数:2生成する文章の最大文字数:100生成する文章の最小文字数:15生成する文章の数:100生成する文章の最初の言葉:none途中で俺が臭いと一瞬で踵を返してくれるらしいんだそう...ほうれんそうはキッチリと謝っておきたいんだが彼の逆鱗に触れた律儀だね暖房が完備されても呪いは消えない確かにおまけ(LSTMを使用した方法)ソースコードはこちらtensorflowkerasnumpyMeCabを使用しています。保存された本文データをもとにLSTMモデルを構成しているので、マルコフ連鎖モデルと同じように目次ページURLを入力して実行します。実行中この様にEpochが進むごとに学習が深まっていきます。メモリが足りない私の実装では単語数を25000語に制限しています。boolとNumpy配列でMemoryErrorが出ます。これはより効率的な実装をすることで回避できそうな気はします....まとめ思ったより文章っぽい文章が生成出来て満足ですみんなもマルコフ連鎖を使ってなろう小説を書こう!明日は@d_etteiu8383さんの記事です。VRChatの始め方、歩き方。