ささみろぐ

チラシの裏

これがわいの言葉や

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

日本語をわいらの言葉に変換するやで · 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を使う意味があまりないことがわかった。全体的に考えなおしていきたい 。

 

知ゴリラ 2

 

未知との遭遇

 

ゴリラと会話できるサイトを開設した。知ゴリラ1ではゴリラが文法を獲得するというアプローチを紹介したが、今日のテーマは未知との遭遇であるが故に、ゴリラは乱数によって思考するのみである。

知ゴリラ

ゴリラの知、ゴリラ知、いや、知ゴリラである。

まずSOV文型を使えるようにする。ゴリラ、ジャングル、住む。

人間の文を理解するためのパーサが必要な気がする。

 情報を貯めておく必要がある気がする。

言われたことを覚えて、記憶から探して返す必要がある気がする。 

 

f:id:sasamijp:20150703232959p:plain

今日はこのへんで

 

 

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

こう言われたらこう返すというデータを蓄積して返答させる方法を考えてきた。その方法だと、返答を選びとるにあたって「今話しかけられた文章」というデータしか手がかりにならない。そこで、文脈を読み取る仕組みを考えてみた。

入力とSSをどこまで比較するかの問題なのだが、「こう言われたらこう返す」の「こう言われたら」の部分だけ比較するのではなく、「こう言われてこう言ってこう言われてこう返す」の「こう言われてこう言ってこう言われて」ぐらいの部分までより深く比較することで、少しでも文脈を読み取らせることができるのではないかと考えた。

 

どういうデータ形式でSSを保存しておけばスピーディに文脈を比較できるかについて考えてみる

Neo4jというグラフデータベースを使って会話の繋がりをグラフにしてみる

f:id:sasamijp:20150321220537p:plain

こう言われたらこう返す、の連続で繋がった線になる。これだけでも従来の仕組みでいくなら割と充分なのだが、どの単語がどの発言に属しているかみたいな情報も参照できるようにしたかったのでもう少し複雑にしてみる。

f:id:sasamijp:20150321223340p:plain

mecabに文章をパースさせて単語につく情報を木にしてみた。この部分だけを生成するのに4分ぐらいかかった ちょっと必要以上に複雑にしすぎた感がある。もう少しシンプルにいきたい。