人工無能の作り方・育て方


 とりあえず、タイプ別にいこうかなぁ・・・。


■世界で一番無脳型

 よ!! これぞ、無脳!! 真の無脳!! いや、むしろこれにこそ、「無能」がふさわしい!!
プログラム内臓オンリー人工無能!!

作り方はいたって簡単。
文章検索ができるPerlならif文連打のみ!

SAMPLE:(テキストベース)
    if($ARGV[0]=~/おはよう/){print 'おっは〜!';exit;}
    if($ARGV[0]=~/さようなら/){print 'バイバイ';exit;}

これをひたすら続ければOK!! ついでに言うと、育たないので育てる必要はありません〜。


■CGIで一世風靡! 手動学習型

 CGI型でよくあるタイプです。
プログラム的に分かりやすく、とりあえず育てられるので御手軽でーす。


 例:
・文章中で「○○○===×××」等といれると「○○○」という言葉が発言されたとき「×××」と返すようになるタイプ。


・チャットとは別画面で、反応する語と返事を設定するタイプ。
反応する語に正規表現を使えるものもある。


・会話中で「○○って言われたらなんて答えたらいい?」等と聞いてきて、それに対して答えると勝手に記録するタイプ。
自動と言えば自動とも言えるが、明示的にやるということで、手動型に分類しといた。


 どんどん登録してけば、どんどん育ちます!

■自動学習

 最強の無脳でしょう。
うずらなどが特に最強。
でも、難しいです。
作り方は自分で考えましょうー


というのも、あんまりな気がしないこともないので、簡単な例を紹介。

1、キーワードと発言をセットで記録。

2、文章の一部を変更して発言する。

3、マルコフ連鎖を使う。


とかが一応有名(?)あるいはオーソドックスなやり方。

・・・かな?

はうちのAKOSMエンジンがそう。
いちばんやりやすいし、それほど不自然な分に文にならない。
(って、人が入力した文をそのまま返してるんだから当たり前)
例えば、
A:「おはよう」
B:「おはようって・・・もう昼だろ? もしかして今起きた?」
っていう文章から、「おはよう」というキーワードに対して「おはようって・・・もう昼だろ? もしかして今起きた?」と答えればいいと判断できる。
つまりこれをそのまま登録すればよいわけで。
手動登録の人工無能で「馬鹿==なんでそんなこというの!?」という風にキーワードとその反応文を登録するのを、そのまま自動でやっちゃうみたいな。


しかぁぁし、例えば
A:「ああ、大変だぁぁぁ。テストがぁぁぁぁ明日だぁぁぁぁぁ」
B:「テスト勉してないのかよ」
A:「ぐおおおおおお、やーばーいーーーー」
B:「ま、神様にでも祈れや。俺も祈っといてやるよ、お前が0点取るように」
みたいな文章のとき、「テスト勉してないのかよ」という反応文が抜き出せるけれども、これはどのキーワードに対しての返答か?と迷うことになるんだな。
「大変」「テスト」「明日」というキーワードがその前の文中から抜き出せるが、 「大変」をキーワードとして登録すると、
A:「いやぁ、あの人も忙しくて大変だねぇ」
無能:「テスト勉してないのかよ」
A:「はぁ?」
となるし、「明日」をキーワードとして登録すると、
A:「明日は会社あるー。憂鬱〜〜」
無能:「テスト勉してないのかよ」
A:「・・・完璧壊れてるな。この無能ってランダム発言?」
となってしまう。
この場合、「テスト」をキーワードとして登録するのが一番いい。
(もちろん複数のキーワードを考慮するに越したことは無いけど、ひとつだけのキーワードを考えた場合)
A:「テストの結果よかった〜」
無能:「テスト勉してないのかよ」
A:「いや、したってば。だれが山勘であんな点がとれるか!」
と、多少問題はあるが、それでも前の二例よりは相当マシ。

このように、キーワードと反応文を対として記録するのアルゴリズムの場合、「キーワードになにを選ぶか」が最高に重要であります(なぜに軍隊口調?)。
自分のAKOSMエンジンだとそこらへんがおもいっきりだめ。
つまり最初の2例のようになっている場合が非常に多い。
だからこそ、なぜかランダム反応としか思えないような動きをしてしまう・・・。
シクシク


、ふんじゃあまあ、気を取り直して、いくかねぇ。

まずいうと、これはひとつのテクニックであってこれだけでは無能足り得ない。
いや、作れないことはないんだけど・・・。

