ささみろぐ

チラシの裏

天海春香さんと会話したい 20

f:id:sasamijp:20151126233453p:plain

グラフの出し方があまりよくない気がするが、これは返答発言に含まれる名詞数を表したものである。

f:id:sasamijp:20151126234923p:plain

返答発言の名詞数が10を超えたものを抽出した。こういった感じの返答は往々にして「変な返答」になってしまう。一定の基準でコーパスからこういったセットを取り除かなければならない。

名詞数に制約を設けたところ、28214 → 16726 と減少した。まあまだ使える数あるからいいでしょう

これがわいの言葉や

「自我が破綻したおっさん」というキャラにハマってしまったので、変換器を書いた。

日本語をわいらの言葉に変換するやで · GitHub

Webページの翻訳もできる。

html内にある日本語の固有名詞をわいに置換する · GitHub

Wikipediaの記事で試してみた。勘のいい人ならすぐに気づくと思うが、一瞬しか面白くない。

わいの歴史 - Wikipedia

天海春香さんと会話したい 19

文をtf-idfで重み付けしたベクトルで表して、コサイン類似度で類似度を出す方法を試してみる。

まずコーパス内の全ての2-gramを抽出し、重複を削除すると40355個になる。40355次元のベクトルで一文書を表現することになる。

tf-idfで文書内それぞれの2-gramに対し重みをつけていって、ベクトルとして書き出してみた。 f:id:sasamijp:20151124172531p:plain めっちゃ疎なベクトルができた。

ほんとは3次元じゃなくて40355次元なんだけど、今こんな感じでベクトルがたくさんある。 f:id:sasamijp:20151124193127p:plain

入力された文(話しかけられた文)もベクトルにすると、こんな具合に空間内に入ってくる。 f:id:sasamijp:20151124193316p:plain

ベクトルだから、それぞれに入力文とのなす角θがある。このとき、cosθの値を文章の類似度と捉えることができる。 f:id:sasamijp:20151124193550p:plain

この仕組みでとりあえず組んでみた。

gist.github.com コーパスはこんな形式で保存されている。

gist.github.com コーパスの"|||"で句切られている文字列の左側だけをnattoで分かち書きして2-gramに変換しベクトルにする。

gist.github.com こんな感じのベクトルができる。あまりにも疎なので「どこが0じゃない値か」みたいな形式にしておく。

gist.github.com できたベクトルを読み取って入力文ベクトルと比較してテストケースの結果を出力する。

gist.github.com テストケースに対する返答の結果。なんかあんまり良くない... ちょっと荒削りすぎた

そもそもSSのセリフだとtf-idfで重み付けするのがあまりよくない気がしてきた 品詞とかその辺の情報で重み付けしたい感じがある

LSIなどを使って密なベクトルに変換するのも試したいが、疎なベクトルのままやる方法を色々試そうと思う

天海春香さんと会話したい 18

テストケース

色々試して返答の精度を上げたいところだが、精度を確認する手段が必要なので、テストケースを作ってみる。

@sa2miへのリプライ最新50件を取得してみた。

gist214520b25537fc6dc58c

 

それぞれに対する返答を見ていって、返答器の評価をする。具体的な値が出せれば嬉しいのだが、ちょっと思いつかないのでパッと見た感覚でいいなあとかよくないなあとかやることにする。

 

 ためしに、バージョン16の天海春香さんで試してみた。

 

gist9ba5a2b89a34d31aa8bd

 

たまに面白いのもあるんだけど全体的に意味不明で悲しい。

ブロック崩し 1

ブロック崩しをGAで学習させる方法を考える

sasamijp/breakout_solver · GitHub

 

まず評価関数を出すためにブロック崩しのシミュレーターが必要。スピードが命なので、めっちゃ速いのを作った。

f:id:sasamijp:20151120234816g:plain

これは乱数でバーの跳ね返り角度を決めてゲームをやらせているところで、ブロックが全部壊れると辿った軌道が表示される。

 ステージは124本の1次方程式でできていて、軌道との交点を算出して傾きを反転した線を再定義する処理を繰り返してボールの動きを出している。

ボールの大きさとか考えてないけど、ひとまずこれでやる。

 

 

遺伝子の設計をする。 

スーパーマリオブラザーズを学習させてみた(1-1) ‐ ニコニコ動画:GINZA

この動画を参考に設計した。

f:id:sasamijp:20151121000154p:plain

マリオの遺伝子は大体こんなんなってる。tが時間で、aが行動だと思ってほしい。ある時間に対して、ある行動が定義される。

f:id:sasamijp:20151121000423p:plain

ブロック崩しの遺伝子。eはボールがバーに当たる瞬間のことで、aが行動。ある衝突に対して、ある行動が定義される。要は、ボールが上にいる間も遺伝子に基づいた行動をしてたら無駄なので省いたことでtがeに変わった。

このモデルをいい感じにバイナリにして一個体を表現する。

 

f:id:sasamijp:20151121001647p:plain

遺伝子にそれぞれ6ビットの行動が入っている。n番目の衝突まで遺伝子を持たせようとすると、6nビットのビット列が遺伝子として必要。

 

 

交叉方法を考えた。

 

f:id:sasamijp:20151121002141p:plain

赤いとこ始点からずっと一緒やん!青いとこ交換したろ!みたいな感じ。正直自分でもよくわかってない。ここはもう少し考えなくてはいけない。

 

 

動かしてみる。

 

f:id:sasamijp:20151121002458p:plain

進化しとるやんけワレ!導き出された個体を見てみる。

f:id:sasamijp:20151121003034g:plain

まあなんか早いっちゃ早いんだけどもうちょっとがんばれない君?みたいな感じですね。

 

乱数で跳ね返り位置決めるとどんなもんになるか試す。

 

f:id:sasamijp:20151121003248p:plain

ん...?

f:id:sasamijp:20151121003451p:plain

GAの解超えとるやんけワレ!

乱数でもGAと同じぐらいいいやつ出ることがわかった。よく考えてみたら3回跳ね返すパターンは21万ぐらいしかないので乱数でも出てきそうなものである そりゃそうだろ

反省

GAを使う意味があまりないことがわかった。全体的に考えなおしていきたい 。