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のインストール
まず、mecabとmecab-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人と、進撃の巨人×リアル脱出ゲーム ある城塞都市からの脱出に参加してきた。
調査兵団を目指す訓練兵となって、謎を解き、脱出を目指す。
これまでは大学の友達と脱出ゲームに参加してきたが、今回は初めて会社の同期と参加してきた。
これまで全敗なので、今回こそは脱出したい!
と、思っていた時期が私にもありました...
結果、なんの成果も!! 得られませんでした!!
つらいよ。全敗記録更新中だよ。
つ、次こそは...
リアル脱出ゲームと名探偵コナンのコラボ企画「オリエント急行からの脱出」に参加したよ
先日、友達4人とリアル脱出ゲーム×名探偵コナンFILE.2 オリエント急行からの脱出に挑戦してきた。
東京に来てから初めてのリアル脱出ゲーム。
前に参加した、夜の遊園地からの脱出は大規模で基本的には個人戦で、魔王城から脱出やパズルルームからの脱出は小規模で10人限定のチーム戦だった。
そして、今回のオリエント急行からの脱出は、中規模で6人のチーム戦。ただし、他のチームも一緒に謎を解く。こういう形式だった。
で、友達4人で参加したため、後の2人は初対面だった。それも、中学生。でも、いい子たちで良かった。とても活躍してたし。
こういう形式の脱出ゲームの場合は、参加人数に気をつけた方がいい。
さて、今回参加した、オリエント急行からの脱出はどんな感じかというと、こんな感じ。
終着駅は、真実か死。
リアル脱出ゲーム OFFICIAL WEB SITE | リアル脱出ゲーム×名探偵コナンFILE.2 オリエント急行からの脱出 - 公演情報
都心と高級リゾート地を結ぶ豪華列車「オリエント急行」。
あなたは、休暇を楽しむためにそれに乗り込んだが、突然列車が何者かによってジャックされた!
列車には爆弾が仕掛けられており、終着駅に到着するまでに解除しないと爆発する。
到着まであと一時間。
しかし、列車に仕掛けられた謎を解き明かさないと、爆弾を解除することは出来ない!
さああなたは、偶然乗り合わせた名探偵コナンとともに、この謎を解き明かすことができるだろうか??
謎を解いて、爆弾を解除する。
コナンっぽい。ちなみに、コナン好きです。
はい、そして、結果は、爆死です。
もう、全敗です...
そろそろ脱出したい...
まあ、今回もやはりいいゲームでした。
やっぱり、惜しいんだよね。
もう少しなんだよね。
次こそは、と思っているけど、実はもうこの記事を書いているときには次の脱出ゲームに参加してきた後だったりする。
さあ、結果はどうだったのか、乞うご期待!?
UIViewの背景に画像を指定したい
タイトルの通り。
備忘録として。
self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"background.jpg"]];
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