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 などを用いることを考えている。

体調を崩す

 ようやく体調が戻ったので勉強を再開すると言い訳をしておく。

体調不良を押して書きたかったこと

  • 日本の警察がプログラム、ネットワーク技術について無知であるほど不正指令電磁的記録罪に問われる犯罪者数は増加する。
  • 高い検挙率、犯罪検挙数は、警察が優秀であることを示す。
  • 日本の警察はプログラムおよびネットワーク技術について無知であり続けることによって、自らの優秀さを証明する。

不正プログラム書き込み疑い補導|NHK 兵庫県のニュース

最後に

  • 例外は、犯人が警察内部に存在したときである。

警官をストーカーで懲戒処分 警察情報で住所割り出す:朝日新聞デジタル

引き続き、テキストを使った Python 勉強中

 Python勉強開始からほぼ一ヶ月が経過。

前回に引き続き、『いちばんやさしいPythonの教本』を 進める第8章を終えて、残すは9章のみだが、webアプリケーションの章なのでスキップする。

10日間にやったこと

  • Wikiextractor で下処理したデータから a タグでリンクを張られたワードが削除されていたので、設定を見直した。リンクを保持するだけでなく JSON データで出力する設定があることが判明する。JSON データの取り扱い方を勉強する。
  • 仮想環境を構築して、パッケージをインストール。仮想環境でインストールしたパッケージが、本環境で適用されないことを確認。仮想環境にも Jupyter Notebook をインストールする。Anaconda Navigator で少しズルをする。
  • というのも conda での activate が上手くいかなかった。この辺りは改めて調べる。

次にやりたいこと

  • いよいよ、Wikipedia の文章を元に自動生成に取りかかる。
  • まずはマルコフ連鎖。つぎに RNN か LSTM を目標にする。
  • CUDA での学習にも挑戦したい。手持ちの GeForce は非力なので、ゲーミング用の RADEON を使うことも考える。

今日はここまで。

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

 

 

必要なWikipediaの項目から本文を抽出する

 Python勉強開始から20日が経過。
『みんなのPython』を必要な箇所をひとまず終えたので、Wikipediaのデータ加工に取り組む。

手順

  • テキストデータが膨大なので、”doc id”(Wikipediaの項目ごとに与えられるID)と”タイトル”だけを抽出したインデックスを作る。
  • インデックスから「~の人物一覧」というワードを含む項目を抽出すると、"doc id"のリストとなる。
  • 元データと”doc id”を照合し、必要な項目の本文を引っ張ってくる。

 大きく分けて2つのステップがあるが、仕組みとしてはかなり似ている。元となるデータから項目タイトルだけを抽出しインデックス化するコードを書く。それを改造し、”doc id”のリストを読み込ませ、元データから一致する”doc id”本文を引っ張ってくる。

コード(一部のみ)

"list_text" がWikipediaのデータをPython上で読み込んで list に格納したもの。
"id_list" はタイトルに「~の人物一覧」というワードを含む項目の"doc id"リスト。
ステップごとに分割しているので、ひとまとまりにはなっていない。
Pythonの場合、個々のブロックをモジュールとして読み込ませれば、まとめられるはずだが試していない。

#定義ブロック、引数 id を与えると、リスト list_text からWikipediaの本文を呼び出す
def search_id(id):
    newlist=[]
    for l in list_text:
        if str(id) in l: #引数 id をstr型に変換しリスト l と照合
            return l

#IDのリストを元に、必要な要素を抽出し result に格納
result =[]
for i in id_list:
    s = search_id(i)
    result.append(s)

#リストを結合し書き込み用の文字列へ
save_s = ",".join(map(str,result))

#出力を保存
f_out = open("./test/result.txt","w","utf-8")
f_out.write(save_s)
f_out.close()

