~目次~ #contents *ナンデスカこれはー [#x1b8f993] -ちょー個人的なAIMistメモ。 -誰のためでもなく自分のため。 -AIMist配布場所 http://mistnar.hp.infoseek.co.jp/ -とりあえず、思いついたことをずらーっと。 -3.x系最終仕様の資料として残しておいてください。 --基本的にはmist_ai.dic内に全て書かれているが、細かな関数はmist_aisupport.dicに記述されている。前者をMain、後者をSubと略すことにする。また、ver3.x AIMistを3.xと記すことにする。 *言葉の伝え方 [#k2d0b96d] -配布サイトの方にも書いてあるが、以下のもの。これらはすべて同じようにMain OnMarkovChainを呼ぶ。 --CommunicateBoxによる入力 --MicComによるイベント --LimeSSTP([[SLNC:http://kotomishome.hp.infoseek.co.jp/]]含む)によるイベント --LimeChatにより生成されたLOGの解析(ただし、これは私用 -基本的に、文章を3.xに運べるように拡張できるものであれば、どのようなソフトからでも学習は可能であり、今回はたまたまIRC(LimeChat)から文章を送れるようにしだだけのことである。3.x内部で汎用的な学習用のイベントを定義しておけば広く使われることもあるかもしれないが、それはあえて行わなかった。それに耐えれるほど3.xは強くはない……と、思う(ぉぃ *全体の処理の流れ 記憶(MarkovChain.Memorize系関数)編 [#md54fd9d] -''概説'' --返り値として、キーワードを返すわけだがー…。 -''使用したくない文字(記号)の削除、置換(Main MarkovChain.Memorize.SentenceFilter関数)'' --次のフィルタが実装されている。 --チャット特有の記号の削除、置換 --URLのキック処理 --Sakuraスクリプト、葉梨スクリプトの削除~ 他のGhostからの学習を前提に。ただし、この機能は未実装に終わっている。 ~サンプルスクリプト~ ・Sakuraスクリプト削除(\[数字]は処理されない) _talk = RE_REPLACE(_talk, "\\_?[[:alpha:]](([[:alnum:]])?|(\[(.*?)\])?)|\\!\[(.*?)\]|\\(\--|\+|_\+|[[:digit:]])", "") ・葉梨スクリプト削除 _talk = RE_REPLACE(_talk, "@0?(<|>|\||\+|\--|\=|\:|a|n|o|u|e|b|w|wavout)(\[(.*?)\])?", "") --触りたくない記号の削除~ →茶筌対策 --半角英字を全角英字に変換~ →茶筌対策 -''茶筌による解析(Sub ChasenRequest)'' --フィルタにより、余計な文字を全て消した上で茶筌による解析を行う。 --出力は簡易配列の形で返すようにし、RE_SPLITすることにより、二次元配列に変化するように仕向ける。こうすると、WinChaで表示しているように取得できるので、全く苦労しない。 出力された結果は、基本的に一つずつ判断していくことになるので、foreachにより一つの要素を抜き取り、それを簡易配列として扱えばよい。 -''品詞の確認(Main MarkovChain.Memorize)'' --上の通り、foreachにより一つの要素を抜き取り、それを簡易配列として扱っている。 --記号は基本的にスルー。 --if文で、「感動詞」、あるいは、「数、非自立、代名詞、特殊、接続」を含まない、かつ、名詞を含む品詞、あるいは、「記号」を含まない「形容詞」が含まれること……にヒットするものを一時的にキーワードとして保存する。 --品詞が名詞--数である場合、茶筌によってばらばらにされた数字を一まとめにするため、一時的に保存していき、固めていく。 -''記憶を行う(Main MarkovChain.Memorize.Pattern)'' --ここでマルコフ連鎖として、ばらばらにされたパーツを保存する。~ 例えば、「私は青い空が好きです。」を茶筌によって分解するとー…~ 私 名詞-代名詞-一般 は 助詞-係助詞 青い 形容詞-自立 空 名詞-一般 が 助詞-格助詞-一般 好き 名詞-形容動詞語幹 です 助動詞 。 記号-句点 となる。キーワードとして出力できるのは、「空」と「好き」の2つ。これの最初と最後にタブをくっつける。 --Sub SQLSearchRequestを中心に、要素を順番に5つ並べ保存していく。 >本来、人工無能で扱うマルコフ連鎖は3つずつ並べていくタイプが多い。しかし、ミストは一般ユーザー向けの人工無能として開発していかなければならず、未熟なりにでもまともな返答を行いたいという意地もある(ぉぃ)。3つずつ覚えさせて出力すると、処理の甘さから電波文になりやすい。そこで、3~5つの要素を状態に合わせて使い分けるようにしている。 *全体の処理の流れ 文章生成(MarkovChain.Remember系関数)編 [#w0edd952] -''概説'' --記憶に比べると、記憶したものにしたがって単語を並べていくだけなので、いたってシンプルである。 --返り値として、Sakuraスクリプトも何も含まない文章が返される。 --Sakuraスクリプトとかシェル指定とかどーしてるの?というのはもう少し後で。 -''キーワードに感動詞がある場合、特別な処理を行う。(Main MarkovChain.Remember)'' --「おはよう、こんにちは、こんばんは、さようなら、おやすみ」がそれに当たる。スクリプト内で品詞を見ずに単語のほうを見ているのはver2.x時代の名残……ということにしてくださいお願いします(ぅぉぃ -''マルコフ連鎖 準備(Main MarkovChain.Remember.CenterRefine)'' --ここでは上記の茶筌分解の例を使い、「空」を中心に一般で使われるマルコフ連鎖で生成を行ってみる。……といっても、マルコフ連鎖のわかりやすい例はそこら辺にいっぱい転がってるので詳しくは略。~ ミストは「空」を中心に「青い,空,が」を返す。 -''マルコフ連鎖 駆け上り(Main MarkovChain.Remember.BackRefine)'' --準備で出力されたものを使用し前半を使って一つ出す。これのループ~ 「青い,空」を使って「は」を出す。これをループさせることにより、「私,は,青い,空,が」まで完成する。 -''マルコフ連鎖 駆け下り(Main MarkovChain.Remember.FrontRefine)'' --駆け上りの逆方向。~ 「空,が」を使用し、「好き」を出す。これをループさせることにより「空,が,好き,です,。」を生成、駆け上りのものを受け継いでいるので、最終的に「[最初],私,は,青い,空,が,好き,です,。,[最後]」を出力。 -''マルコフ連鎖 全体に関わること(関数名略)'' --マルコフ連鎖はよく有限ループに陥ることが多い。そのために、ループカット処理が施されている。ただし、実装したものはとても簡易的なものである。次のものに引っかかった場合、生成を中止しreturnする。~ 「生成時のマルコフ連鎖によるループ回数の制限は64とする。」~ 「出力結果を簡易配列として扱い、基準要素から前後5、6つの場所に、同じ単語が出現した場合、カットする。」~ これは非常に効率が悪く、また、誤爆(ループしてないのにカットしちゃう)も多いので、本来全く使い物にならないものを使っていることになる。なんというか改善要求!! -''生成後にまたフィルタ(Main MarkovChain.Remember.SentenceFilter)'' --[最初],[最後]のタブを削除し、簡易配列を文字列に修正(カンマ削除)する。 --括弧記号に対するフィルタ。マルコフ連鎖により、括弧記号が片方しかない、といった場合にその括弧記号を削除する。処理的に中途半端なので、存在価値は薄い。記憶の時点で、括弧を削除することでこの処理は必要ないことになるが……。 -''名詞置換(Main MarkovChain.Remember)'' --茶筌により解析後、「名詞-一般,形容動詞語幹」があった場合、置換を行う構造となっている。 --動いているには動いているのだが、名詞同士の関係の結び方がほぼ出来ていないため、ほとんど意味のない処理と言ってもよい。 *OnTranslateの中身といってよいHBTranslate [#w2657185] -''概説'' --実は先代ミスト(機能馬鹿の)の処理を受け継いでいたりする。 --葉梨に渡す読み方などを生成し、3.xに予め渡されている設定にしたがって処理を行う。 -''処理内容'' --渡された文字列に対して、全てのSakuraスクリプトを削除(ただし必要なものは残す)したものを一時的に保存。 --それに対して、葉梨スクリプトも一時的に別のものに置換。 --同じくヘッドライン対策。 --それを茶筌に通し、読み方を出力する。 --葉梨スクリプトを戻す。~ この時点で、葉梨により発声させている。 --HBTranslateに渡された文字列(要するに何も弄っていない文字列)を見てサーフィスを決める。~ 3.xの表情を見る限り、中の人でもいるのじゃないか?的に表情と文章が一致する。とても全てがランダムとは思えない…。 --\0,\eをチェックし、なければ付けてそれを出力。 *何かありましたらこちらに [#w8131d41] - AIミスト始めて一週間くらいなのですが、まだ「私は青い空が好きです」しか話しません。ちゃんと学習してくれているのか心配になります。大丈夫でしょうか。ちなみに葉梨をオンにしても喋ってくれません -- [[まろ]] &new{2008-12-17 (水) 23:33:54}; - んむー、多分茶筅周りだと思われます。http://mistnar2.hp.infoseek.co.jp/mist/aimist.htmlを元に茶筅を入れてみてくださいっ -- [[ちに]] &new{2008-12-20 (Sat) 00:47:46}; - 色々試してみた結果、ミストさんが発声することができました。これなら大丈夫そうです -- [[まろ]] &new{2008-12-22 (月) 18:41:45}; - おー、よかったヽ(・∀・)ノ どしどし教えてやってください~♪ -- [[ちに]] &new{2008-12-27 (Sat) 02:16:17}; - MYjPAMucwEWSfTnZXHo -- [[esxdhp]] &new{2009-01-18 (日) 19:58:15}; - 茶筅のサイトが落ちてるみたいなんですけど、どなたか茶筅配布していただけませんか? -- [[・・・]] &new{2009-11-29 (日) 20:39:07}; #comment