これは、例えばの話、また会話例をあげると、
A:「ガンダムってどう思う?」
無能:「ガンダムはいいよねぇ」
A:「お、ガンダム知ってるのか?」
こんなかんじになりますな。
これはどうやっているかというと、(というより、どういう構造だとこういうことが出来るかというと)、まず「どう思う?」という部分、あるいは単に「?」の部分をみて、過去ログの(B「君はどう思う?」C「アレはいいよねぇ」)という文を発見したとする。
(そんな都合よい過去ログがあるかって? 都合よくあるとしてくれ!!)そしたら、「どう思う?」が一致したBの発言の次のCの発言「アレはいいよねぇ」を抜き出す。
そして、ここの「アレ」の部分が置換できそうだとかんぐりつける。
(形態素分解で厳密にやるのが一番いいけど、カタカナはたいてい固有名詞だからとりあえずカタカナ部分を置換しちゃえ! なんて荒業もあり)そんで、かんぐりつけた「アレ」にAさんの発言から抜き出した「ガンダム」を適応させてしまう。
すると、上みたいなのが出来る。

ま・・・なかなかうまくいく代物ではないし。
そもそも、うまい過去ログがないと話にならないし、過去ログからうまくその場に合うCの発言を探すアルゴリズムが別にいる。
きちんとその場にあったCのような発言を選ばずに、「なんでもいいから、とにかく過去ログの文章を持ってきて、Aさんが話した単語を突っ込んでしまえ!」という手法で行けば、この仕組みだけでも一応無能は作れるけど・・・それで作った例、「SMSOエンジン」。
話せば分かる、底の浅さ。

A:「私は好きなんだけどトマトジュースって人気無いんだよねぇ」
無能:「私はトマトジュースです」(「私は学生です」みたいな文が過去ログにあった場合)
A:「え?」
「過去ログからうまくその場に合うCの発言を探すアルゴリズム」っていうの一番重要になってくるでしょうなぁ。



、わたしゃよー知りません。
でも使ってる人が多いです。

ま、知らないなりに簡単にいうと、「私は馬鹿だーー馬鹿なんだーーーうわああん(泣」という文章から(文章の意味は特にありませんのであしからず)、「私」→「は」、「は」→「馬鹿」、「馬鹿」→「だーー」・・・・という具合に並び順が抽出できるわけですな。
これを大量の文章について解析してくと、「私」→「は」となることはあっても「私」→「バナナ」という文章の並び方はないと分かります。
(そりゃそうだ)で、さらに確率的に解析すれば「私」→「は」とつながる場合が一番高いと分かります。
(というか、元の文章が「私は〜」がたくさん出てくるものだったと仮定して)そしたら、ここから文章が作れるようになるわけです。
「私」→「は」、「は」→「元気」、「元気」→「です」という繋がりが各々一番多かったとしましょう。
すると「私は元気です」という文が生成できます・・・・。

ってそこで、「一番確率が高い並び方!? それじゃ毎回同じ文しかできないじゃないか!!」と思った方。
えらいです。
ですから、単に確率的〜はあんま考えないで・・・いや、そもそも最初から確立うんぬん言う必要は無かったのでは・・・ブツブツ・・・・ま、とにかく確率は忘れて、並び方だけ考えましょう〜あはは。
そうするとさっき言ったように「私は」という並びはあっても「私バナナ」という並びはないと分かります。
そこで、この「あり得る並び」をぼんぼこ並べていけばきっと文章になります(汗;。
汗を掻いているように、100%まともな文にはならないので、実際はあんまりにも長い長文や、文法的に変な(変であるかの識別がまたムズカシイのだけれど)文章にならないように制約をかける必要があります。
(変な文章が出来たらもっかい作り直すとか)
「それじゃ、作りたい文が作れないじゃないか!! 単なる文章製造プログラムじゃないか!!」と思われたあなた、同感です。
私もそう思います・・・え? なんとかしろ?・・・。
じゃ、例えばの話でいくと、「相手の文に含まれたキーワードの両端に『あり得る並び方』をとっつけていく」という手法があります。

不幸にも、「私には無理です」「物事には表と裏がある」「私と踊らないかね?」という文が学習されていたとしましょう。

A:「やいやいてめぇ、表に出やがれ!!」
無能:「私には表と踊らないかね?」
という風に・・・え? 使えない? まあ、そのまま使うのはねぇ・・・。
部分的に使うとか、使う文章に気をつけるとかしないとなかなかつかえませんねぇ。

でも、自前で文を作る方法としてはかなりポピュラーなやり方。
うまく工夫してつかってみてください。
・・え?こんな説明役に立たなかった? ふーーん・・・・あきらめてください。これが私の力量です