[[ともっくす alloc] init]

ともっくすの雑多な日記と技術的なメモ

Pythonリハビリのために文章自動生成プログラムを作ってみた

最近、PHPばかり触っていて、Pythonのことを忘れかけていたので、Pythonで何か作ることにした。

特に深い理由も無いが、ジェネレータ的な何かが作りたいと思って、文章の自動生成プログラムを作ることにした。

文章自動生成プログラムとは

元データを与えて、マルコフ連鎖を使うことで、元データとは異なるが、だいたい意味の通じる文章を生成するプログラム。

マルコフ連鎖とは、確率過程の一種であるマルコフ過程のうち、とりうる状態が離散的(有限または可算)なもの(離散状態マルコフ過程)をいう。また特に、時間が離散的なもの(時刻は添え字で表される)を指すことが多い(他に連続時間マルコフ過程というものもあり、これは時刻が連続である)。マルコフ連鎖は、未来の挙動が現在の値だけで決定され、過去の挙動と無関係である(マルコフ性)。各時刻において起こる状態変化(遷移または推移)に関して、マルコフ連鎖は遷移確率が過去の状態によらず、現在の状態のみによる系列である。特に重要な確率過程として、様々な分野に応用される。

マルコフ連鎖 - Wikipedia

つまり、現在が決まれば未来が決まり、過去は関係無いということ。

どのように利用するかと言うと、「マルコフ連鎖による文章の自動生成 - delirious thoughts」がわかりやすいかもしれない。

とりあえず、Pythonリハビリのために、マルコフ連鎖を使って、ごにょごにょして、文章自動生成プログラムを作りましたという話。

実際のプログラムはこちら > o-tomox/TextGenerator · GitHub

使い方

まずは、マルコフ連鎖のための事前準備を行う。

from PrepareChain import PrepareChain
text = u"適当な長い文章。長い文章。"
chain = PrepareChain(text)
triplet_freqs = chain.make_triplet_freqs()
chain.save(triplet_freqs, True)

これで、事前準備完了。

事前準備さえできていれば、あとは文章が作り放題となる。

下記のように実行するだけ。

from GenerateText import GenerateText
generator = GenerateText()
print generator.generate()

実行してみる

元データとしては、檸檬が爆発することで有名な、梶井基次郎『檸檬』を使用させていただいた。梶井基次郎 檸檬

その結果の一例としては、以下の通り。

しかし私は変に緊張してもよそよそしい表通りよりも熱かった。そして私は街の上の私自身を慰めるために手の握り合いなどをした。がその時の私自身を慰めるのだ。以前私を追いたてる。あのびいどろの味ほど幽かな涼しい味があるように思えた。

なんとなくできている。

元データが少ないので、ほとんど原文に近いが、こんなもんでしょう。



簡単なリハビリ終了ー

Homebrewでmecabをインストールしたいし、ついでにpythonでも使いたい

mecabのインストール

まず、mecabmecab-ipadicをインストールする。

$ brew install mecab
$ brew install mecab-ipadic

mecab-ipadicは、辞書、みたいな。

mecabのバージョンを確認しておく。

$ mecab -v
mecab of 0.996

バージョンは0.996ということがわかる。

練習。

$ mecab
今日は楽しい運動会
今日	名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
楽しい	形容詞,自立,*,*,形容詞・イ段,基本形,楽しい,タノシイ,タノシイ
運動会	名詞,一般,*,*,*,*,運動会,ウンドウカイ,ウンドーカイ
EOS
^C

pythonで使えるようにする

このサイト(Downloads - mecab - Japanese morphological analyzer - Google Project Hosting)からmecab-python-****.tar.gzをダウンロードする。
この、****の部分には、上で確認したバージョンが入る。
つまり、今回は、mecab-python-0.996.tar.gz。
wgetで適当な場所にダウンロードする場合のやり方。

$ wget https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz
$ pip install mecab-python-0.996.tar.gz

直接でも大丈夫。

$ pip install https://mecab.googlecode.com/files/mecab-python-0.996.tar.gz

以上。

gitで過去の全てのAuthorとCommitterを変えたい

