これがわいの言葉や
「自我が破綻したおっさん」というキャラにハマってしまったので、変換器を書いた。
Webページの翻訳もできる。
html内にある日本語の固有名詞をわいに置換する · GitHub
Wikipediaの記事で試してみた。勘のいい人ならすぐに気づくと思うが、一瞬しか面白くない。
天海春香さんと会話したい 19
文をtf-idfで重み付けしたベクトルで表して、コサイン類似度で類似度を出す方法を試してみる。
まずコーパス内の全ての2-gramを抽出し、重複を削除すると40355個になる。40355次元のベクトルで一文書を表現することになる。
tf-idfで文書内それぞれの2-gramに対し重みをつけていって、ベクトルとして書き出してみた。 めっちゃ疎なベクトルができた。
ほんとは3次元じゃなくて40355次元なんだけど、今こんな感じでベクトルがたくさんある。
入力された文(話しかけられた文)もベクトルにすると、こんな具合に空間内に入ってくる。
ベクトルだから、それぞれに入力文とのなす角θがある。このとき、cosθの値を文章の類似度と捉えることができる。
この仕組みでとりあえず組んでみた。
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件を取得してみた。
それぞれに対する返答を見ていって、返答器の評価をする。具体的な値が出せれば嬉しいのだが、ちょっと思いつかないのでパッと見た感覚でいいなあとかよくないなあとかやることにする。
ためしに、バージョン16の天海春香さんで試してみた。
たまに面白いのもあるんだけど全体的に意味不明で悲しい。
ブロック崩し 1
ブロック崩しをGAで学習させる方法を考える
sasamijp/breakout_solver · GitHub
まず評価関数を出すためにブロック崩しのシミュレーターが必要。スピードが命なので、めっちゃ速いのを作った。
これは乱数でバーの跳ね返り角度を決めてゲームをやらせているところで、ブロックが全部壊れると辿った軌道が表示される。
ステージは124本の1次方程式でできていて、軌道との交点を算出して傾きを反転した線を再定義する処理を繰り返してボールの動きを出している。
ボールの大きさとか考えてないけど、ひとまずこれでやる。
遺伝子の設計をする。
スーパーマリオブラザーズを学習させてみた(1-1) ‐ ニコニコ動画:GINZA
この動画を参考に設計した。
マリオの遺伝子は大体こんなんなってる。tが時間で、aが行動だと思ってほしい。ある時間に対して、ある行動が定義される。
ブロック崩しの遺伝子。eはボールがバーに当たる瞬間のことで、aが行動。ある衝突に対して、ある行動が定義される。要は、ボールが上にいる間も遺伝子に基づいた行動をしてたら無駄なので省いたことでtがeに変わった。
このモデルをいい感じにバイナリにして一個体を表現する。
遺伝子にそれぞれ6ビットの行動が入っている。n番目の衝突まで遺伝子を持たせようとすると、6nビットのビット列が遺伝子として必要。
交叉方法を考えた。
赤いとこ始点からずっと一緒やん!青いとこ交換したろ!みたいな感じ。正直自分でもよくわかってない。ここはもう少し考えなくてはいけない。
動かしてみる。
進化しとるやんけワレ!導き出された個体を見てみる。
まあなんか早いっちゃ早いんだけどもうちょっとがんばれない君?みたいな感じですね。
乱数で跳ね返り位置決めるとどんなもんになるか試す。
ん...?
GAの解超えとるやんけワレ!
乱数でもGAと同じぐらいいいやつ出ることがわかった。よく考えてみたら3回跳ね返すパターンは21万ぐらいしかないので乱数でも出てきそうなものである そりゃそうだろ
反省
GAを使う意味があまりないことがわかった。全体的に考えなおしていきたい 。
天海春香さんと会話したい 17
こう言われたらこう返すというデータを蓄積して返答させる方法を考えてきた。その方法だと、返答を選びとるにあたって「今話しかけられた文章」というデータしか手がかりにならない。そこで、文脈を読み取る仕組みを考えてみた。
入力とSSをどこまで比較するかの問題なのだが、「こう言われたらこう返す」の「こう言われたら」の部分だけ比較するのではなく、「こう言われてこう言ってこう言われてこう返す」の「こう言われてこう言ってこう言われて」ぐらいの部分までより深く比較することで、少しでも文脈を読み取らせることができるのではないかと考えた。
どういうデータ形式でSSを保存しておけばスピーディに文脈を比較できるかについて考えてみる
Neo4jというグラフデータベースを使って会話の繋がりをグラフにしてみる
こう言われたらこう返す、の連続で繋がった線になる。これだけでも従来の仕組みでいくなら割と充分なのだが、どの単語がどの発言に属しているかみたいな情報も参照できるようにしたかったのでもう少し複雑にしてみる。
mecabに文章をパースさせて単語につく情報を木にしてみた。この部分だけを生成するのに4分ぐらいかかった ちょっと必要以上に複雑にしすぎた感がある。もう少しシンプルにいきたい。