例えば以下の辞書の場合、
@{A},AってXだよ,Aなんてダメ,Aっていいよね
発言内容「Aがなんたらかんたら」に対して、
の3種類からランダムに応答します。これは、
@{A},〜
で指定したAが、
Aがなんたらかんたら
に含まれているためです。
@{A},Aって{形容詞}よね,Aなんてダメ,Aっていいよね
@{形容詞},美しい,さみしい,恐ろしい
という辞書の場合、Aに対する応答の中にある{形容詞}が、
形容詞に対する応答の
のどれかに置換されます。したがって、
発言内容「Aがなんたらかんたら」に対して、
の5つのどれかが応答となります。
但し実際には、
の3つからまず選択され、
Aって{形容詞}よね
が選択された場合に、
{形容詞}
の部分が
に置換されるので、各応答が返される確率は以下の様になります。
置換は、何度でも繰り返し使用できます。
@{A},A,B,C
@{AB},D,E,F
という辞書の場合、
発言内容にAだけを含む場合はA,B,Cのどれかを選択しますが、
発言内容にABを含む場合はD,E,Fのどれかを選択します。
をAB含んでいるということはAも含んでいますが、
異なる2つ以上のキーを含む場合は、
より長いキーが優先されます。
@{A},A,B,C
という辞書に対して
X
という発言内容の場合、
応答すべきものが見つからないので、
masuo.plでは何も返しません。
comchatq.cgiでは、masuo.plの応答がなかった場合に限り、
{T返事詞}という発言内容を再度masuo.plに渡します。
masuo.plはデフォルトの辞書内に{T返事詞}が定義されているので、
その中から選択して応答します。
つまりmasuo.pl自体は、対応する応答が定義されていない場合はなにも返しません。
@{食},おなかすいた
@{どうぞ~おなかすいた},ありがとう
という辞書に対して、
なにか食べようかな
という発言内容の場合、
おなかすいた
と応答します。
その後に、
よかったらこれどうぞ
と発言されると、
ありがとう
と応答します。
キー内の~以前は発言内容から検索され、
~以降は前回の応答内容から検索されます。
キーに~を含む場合、両方の検索が成功した場合のみ応答として使用されます。
上記の辞書に、
@{おなかすくよね~おなかすいた},この時間はすくよね
等と追加すれば、発言内容によって応答が分岐し、
このようなデータを多数持たせることにより、
会話の流れを定義することができます。
応答内容に//が含まれる場合、
//以降、行末か区切り文字,までを応答から省きます。
ただし、前回の応答内容としては省かないので、
以下の様な辞書の場合、上の説明と同じ動作をします。
@{食},おなかすいた//Fおなか01
@{どうぞ~Fおなか01},ありがとう
@{おなかすくよね~Fおなか01},この時間はすくよね
注)//以降は応答から省きますが、
//の前に:があった場合は省きません。
@{作者のサイト},http://www9.plala.or.jp/ulbperl/
という辞書では、
作者のサイト
という発言内容に対して、
http://www9.plala.or.jp/ulbperl/
を応答します。
@{T名詞},きゅうり,テレビ
@{%T名詞%.*(た|食)べ},それっておいしいの?
という辞書に対して、
今日はきゅうりを食べたよ
という発言内容の場合、
%T名詞%の部分に「T名詞に対する応答」を当てはめた形でキーを検索し、
それっておいしいの?
と応答します。
つまり、
テレビたべる?
という発言内容の場合にも、
それっておいしいの?
と応答することができます。
以下の様な辞書の場合、
!{wwwyomiuri}=www.yomiuri.co.jp,/index-j.htm,<!-- /news/shuyo start -->,<!-- /news/shuyo end -->,>,<,10,sjis
!@{ニュース},{wwwyomiuri}って読売新聞のサイトに書いてあったよ。
@{ニュース},最近いいニュースが少ないよね。
Socketが使用できる環境でget_news.plが設置されている場合に限り、
読売新聞のサイトからニュースを引用することが可能です。
なんかニュースない?
という発言内容に対し、
から選択され、
{wwwyomiuri}って読売新聞のサイトに書いてあったよ。
が選択された場合に限り読売新聞のサイトにアクセスして、
富士山大爆発か!って読売新聞のサイトに書いてあったよ。
の様な(これは例ですが)応答をします。
Socketが使用できないもしくはget_news.plが設置されていない環境の場合は、
!で始まるデータが無視されるので、
最近いいニュースが少ないよね。
としか応答しません。
注)この機能を使用する場合、必ず応答内容で引用元がわかるようにしてください。
masuo.plは、発言内容に対しての応答が定義されていれば
その中から一つを選択して応答し、定義されていなければ何も返しません。
comchatq.cgiでは、
の2種類を設定できるようになっており、
その確率で、masuo.plを呼ぶようになっています。
また、上記設定に関わらず、発言者と人工無能が1対1の場合は、
確率に関わらずmasuo.plに発言内容を渡すようになっています。
つまり、masuo.plは発言に対して応答を返すだけのスクリプトなので、
確率等は呼出し元のスクリプトで制御する必要があります。
@{file=b.dat}
a.datというデータファイル内に上記の様な記述がある場合、
そこにb.datの内容があるかのように動作します。
ファイル名は、masuo.plの呼出し元スクリプトから見た相対パス、
もしくは絶対パスで指定します。また、
@{file=<datadir>/b.dat}
とすることで、a.datと同じディレクトリのb.datをインクルードします。
@{studyfile=<datadir>/study.dat}
でも同じ様にstudy.datをインクルードしますが、
これについては学習の項で説明します。
@{おみくじ}=omikuji.dat
a.batというデータファイル内に上記の様な記述がある場合、
omikuji.datの中から1行をランダムに選択し、
おみくじに対する応答とします。
omikuji.datの例)
大吉 中吉 小吉 凶
パスについては前述と同様で、
@{おみくじ}=<datadir>/omikuji.dat
という記述もできます。
また、
@{返事詞}=../masuo/res.dat
@{返事詞}=../masuo/resadult.dat(30)
の様な辞書の場合、
まず、返事詞に対する応答として、res.datから一行選択され、
その次に、30%の確率でresadult.datのうち一行で返事詞の応答を上書きします。
確率が指定されていない場合は、必ず後に指定された方が有効になります。
comchatq.cgiでは、$study_keyに指定されている文字(初期状態では===)を使用し、
AAA===BBB
の様に発言する事で、
@{AAA},BBB
というデータが追加されます。
内部処理的には、
$result=masuo::studyWord($a,$b);
という記述により、
@{$a},$b
というデータが追加されます。
追加先のファイルはデータファイル中の
@{studyfile=<datadir>/study.dat}
という記述で指定できます。
comchatq.cgiでは、$dellast_key(初期状態ではわすれろ)が発言内容だった場合に、
一番最後に学習した言葉を削除します。
内部処理的には、
masuo::Init($svr_code,$masuo_file,'',$hour,$w_name); $result=masuo::deleteLast();
という記述により、学習先ファイルの最後の行が削除されます。
deleteLastが複数回呼び出された場合、最後の行から呼び出した回数分の行が削除されます。
comchatq.cgiでは、$autostudy_pに指定された数値をパーセンテージとした確率で、
発言内容を自動的に追加します。
内部処理的には、
masuo::Init($svr_code,$masuo_file,'',$hour,$w_name,'../masuo/cache.dat',1,$autostudy_file,$autostudy_p); $res=masuo::getRes($comment,$name);
のように$autofileに追加先データファイルを、
$autostudy_pに自動学習確率を指定します。
注)$autofileは、選択インクルードファイルでなければなりません。
通常のデータファイルを指定した場合、データファイルには追加されますが、データとしては無効となります。
*{auto=<datadir>/res.dat}
という記述がある場合、res.datを自動学習先ファイルとし、
Initでの指定は無効になります。
人工無能キャラクター名が'わかめ'であり、
@{T一人称},わたし
:
*{repfile=<datadir>/rep.dat}
という記述があり、rep.datの内容が
@{じゃん$},だよ
@{だめ},ダメ
だとします。
「わかめってだめじゃん」
という発言を自動学習すると、
わたしってダメだよ
というデータが追加されます。
自動学習の際、まず、
人工無能キャラクター名(comchatq.cgiでは$w_name)を{T一人称}に置換します。
そして、rep.datがあれば、その内容を元に置換が行われます。
上記の例では、「じゃん」を「だよ」、「だめ」を「ダメ」にそれぞれ置換します。
補足)@{じゃん$}の$は、末尾という意味の正規表現です。
つまり、上記のデータでは「じゃんけん」を「だよけん」には変換しません。
正規表現についてはここでは説明しませんので、他のサイトや書籍等を参照してください。
注){T一人称}がデータファイル中に記述されていない場合、上記の変換は行われません。
例)
@{勝負},{name}さんには負けませんよ〜
例)
@{名前は},私の名前は{wname}といいます。
comchatq.cgiでは、参加者ファイルと発言ランキングファイルから
名前を抽出してmasuo.plに渡しています。
(誰もいない場合は空白になってしまいます。)
例)
@{恋愛},{1:words}と{2:words}って、ラブラブなの?
例)
@{何歳?},{10to100}才です。
注)数値Aは数値B以下の数値にしてください。
例)
@{クラスは?},3年{A-Z}組です。
注)文字Aはコード上で、文字B以下の文字にしてください。
例)
@{どっち},#1({T名詞})と#2({T名詞})ならどっちがいい?//Fどっちか
@{.+~Fどっちか},私は{reply1}も{reply2}も嫌い〜
例)
@{(.+)が},{inword1}がどうしたの?
@{(.+)と(.+)が},{inword1}と{inword2}がどうしたの?
例)
@{%T名詞%.*(た|食)べ},{inword0}っておいしいの?
例)
@{男},猪木,なすび
@{男前},{1:男}と{2:男}なら{1:男}の方が男前。