gitでuser.nameとuser.emailを変えずにそのまま続けていて、githubに上げたときにいろいろと悲しくなるので、全部一気に変えたい。

直前のコミットを変更するのは、たくさん情報があるけど、全部一気に変えるのはあまりなかったので、備忘録的に。

git filter-branch --tag-name-filter cat --env-filter "
  export GIT_AUTHOR_NAME='新しい名前';
  export GIT_AUTHOR_EMAIL='新しいメール'
  export GIT_COMMITTER_NAME='新しい名前';
  export GIT_COMMITTER_EMAIL='新しいメール'
" -- --all

上記を実行すれば、全ての情報を書き換えられる。多分。

macでpyenvの環境を整えたい

しばらく前にmacを新調したけど、開発環境を全然構築してなかったので、重い腰を上げてやってみる。

これまでは、pythonの開発環境を切り替えるのにvirtualenvを使ってきた。
Pythonの仮想環境 virtualenvとvirtualenvwrapper - [[ともっくす alloc] init]

でも、いろいろ調べてたら、pyenvの方が良いっぽい。

事前準備

pyenvのインストール

Homebrewでpyenvをインストール

$ brew install pyenv

それが成功したら、以下を.zshrc(.bashrc)に追記。

export PYENV_ROOT="${HOME}/.pyenv"
if [ -d "${PYENV_ROOT}" ]; then
    export PATH=${PYENV_ROOT}/bin:$PATH
    eval "$(pyenv init -)"
fi

pyenv-virtualenvのインストール

Homebrewでpyenv-virtualenvをインストール
pyenv-virtualenvはpyenvのプラグインで、pyenv内でvirtualenvが使えるような感じ。

$ brew install pyenv-virtualenv
続きを読む

リアル脱出ゲームと進撃の巨人のコラボ企画「ある城塞都市からの脱出」に参加したよ

先日、友達4人と、進撃の巨人×リアル脱出ゲーム ある城塞都市からの脱出に参加してきた。

調査兵団を目指す訓練兵となって、謎を解き、脱出を目指す。

f:id:o_tomox:20140705162209j:plain


これまでは大学の友達と脱出ゲームに参加してきたが、今回は初めて会社の同期と参加してきた。


これまで全敗なので、今回こそは脱出したい!

と、思っていた時期が私にもありました...


結果、なんの成果も!! 得られませんでした!!


つらいよ。全敗記録更新中だよ。

f:id:o_tomox:20140705141223j:plain

f:id:o_tomox:20140705141103j:plain


つ、次こそは...

リアル脱出ゲームと名探偵コナンのコラボ企画「オリエント急行からの脱出」に参加したよ

先日、友達4人とリアル脱出ゲーム×名探偵コナンFILE.2 オリエント急行からの脱出に挑戦してきた。

東京に来てから初めてのリアル脱出ゲーム。

f:id:o_tomox:20140607182835j:plain

前に参加した、夜の遊園地からの脱出は大規模で基本的には個人戦で、魔王城から脱出パズルルームからの脱出は小規模で10人限定のチーム戦だった。

そして、今回のオリエント急行からの脱出は、中規模で6人のチーム戦。ただし、他のチームも一緒に謎を解く。こういう形式だった。

で、友達4人で参加したため、後の2人は初対面だった。それも、中学生。でも、いい子たちで良かった。とても活躍してたし。

こういう形式の脱出ゲームの場合は、参加人数に気をつけた方がいい。


さて、今回参加した、オリエント急行からの脱出はどんな感じかというと、こんな感じ。

終着駅は、真実か死。
都心と高級リゾート地を結ぶ豪華列車「オリエント急行」。
あなたは、休暇を楽しむためにそれに乗り込んだが、突然列車が何者かによってジャックされた!
列車には爆弾が仕掛けられており、終着駅に到着するまでに解除しないと爆発する。
到着まであと一時間。
しかし、列車に仕掛けられた謎を解き明かさないと、爆弾を解除することは出来ない!
さああなたは、偶然乗り合わせた名探偵コナンとともに、この謎を解き明かすことができるだろうか??

