人工無脳ユウヤ - 498日目(ver.6 再要件定義、基本詳細設計)

仕様変更したので報告がてらダイアリーでまとめることにするよー。PPTでまとめると時間かかるわ…自分だけわかれば良いからテキストで十分だし。


今回Ver.6で追加するのはユウヤのひとりごと。要件は以下
・ひとりごとしゃべる
・返信されたらそれに対して返信
・フレンド投稿に返信
よーするにただしゃべるだけでなくて、相手と話が出来るようなシナプスを作りたい!という感じ。
さらに追加
・ひとりごと種類は数多く、自我を保ちながら自動生成できればいいな。(自動生成はとりあえず保留)
・テンションによって反応が変化


ではひとつずつ設計。
・ひとりごとしゃべる
まあ鈴がもうしゃべってるし。問題なし。

・返信されたらそれに対して返信
・フレンド投稿に返信
投稿の内容を解読し、それに対して最適な返信をするのがベストな形。
内容の解読はMecabに頑張ってもらう。投稿の内容を要素に分解(牛乳おいしい→牛乳/おいしい)
とりあえず日本語の文章で一番強い品詞や条件を取ってくるように設計。取ってきた文字に対しての返事を返す。
いろいろ考慮したけど、(疑問系かどうか)→形容詞(美味しい)→動詞(飲む)→名詞(牛乳) という形に決定。
「美味しい」という文字に対しての答えをDBから持ってくる。
返信確立は50〜80%ぐらいに設定しておけばまあいいかな。

・ひとりごと種類は数多く、自我を保ちながら自動生成できればいいな。
要件に沿って進めると、今回一番楽に実現できる方法はカミナギ式。
ただせっかくのキャラが壊れるのでそれはなし。外部の情報を自分の言葉にして吐き出すテンプレートのようなものを自動生成していくイメージかなぁ。
ちょっといい案が浮かばない+とりあえずひとりごと実装と比較すると重要度低のため当分保留とし、それまでは手動で行うことにする。

・テンションによって反応が変化
より人間らしくするためその日の気分を設置。
まあbad・normal・happy・スーパーハイテンション(7.5倍)の4つぐらいあればいいかな。


はいはい、ではそれに対応できるDB設計イクゾー!
ずっと机上論だったのでとりあえずテスト中。ハイクのタイムラインから今も吸い出して学習させてみてます。…といっても学習するのは今のところ名前だけなんですが…
今現在は3つのテーブルを作成しています。
・形容詞、動詞が大量に入ったテーブル(メインテーブル)
・名詞が大量に入ったテーブル(サブテーブル)
NGワード
メインテーブルには形容詞・動詞がずらずらと並んでます。
形容詞ひとつにつき、複数レコードがある形(名前は同じ)
レコードが複数あるときはランダムで発言、とか。
例えばこの場合
美味しい:牛乳最高!:ノーマル
美味しい:牛乳最強!:ノーマル
美味しい:牛乳飲め!:ハイテンション
ユウヤがハイテンションの場合は、ハイテンションの発言を取ってくる。たまにノーマルも拾う。
ノーマルの場合は上位のハイテンションを拾わない。対応したテンションの属性が無い場合は基本ノーマルを使用します。
バッドの場合、バッド70%ノーマル30%
ノーマルの場合、ノーマル100%
ハイテンションの場合、ハイテンション80%、ノーマル20%
Sハイテンションの場合、Sハイテンション50%、ハイテンション50%
Sハイテンションの場合で、ハイテンション属性が登録されていない場合は、Sハイテンション90%ノーマル10%
という感じ。まあ割合は様子見つつ調整が必要だろうなぁ。

サブテーブルは名詞が入っている。
形は以下。
牛乳:食品/飲み物:ミルク味:白:どろり:牛乳最高!:ノーマル
牛乳_不味い:食品/飲み物:ミルク味:白:どろり:不味いだなんてとんでもない!:ノーマル
と、こんな感じで名詞+形容詞のマイナー条件をしまっておく場所。
このマイナー条件に引っかかれば基本的にこちらを表示するように。
DB検索順としてはサブ→メインの順になるかな
あとはNGワード。これは変な言葉覚えたり、それに返信しないようにするため。


さて、このDBの形でやりたいことが上手く出来るかなぁ。
DB設計はあまり経験無いので作ってみて〜考えて〜みたいな感じ。
DBが出来ればそこから情報引っ張ってきて吐き出すだけ。
DBの容量は今日適当に学習させてたら名詞が6000超え、形容詞・動詞が1000超え、という感じ。6000の方は140kbぐらいだったけど、まあ問題ないよね。そんなもんだよね。
あとは適度にオーバーフローも解消してやらんと。
さて、明日にどこまで進められるかな…