マスオの仕様

  1. 通常応答
  2. 置換
  3. 優先順位
  4. 応答が存在しない場合
  5. 会話の流れ
  6. キー内単語検索機能(Ver.1.60以降)
  7. ニュース機能(Ver.1.40以降)
  8. 応答する確率
  9. ファイルインクルード
  10. 学習
  11. 自動学習
  12. 学習キャンセル
  13. 予約語

■通常応答

例えば以下の辞書の場合、

@{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}:発言者

例)

@{勝負},{name}さんには負けませんよ〜

{wname}:人工無能キャラクタ名

例)

@{名前は},私の名前は{wname}といいます。

{words}:追加単語

comchatq.cgiでは、参加者ファイルと発言ランキングファイルから
名前を抽出してmasuo.plに渡しています。
(誰もいない場合は空白になってしまいます。)
例)

@{恋愛},{1:words}と{2:words}って、ラブラブなの?

{数値Ato数値B}:数値Aから数値Bまでのランダムな数値

例)

@{何歳?},{10to100}才です。

注)数値Aは数値B以下の数値にしてください。

{文字Ato文字B}:文字Aから文字Bまでのランダムな文字

例)

@{クラスは?},3年{A-Z}組です。

注)文字Aはコード上で、文字B以下の文字にしてください。

{reply1〜}:人工無能の前回発言からの単語取得

例)

@{どっち},#1({T名詞})と#2({T名詞})ならどっちがいい?//Fどっちか
@{.+~Fどっちか},私は{reply1}も{reply2}も嫌い〜

{inword1〜}:発言からの単語取得

例)

@{(.+)が},{inword1}がどうしたの?
@{(.+)と(.+)が},{inword1}と{inword2}がどうしたの?

{inword0}:キー内単語検索からの単語取得

例)

@{%T名詞%.*(た|食)べ},{inword0}っておいしいの?

{n:キー}:同単語の使用

例)

@{男},猪木,なすび
@{男前},{1:男}と{2:男}なら{1:男}の方が男前。

戻る