リアル脱出ゲーム OFFICIAL WEB SITE | リアル脱出ゲーム×名探偵コナンFILE.2 オリエント急行からの脱出 - 公演情報

謎を解いて、爆弾を解除する。

コナンっぽい。ちなみに、コナン好きです。


はい、そして、結果は、爆死です。


もう、全敗です...

そろそろ脱出したい...


まあ、今回もやはりいいゲームでした。

やっぱり、惜しいんだよね。

もう少しなんだよね。


次こそは、と思っているけど、実はもうこの記事を書いているときには次の脱出ゲームに参加してきた後だったりする。

さあ、結果はどうだったのか、乞うご期待!?

f:id:o_tomox:20140607184804j:plain

Pythonで文字列と日付の相互変換をしたい

Pythonでstring型からdatatime型、もしくはその逆を実現する方法。

よく忘れるので、備忘録的に。

string型からdatetime型

from datetime import datetime

date_str = "2014-04-01 11:11:11"
date = datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S")

datetime型からstring型

from datetime import datetime

date = datetime.now()
date_str = date.strftime("%Y/%m/%d %H:%M:%S")

書式化コード

「%?」の指定の仕方。

%d 月中の日にちを10進表記した文字列 [01,31] を表示します
%f マイクロ秒を10進表記した文字列 [000000,999999] を表示します (左側から0埋めされます)
%H 時 (24時間表記) を10進表記した文字列 [00,23] を表示します
%I 時 (12時間表記) を10進表記した文字列 [01,12] を表示します
%j 年中の日にちを10進表記した文字列 [001,366] を表示します
%m 月を10進表記した文字列 [01,12] を表示します
%M 分を10進表記した文字列 [00,59] を表示します
%p ロケールの AM もしくは PM を表示します
%S 秒を10進表記した文字列 [00,61] を表示します
%Z タイムゾーンの名前を表示します (オブジェクトがnaiveであれば空文字列)
%% 文字 '%' を表示します

Herokuのサイト上でアプリ名を変更したら端末上で何もできなくなった

Herokuでアプリケーションを作ってたら、アプリケーション名を途中から変えたくなるときがある。

で、ちゃんとコマンドを使えばいいんだけど…

$ heroku rename new-app-name

こんな感じで。

Herokuのウェブサイト上でもアプリ名を変えられるので、ちょいと気軽に変えてしまう。

てか、変えてしまった。

そしたら、herokuコマンドとか使うときに怒られる。

その対応策。

$ git remote rm heroku
$ git remote add heroku git@heroku.com:new-app-name.git

こんな感じ。

アプリ名を変えた後は、こうすれば大丈夫。

Heroku上でFlaskを動かしたい

諸事情があって、Webアプリケーションを作ることに。

どうせなら、ちょっとは慣れているFlaskで作りたい。

でも、訳あって自分のサーバは使いたくないし、一時的なものだし…

ということで、Heroku上でFlaskを動かしたい。


アカウントの取得とToolbeltのインストール

Herokuのトップページに行き、アカウントを作成する。

メールアドレスをいれるだけ。簡単。

そして、ここからHeroku Toolbeltのパッケージをダウンロードして、インストール。簡単。

こうすることで、herokuコマンドが使えるようになる。


環境設定

作業ディレクトリをheroku_testとする。

virtualenvで環境をつくる。

そして、pipでflask、gunicorn、psycopg2、flask-sqlalchemyをインストール。

gunicornはデプロイ用。不要なら不要。

Herokuは無料でPostgresqlが使えるので、アダプタとしてpsycopg2。

ORMとして、flask-sqlalchemy。不要なら不要。

インストールが終わったら、必要なモジュールをrequirements.txtに書き出しておく。

こうすることで、Herokuにデプロイしたときに自動でインストールしてくれる。

$ mkdir heroku_test
$ cd heroku_test
$ mkvirtualenv env-heroku
$ workon env-heroku
$ pip install flask, gunicorn, psycopg2, flask-sqlalchemy
$ pip freeze > requirements.txt
続きを読む