Markovify + Mecabによるマルコフ連鎖を使った文章生成

 Python勉強開始から2月と20日が経過。

空白期間を簡単にまとめる

  • Raspberry pi 3 Model B を購入。
  • Rasbian をインストールし Linux 系 OS を弄り回す。
  • Raspberry pi とメインの Windows マシンを SSH 接続(MobaXtermを使用)。
  • Flask , Bottle とngrokの組み合わせでRaspberry piをサーバー的に使う実験。Flask + ngrokで"Hello,world !" をページ表示に成功
  • Google homeRaspberry pi の連携にチャレンジするが web 周りの理解が足りず一時撤退。
  • ひとまず chainer をインストール。PaintsChainer をオフラインで実行可能になる。
  • GitHub、仮想環境の理解を深める。

特にLinux 系 OS のファイル操作やターミナル周りについて初めて知ることばかりでWindows を避けて、LinuxMac で開発環境を整える人の気持ちがうっすらと理解できるようになった。

寄り道のすえに当初の自然言語処理に回帰する

 といわけでMarkovify と Mecab で文書生成に挑む。

Markovifyとは、マルコフ過程を用いて連鎖的にテキストを生成する。基本英語。

Githubhttps://github.com/jsvine/markovify

 

MeCabとは、日本語テキストの形態素解析エンジン。分かち書きされてない日本語を要素ごとに分割し品詞まで割り出してくれる。ありがたい。

http://taku910.github.io/mecab/

 

mecabPython上で操作するのでPython3用ライブラリをインストール。

https://github.com/SamuraiT/mecab-python3

 

専用の仮想環境を用意して pip インストールを試みるがSSL接続関係のエラーが出て、pip インストールが不能になり、いろいろ試したが復旧せず。

anaconada の仮想環境で無理やりインストール。conda と pip の競合ではないかという疑いもあるが早く解決したい。

そうこうしているあいだにMeCab 以外にもPythonと相性がよさそうな自然言語処理ライブラリ「GiNZA」が登場。

https://megagonlabs.github.io/ginza/

ひとまず先行事例が多い MeCab で進める。

 

 英語テキストならばこれだけで解析と生成ができる。アメリカ独立宣言を使ったものだがいかんせん、ニュアンスが正しいのかすらわからない。日本語の生成文を見る限り文法的にはいい線を言ってるがどこか不自然な文章なはず。

 日本語の場合はスペースでの分かち書きされていないので、解析がうまくいかずテキストの生成もNoneがずらずらと並ぶ。 MeCab による分かち書きがここで活きてくる。青空文庫の小説と、自分が書いた文章をサンプルにMarkovify + Mecab での文章生成を確認できた。

会話文、地の文の判定あるいは話題について

 会話文と地の文で構成されるテキストの場合、解析で見分けておらず結果としてランダムに生成されそれが違和感につながっている。本来なら会話文と地の文は別個に学習させたうえで生成するのが正しいはず。

 Markovify の場合、異なる解析モデルを結合して任意の比率で出力させることが可能である。例えばアメリカ独立宣言書とアメリカ国歌の歌詞をミックスして出力することもできる。

 今後の方針として、特定の話題についての文章を生成する余地を探りたい。Markovify ではサンプルテキストが言及している範囲に限定されている。サンプルの数を増やし学習させるだけでなく、単語の特徴をベクトルに変換することで単語を数式的に足し合わせたり引いたりすることが可能になる word2vec などを用いることを考えている。