どもどもです。
横浜@黄昏 さんの人工無能「改装」計画、画像の表示のとこが、
ちょうど弄ろうとしてたとこだったので参考になりました。

ってことで、ワタシもお礼になにか…。
うちのは複数ボットはでないので、ボットを股にかけた改装ではなくて、単一ボッ
トの動作の改装ですが。

以前やってみるといってたヤツなんですが(誰も覚えてないでしょうけど (^^;)、
ぼっとと会話してると、毎回同じキーワードに毎回反応してきてうんざりする場
合があります。話してる方もそのうちなんとなく反応がわかってきてしまって、
同じキーで沢山返答を用意していても、どの言葉がキーかわかってしまうとや
はり面白くないです。そこで、辞書自体のヒット率を設定して必ず返答辞書に引
っ掛かる訳では無いようにしてみました。

って言っても、辞書自体が小さい場合には、あると余計アホになるので果たして
有用だと思う人が存るかどうかはチョット疑問無きにしも非ずなんですが (^^;


以下、説明と sub dic 部分のソースです。

下の例では辞書はdic0.dat、dic1.dat…という名前でdic5.datまで六つあります。

	 if(($x >= 1) && ($x < 43)){$dic_number = 1 ;}

って部分の「$dic_number = 」の後の数字が、dic〜.datの"〜"の部分に入る数字
です。

下のコードの処理の手順は、
(1)最初に幾つかの返答辞書から確率指定で選び、該当するキーがあるかどうか探
します。

(2)必ずチェックするキーのはいった辞書をチェックします。必須読み込み辞書
(つまり、従来の dic.dat)は dic0.datになっていて辞書の選択率100%に指定さ
れています。

 ※確率選択の辞書には個々の具体的な言葉の意味に対する返答を置いて、必須
選択の辞書には絶対反応させたいキーワードを置いときます。文末表現とか顔文
字とか感嘆詞とか、個々の言葉でなくて文全体の意味に対する反応みたいなのを
置いておくとイイ感じです。

(3)ボケ辞書を二つのうちどちらかから確率で選択するようになっています。

 ※ボケ辞書の片方は「えぇ〜っと」とか「う〜ん」とかのなんにでも答えにな
りそうな返答ばかりを置いておいて、もう一方にはボットが振ってくる話題を羅
列してます。ボケ辞書も分けた訳は、話題の方は無限に増えるので自然と先の方
のような答えの比率が減ってしまうのを避ける為です。

コードは以下のようになってます。(汚くてスミマセン(^^;)

もし、試して見た方がいて、このままで動かないって時は「{」の数がちゃんとあって
閉じてるか確かめて下さい。確認はしたけどミスってるかも(^^;

#ここから-----------------------------------------------------

sub dic {

$rand_limit = 100 ;

srand(time | $$) ;		# 乱数の初期化
$x = int(rand(1) * $rand_limit) + 1 ;

#(1)ここから確率で選択される返答辞書(dic1.dat、dic3.dat、dic4.dat)

if(($x >= 1) && ($x < 43)){$dic_number = 1 ;}
if(($x >= 43) && ($x < 86)){$dic_number = 3 ;}
if($x >= 86){$dic_number = 4 ;}
$selected_file = "./dic$dic_number.dat" ;
#↑この部分で同じディレクトリ内の"dic(数字).dat"というファイル名で選択

if (!open(handle_dicx,$selected_file)) {
    $chat_tanu = "dic open error.";
} else { 
    @dic=<handle_dicx>;
    close(handle_dicx);
    foreach (@dic) {
        chop;
        ($in,$out)=split(/:/);
        if ($chat =~ /$in/) {
        push(@NEW1,$_);
        }                                    
}                                            
if (@NEW1) {
	($in,$out) = split(/:/,splice(@NEW1, rand @NEW1, 1));	
	$out =~ s/c_name/$name/g;
    $chat_tanu = "$out";
} else {

#(2)ここから必ず引っ掛かる返答辞書(dic0.dat)

if($x >= 1){$dic_number = 0 ;}
$selected_file = "./dic$dic_number.dat" ;

if (!open(handle_dicx,$selected_file)) {
    $chat_tanu = "dic open error.";
} else { 
    @dic=<handle_dicx>;
    close(handle_dicx);
    foreach (@dic) {
        chop;
        ($in,$out)=split(/:/);
        if ($chat =~ /$in/) {
        push(@NEW1,$_);
        }                                    
}                                            
if (@NEW1) {
	($in,$out) = split(/:/,splice(@NEW1, rand @NEW1, 1));	
	$out =~ s/c_name/$name/g;
    $chat_tanu = "$out";
} else {

#(3)ここからボケ辞書の選択(dic2.dat、dic5.dat)

if(($x >= 1) && ($x < 56)){$dic_number = 2 ;}
if($x >= 56){$dic_number = 5 ;}
$selected_file = "./dic$dic_number.dat" ;

if (!open(handle_dicx,$selected_file)) {
	$chat_tanu = "dic open error.";
} else { 
    @dic2=<handle_dicx>;
    close(handle_dicx);
   	($chat_tanu = splice(@dic2, rand @dic2, 1)) =~ s/c_name/$name/g;
   	chop($chat_tanu); 
	}
}}}

#ここまで------------------------------------------------

ランダム関数を使っただけの改造ですが、うちの辞書では結構効果発揮してます。

ついでに画像を発言&リロードのたびにランダムでかえるのも同じ手で出来ますよね。

#ここから--------------------------------------------

$rand_limit = 100 ;
srand(time | $$) ;
$x = int(rand(1) * $rand_limit) + 1 ;
if(($x >= 1) && ($x < 41)){$n_face = "001" ;}
if(($x >= 41) && ($x < 66)){$n_face = "002" ;}
if(($x >= 66) && ($x < 81)){$n_face = "003" ;}
if(($x >= 81) && ($x < 93)){$n_face = "004" ;}
if($x >= 93){$n_face = "005" ;}
$selected_face = "./$n_face.gif" ;

#ここまで------------------------------------------

これで、画像を表示したい部分(EOF以降で)に、

	print <img src=$selected_face>

ってタグをかいとけば、毎回ランダムに画像がかわりますね。

.