反省と課題

  • for 文をいっぱい書いた。内包表記が処理速度が速くて簡潔だというがまだ荷が重い。
  • "doc id"をkey に"本文"をvalue にした辞書ならもっと高速化出来るのではないか。
  • ステップごとに一旦txtに書き出し、書き出したものを読み込ませるという風に組んでいる。動作確認がやりやすいが、エンコードの問題でエラーが出る。codecs のimport で一応解決したが、都度書き出しは止めたい。

 一旦、Wikipediaデータの加工はここまでにして、再び座学に戻る。
次のテキストは『いちばんやさしいPythonの教本』


いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

いちばんやさしいPythonの教本 人気講師が教える基礎からサーバサイド開発まで (「いちばんやさしい教本」シリーズ)

みんなのPython 第4版

みんなのPython 第4版

学習元データとなるWikipediaデータの下処理(ファイル操作と記事タイトル抽出)

 Python勉強スタートから約10日が経過。

 『みんなのPython』をもとに基礎学習と並行して、Wikipediaのダンプデータの下処理に挑戦。

 ダウンロードしたダンプデータはすでにwikiextractorを利用して最低限の整形が行われている。テキストファイルで2ギガほどあり、記事タイトルを確認するだけでも大変なので、タイトルから必要なデータと不必要なデータを分別する。

 各項目の一行目は"doc id","URL","TITLE"という風にならんでいるので”doc id”と"TITLE"だけを抽出して簡単な目録にする。

コードを貼り付ける方法をあとで調べる。

引用だとインデントが崩れてしまう。

 1,134,133項目のタイトルを抽出できた。コードを書いてる時間と実際の処理実行にかかる時間の落差に愕然とするが、手作業で行った場合、途方もない時間が掛かることは間違いなく、これで数百倍の生産性アップであることは間違いない。プログラミングの力、すごい!

 Wikipediaの記事の利用方法についてだが、

  • 人物紹介のみを学習させ、架空のキャラクター紹介を自動生成。
  • あらすじのみを学習させ、架空のあらすじを自動生成。

というようなことをまずは試すつもりである。

 歴史上の人物や小説、アニメなどの人物をどういう振り分けにするかなどはまだ考えていないが、フィクションに寄せていく方がよいのではないかと考えている。

 自動生成してみた系の事例を読んでみると、自然な文法に則していないまま生成された文章で、現実に即したワードや話題について読まされると、いまひとつ弾けきれない印象を受ける。

 文体としてはめちゃめちゃなのは構わないが、選択されたワードや話題がよく見知っているだけに読み手の想像力を制限する気がするのだ。自動生成による得体の知れない文体で、先入観に染まっていない架空の人物や出来事について読んでみたいのである。

 

みんなのPython 第4版

みんなのPython 第4版

 

 

Python勉強中(ほぼ一週間経過)

Pythonの勉強を始めた。

Pythonでやりたいこと

  • 機械学習で文章の自動生成(自分が書いた物を学習、生成したものを手直ししてさらに学習させるとか)
  • Ren'pyでノベルゲームを作る(日本語ではあまり情報がなさそう)
  • 集めた資料の編集や出力を自動化、あるいは省力化(Googleドキュメントを利用したスキャンデータのOCR自動化、すぐに出来そうな気がする)

現在の学習状況

  • Python 3.7をインストール。
  • Wikipediaの人物紹介からキャラクター紹介を自動生成しようと試みるがコードが読めないので頓挫。
  • 基礎から始めることにする。
みんなのPython 第4版

みんなのPython 第4版

 

 『世界で一番簡単なPython~』を5章まで終える。次の章がインターネットに関する内容なので中断し、『みんなのPython』に移る。現在、チャプター4まで到達。

 『世界で一番簡単なPython~』は公式のPythonAtomを使っていたが、『みんなのPython』ではAnacondaが前提になっていたので環境を入れ直した。

 バイク川崎バイクのネタをリスト化し、ランダムに出力するプログラムが出来てテンションがあがる。

今日はここまで。