<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>mizzy.org: perl&#12391;&#20154;&#24037;&#28961;&#33075; #1</title>
    <link>http://blog.mizzy.org/articles/2005/06/19/bot01</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description></description>
    <item>
      <title>perl&#12391;&#20154;&#24037;&#28961;&#33075; #1</title>
      <description>&lt;p class="entryBody"&gt;
&#20170;&#22238;&#12399;&#12510;&#12523;&#12467;&#12501;&#36899;&#37782;&#12434;&#21033;&#29992;&#12375;&#12383;&#25991;&#31456;&#12398;&#33258;&#21205;&#29983;&#25104;&#12395;&#12388;&#12356;&#12390;&#32771;&#12360;&#12390;&#12415;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
A &#8594; B &#8594; C &#8594; D &#12392;&#12356;&#12358;&#19968;&#36899;&#12398;&#20107;&#35937;&#12364;&#30330;&#29983;&#12377;&#12427;&#22580;&#21512;&#12395;&#12289;&#12354;&#12427;&#20107;&#35937;&#12398;&#30330;&#29983;&#12377;&#12427;&#30906;&#29575;&#12364;&#12289;&#30452;&#21069;&#12398;&#20107;&#35937;&#12395;&#12398;&#12415;&#20381;&#23384;&#12377;&#12427;&#12424;&#12358;&#12394;&#29366;&#24907;&#12434;&#12289;&#12510;&#12523;&#12467;&#12501;&#36899;&#37782;&#12392;&#12356;&#12356;&#12414;&#12377;&#12290;&#12388;&#12414;&#12426;&#12289;C&#12392;&#12356;&#12358;&#20107;&#35937;&#12364;&#30330;&#29983;&#12377;&#12427;&#30906;&#29575;&#12399;&#12289;B&#12395;&#12398;&#12415;&#20381;&#23384;&#12375;&#12390;&#12356;&#12390;&#12289;B&#12398;&#21069;&#12395;A&#12364;&#36215;&#12371;&#12387;&#12390;&#12356;&#12427;&#12371;&#12392;&#12399;&#20840;&#12367;&#38306;&#20418;&#12394;&#12356;&#12289;&#12392;&#12356;&#12358;&#12371;&#12392;&#12391;&#12377;&#12397;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#12371;&#12398;&#12510;&#12523;&#12467;&#12501;&#36899;&#37782;&#12434;&#21033;&#29992;&#12375;&#12383;&#25991;&#31456;&#12398;&#33258;&#21205;&#29983;&#25104;&#12434;&#34892;&#12358;&#12383;&#12417;&#12395;&#12289;&#12414;&#12378;&#12399;&#12510;&#12523;&#12467;&#12501;&#36899;&#37782;&#12395;&#22522;&#12389;&#12356;&#12383;&#25991;&#31456;&#29983;&#25104;&#29992;&#12398;&#12487;&#12540;&#12479;&#12434;&#20316;&#25104;&#12377;&#12427;&#24517;&#35201;&#12364;&#12354;&#12426;&#12414;&#12377;&#12290;&#12371;&#12398;&#12487;&#12540;&#12479;&#12434;&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12392;&#21628;&#12403;&#12414;&#12377;&#12290;&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12398;&#20013;&#12395;&#12399;&#12289;&#12302;&#12300;A&#12301;&#12392;&#12356;&#12358;&#21336;&#35486;&#12398;&#24460;&#12395;&#12399;&#12300;B&#12301;&#12392;&#12356;&#12358;&#21336;&#35486;&#12364;&#12388;&#12394;&#12364;&#12427;&#12303;&#12392;&#12356;&#12358;&#24773;&#22577;&#12364;&#12383;&#12367;&#12373;&#12435;&#20837;&#12427;&#12289;&#12392;&#12356;&#12358;&#12452;&#12513;&#12540;&#12472;&#12395;&#12394;&#12426;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12398;&#29983;&#25104;&#12418;&#12289;&#21069;&#22238;&#12398;&#12497;&#12479;&#12540;&#12531;&#36766;&#26360;&#12392;&#21516;&#27096;&#12395;&#12289;&#20104;&#12417;&#30330;&#35328;&#12487;&#12540;&#12479;&#29992;&#24847;&#12375;&#12390;&#12362;&#12356;&#12390;&#12289;&#12381;&#12371;&#12363;&#12425;&#29983;&#25104;&#12377;&#12427;&#12371;&#12392;&#12434;&#32771;&#12360;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#20363;&#12360;&#12400;&#12289;&#12300;&#31169;&#12398;&#24687;&#23376;&#12399;&#12459;&#12524;&#12540;&#12497;&#12531;&#12510;&#12531;&#12392;&#35328;&#12358;&#12371;&#12392;&#12364;&#12391;&#12365;&#12378;&#12289;&#12356;&#12388;&#12418;&#12459;&#12524;&#12540;&#12450;&#12531;&#12497;&#12531;&#12510;&#12531;&#12392;&#35328;&#12387;&#12390;&#12356;&#12414;&#12377;&#12290;&#12301;&#12392;&#12356;&#12358;&#25991;&#31456;&#12364;&#12354;&#12387;&#12383;&#22580;&#21512;&#12289;&#24418;&#24907;&#32032;&#35299;&#26512;&#12434;&#21033;&#29992;&#12375;&#12390;&#20197;&#19979;&#12398;&#27096;&#12394;&#12487;&#12540;&#12479;&#12434;&#20316;&#25104;&#12375;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;ul class="entryBody"&gt;
&lt;li&gt;&#31169; &#8594; &#12398;&lt;/li&gt;
&lt;li&gt;&#12398; &#8594; &#24687;&#23376;&lt;/li&gt;
&lt;li&gt;&#24687;&#23376; &#8594; &#12399;&lt;/li&gt;
&lt;li&gt;&#12399; &#8594; &#12459;&#12524;&#12540;&lt;/li&gt;
&lt;li&gt;&#12459;&#12524;&#12540; &#8594; &#12497;&#12531;&lt;/li&gt;
&lt;li&gt;&#12497;&#12531; &#8594; &#12510;&#12531;&lt;/li&gt;
&lt;li&gt;&#65288;&#8230; &#20197;&#19979;&#32154;&#12367; &#8230;&#65289;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class="entryBody"&gt;
&#12392;&#12371;&#12429;&#12364;&#12289;&#12371;&#12398;&#27096;&#12395;1&#23550;1&#12398;&#38306;&#20418;&#12391;&#12487;&#12540;&#12479;&#12434;&#20316;&#25104;&#12377;&#12427;&#12392;&#12289;&#35328;&#33865;&#12364;&#32048;&#20999;&#12428;&#36942;&#12366;&#12390;&#12289;&#12358;&#12414;&#12356;&#12371;&#12392;&#25991;&#31456;&#12395;&#12394;&#12387;&#12390;&#12367;&#12428;&#12394;&#12356;&#30906;&#29575;&#12364;&#39640;&#12367;&#12394;&#12387;&#12390;&#12375;&#12414;&#12356;&#12414;&#12377;&#12290;&#12381;&#12371;&#12391;&#12289;&#36899;&#37782;&#12398;&#26368;&#21021;&#12398;&#37096;&#20998;&#65288;&#12503;&#12524;&#12501;&#12451;&#12463;&#12473;&#12392;&#21628;&#12403;&#12414;&#12377;&#65289;&#12434;2&#12388;&#12398;&#21336;&#35486;&#12391;&#27083;&#25104;&#12377;&#12427;&#27096;&#12395;&#12375;&#12390;&#12289;&#20197;&#19979;&#12398;&#27096;&#12394;&#12487;&#12540;&#12479;&#12434;&#20316;&#25104;&#12375;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;ul class="entryBody"&gt;
&lt;li&gt;&#12300;&#31169;&#12301;&#12300;&#12398;&#12301; &#8594; &#12300;&#24687;&#23376;&#12301;&lt;/li&gt;
&lt;li&gt;&#12300;&#12398;&#12301;&#12300;&#24687;&#23376;&#12301; &#8594; &#12300;&#12399;&#12301;&lt;/li&gt;
&lt;li&gt;&#12300;&#24687;&#23376;&#12301;&#12300;&#12399;&#12301; &#8594; &#12300;&#12459;&#12524;&#12540;&#12301;&lt;/li&gt;
&lt;li&gt;&#12300;&#12399;&#12301;&#12300;&#12459;&#12524;&#12540;&#12301; &#8594; &#12300;&#12497;&#12531;&#12301;&lt;/li&gt;
&lt;li&gt;&#12300;&#12459;&#12524;&#12540;&#12301;&#12300;&#12497;&#12531;&#12301;&#12540; &#8594; &#12300;&#12510;&#12531;&#12301;&lt;/li&gt;
&lt;li&gt;&#65288;&#8230; &#20197;&#19979;&#32154;&#12367; &#8230;&#65289;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class="entryBody"&gt;
&#12371;&#12428;&#12434;2&#21336;&#35486;&#12503;&#12524;&#12501;&#12451;&#12463;&#12473;&#12398;&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12289;&#12392;&#21628;&#12406;&#12381;&#12358;&#12391;&#12377;&#12290;&#12371;&#12428;&#12434;perl&#12398;&#12495;&#12483;&#12471;&#12517;&#12434;&#20351;&#12387;&#12390;&#34920;&#12377;&#12392;&#12289;&#20197;&#19979;&#12398;&#27096;&#12395;&#12394;&#12426;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;pre class="code"&gt;
$data = {
    '&#31169;' =&gt; {
	'&#12398;' =&gt; ['&#24687;&#23376;', ... ],
    },
    '&#12398;' =&gt; {
	'&#24687;&#23376;' =&gt; ['&#12399;', ... ],
    },
    '&#24687;&#23376;' =&gt; {
	'&#12399;' =&gt; ['&#12459;&#12524;&#12540;', ... ],
    },
    '&#12399;' =&gt; {
	'&#12459;&#12524;&#12540;' =&gt; ['&#12497;&#12531;', ...],
    },
    '&#12459;&#12524;&#12540;' =&gt; {
	'&#12497;&#12531;' =&gt; ['&#12510;&#12531;', ...],
    },
    ...
};
&lt;/pre&gt;

&lt;p class="entryBody"&gt;
&#21508;&#36899;&#37782;&#12398;&#26368;&#24460;&#12398;&#37096;&#20998;&#65288;&#12469;&#12501;&#12451;&#12463;&#12473;&#12392;&#21628;&#12403;&#12414;&#12377;&#65289;&#12399;&#37197;&#21015;&#12392;&#12375;&#12390;&#12362;&#12356;&#12390;&#12289;&#23455;&#38555;&#12395;&#25991;&#31456;&#12434;&#29983;&#25104;&#12377;&#12427;&#38555;&#12395;&#12399;&#12289;&#12371;&#12398;&#37197;&#21015;&#12363;&#12425;&#12521;&#12531;&#12480;&#12512;&#12395;&#36984;&#25246;&#12375;&#12414;&#12377;&#12290;&#20363;&#12360;&#12400;&#12289;&#12487;&#12540;&#12479;&#29983;&#25104;&#29992;&#12398;&#30330;&#35328;&#12487;&#12540;&#12479;&#12395;&#12289;&#19978;&#35352;&#12398;&#12459;&#12524;&#12540;&#20113;&#12293;&#12392;&#12356;&#12358;&#30330;&#35328;&#12398;&#20182;&#12395;&#12300;&#31169;&#12398;&#29305;&#25216;&#12399;&#25163;&#12434;&#20351;&#12431;&#12378;&#12395;&#12289;&#21475;&#12395;&#12367;&#12431;&#12360;&#12383;&#12509;&#12483;&#12461;&#12540;&#12434;&#40763;&#12398;&#31348;&#12395;&#20837;&#12428;&#12427;&#12371;&#12392;&#12391;&#12377;&#12290;&#12301;&#12392;&#12356;&#12358;&#25991;&#31456;&#12364;&#12354;&#12387;&#12383;&#22580;&#21512;&#12289;&#20197;&#19979;&#12398;&#27096;&#12394;&#12487;&#12540;&#12479;&#12364;&#29983;&#25104;&#12373;&#12428;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;pre class="code"&gt;
$data = {
    '&#31169;' =&gt; {
	'&#12398;' =&gt; ['&#24687;&#23376;', '&#29305;&#25216;' ],
    },
};
&lt;/pre&gt;

&lt;p class="entryBody"&gt;
&#12371;&#12398;&#12487;&#12540;&#12479;&#12363;&#12425;&#25991;&#31456;&#12434;&#33258;&#21205;&#29983;&#25104;&#12377;&#12427;&#12392;&#12289;&#12300;&#31169;&#12398;&#24687;&#23376;&#12301;&#12414;&#12383;&#12399;&#12300;&#31169;&#12398;&#29305;&#25216;&#12301;&#12391;&#12399;&#12376;&#12414;&#12427;&#25991;&#31456;&#12364;&#29983;&#25104;&#12373;&#12428;&#12427;&#12289;&#12392;&#12356;&#12358;&#12431;&#12369;&#12391;&#12377;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#12391;&#12399;&#12289;&#21069;&#22238;&#12392;&#21516;&#27096;&#12395;&#12289;1&#34892;1&#30330;&#35328;&#12392;&#12356;&#12358;&#12487;&#12540;&#12479;&#12501;&#12449;&#12452;&#12523;&#12363;&#12425;&#12289;&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12434;&#29983;&#25104;&#12377;&#12427;&#12473;&#12463;&#12522;&#12503;&#12488;&#12434;perl&#12391;&#26360;&#12356;&#12390;&#12415;&#12427;&#12392;&#12289;&#20197;&#19979;&#12398;&#27096;&#12395;&#12394;&#12426;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;pre class="code"&gt;
#!/usr/local/bin/perl

use MeCab;
use strict;
use Storable qw(lock_retrieve lock_store);

my $text_file = $ARGV[0];
open(IN, $text_file) or die $!;

my $markov_dic_file = "markov_dic";
my $markov_start_file = "markov_start";
my $markov_dic = {};
my $markov_start = [];

#eval { $markov_dic = lock_retrieve($markov_dic_file); };
#eval { $markov_start = lock_retrieve($markov_start_file); };

my @arg = ($0);
my $m = new MeCab::Tagger(\@arg);

while(&amp;lt;IN&amp;gt;){
    my $n = $m-&gt;parseToNode($_);
    my @s;

    my $start = 0;
    while ($n-&gt;hasNode) {
	if($n-&gt;getSurface){
	    if(!$start){
		push(@$markov_start, $n-&gt;getSurface);
		$start = 1;
	    }
	    push(@s, $n-&gt;getSurface);
	    if($#s &amp;lt; 1){
		if($n-&gt;hasNode){
		    $n = $n-&gt;next;
		    if($n-&gt;getSurface){
			push(@s, $n-&gt;getSurface);
		    }
		} else {
		    last;
		}
	    }
	}

	$n = $n-&gt;next;
	if($n-&gt;hasNode){
	    if($#s eq '1' and $n-&gt;getSurface){
		push(@{$markov_dic-&gt;{$s[0]}-&gt;{$s[1]}}, $n-&gt;getSurface);
		shift(@s);
	    }
	} else {
	    last;
	}
    }
}

lock_store($markov_dic, $markov_dic_file);
lock_store($markov_start, $markov_start_file);

exit;
&lt;/pre&gt;

&lt;p class="entryBody"&gt;
&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12392;&#12392;&#12418;&#12395;&#12289;&#21508;&#30330;&#35328;&#12398;&#26368;&#21021;&#12398;&#21336;&#35486;&#12434;&#25244;&#12365;&#20986;&#12375;&#12390;&#37197;&#21015;&#12395;&#12375;&#12383;&#12418;&#12398;&#12434;&#12289;&#21029;&#12501;&#12449;&#12452;&#12523;&#12392;&#12375;&#12390;&#20445;&#23384;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12398;&#29983;&#25104;&#12399;&#12371;&#12428;&#12391;OK&#12394;&#12398;&#12391;&#12289;&#27425;&#12399;&#12371;&#12398;&#36766;&#26360;&#12363;&#12425;&#25991;&#31456;&#12434;&#29983;&#25104;&#12377;&#12427;&#26041;&#27861;&#12434;&#32771;&#12360;&#12390;&#12415;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#12414;&#12378;&#12399;&#25991;&#31456;&#12398;&#26360;&#12365;&#20986;&#12375;&#12398;&#21336;&#35486;&#12434;&#27770;&#12417;&#12427;&#24517;&#35201;&#12364;&#12354;&#12427;&#12431;&#12369;&#12391;&#12377;&#12364;&#12289;&#12371;&#12428;&#12399;&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#29983;&#25104;&#26178;&#12395;&#12289;&#30330;&#35328;&#12398;&#26368;&#21021;&#12398;&#21336;&#35486;&#12434;&#25244;&#12365;&#20986;&#12375;&#12390;&#37197;&#21015;&#12395;&#12375;&#12390;&#12356;&#12414;&#12377;&#12398;&#12391;&#12289;&#12371;&#12398;&#37197;&#21015;&#12363;&#12425;&#12521;&#12531;&#12480;&#12512;&#12395;&#36984;&#25246;&#12375;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#26360;&#12365;&#20986;&#12375;&#12398;&#21336;&#35486;&#12373;&#12360;&#27770;&#12414;&#12387;&#12390;&#12375;&#12414;&#12360;&#12400;&#12289;&#12354;&#12392;&#12399;&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12398;&#12495;&#12483;&#12471;&#12517;&#12434;&#38918;&#30058;&#12395;&#36799;&#12387;&#12390;&#12356;&#12387;&#12390;&#12289;&#25991;&#31456;&#12434;&#20316;&#12387;&#12390;&#12356;&#12365;&#12414;&#12377;&#12290;&#20363;&#12360;&#12400;&#12289;&#26360;&#12365;&#20986;&#12375;&#12364;&#12300;&#24687;&#23376;&#12301;&#12398;&#22580;&#21512;&#12395;&#12289;&#19978;&#12398;&#12469;&#12531;&#12503;&#12523;&#12495;&#12483;&#12471;&#12517;&#12487;&#12540;&#12479;&#12434;&#21033;&#29992;&#12377;&#12427;&#12392;&#12289;&#12300;&#24687;&#23376;&#12399;&#12459;&#12524;&#12540;&#12301;&#12392;&#12356;&#12358;&#36899;&#37782;&#12364;&#24471;&#12425;&#12428;&#12414;&#12377;&#12290;&#27425;&#12395;&#12300;&#12399;&#12459;&#12524;&#12540;&#12301;&#12434;&#20803;&#12395;&#12375;&#12390;&#12414;&#12383;&#12495;&#12483;&#12471;&#12517;&#12434;&#36799;&#12427;&#12392;&#12289;&#12300;&#12399;&#12459;&#12524;&#12540;&#12497;&#12531;&#12301;&#12392;&#12356;&#12358;&#36899;&#37782;&#12434;&#24341;&#12365;&#20986;&#12377;&#12371;&#12392;&#12364;&#12391;&#12365;&#12289;&#12373;&#12425;&#12395;&#12300;&#12459;&#12524;&#12540;&#12497;&#12531;&#12301;&#12434;&#20803;&#12395;&#12495;&#12483;&#12471;&#12517;&#12434;&#36799;&#12427;&#12392;&#12289;&#12300;&#12459;&#12524;&#12540;&#12497;&#12531;&#12510;&#12531;&#12301;&#12392;&#12356;&#12358;&#36899;&#37782;&#12364;&#24341;&#12365;&#20986;&#12379;&#12414;&#12377;&#12290;&#12371;&#12358;&#12375;&#12390;&#24471;&#12425;&#12428;&#12383;&#36899;&#37782;&#12434;&#32331;&#12366;&#21512;&#12431;&#12379;&#12427;&#12392;&#12289;&#12300;&#24687;&#23376;&#12399;&#12459;&#12524;&#12540;&#12497;&#12531;&#12510;&#12531;&#12301;&#12392;&#12356;&#12358;&#25991;&#31456;&#12395;&#12394;&#12426;&#12414;&#12377;&#12290;&#12371;&#12428;&#12434;&#32368;&#12426;&#36820;&#12375;&#12390;&#12356;&#12387;&#12390;&#12289;&#25991;&#31456;&#12434;&#20316;&#12387;&#12390;&#12356;&#12365;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#30330;&#35328;&#12487;&#12540;&#12479;&#12364;&#35914;&#23500;&#12395;&#12354;&#12428;&#12400;&#12289;&#36899;&#37782;&#12399;&#19968;&#26412;&#36947;&#12391;&#12399;&#12394;&#12367;&#35079;&#25968;&#12395;&#26525;&#20998;&#12363;&#12428;&#12377;&#12427;&#12399;&#12378;&#12391;&#12377;&#12398;&#12391;&#12289;&#12381;&#12398;&#22580;&#21512;&#12399;&#12521;&#12531;&#12480;&#12512;&#12395;&#26525;&#12434;&#36984;&#25246;&#12375;&#12390;&#12356;&#12367;&#12371;&#12392;&#12395;&#12394;&#12426;&#12289;&#29983;&#25104;&#12373;&#12428;&#12427;&#25991;&#31456;&#12418;&#27096;&#12293;&#12394;&#12496;&#12522;&#12456;&#12540;&#12471;&#12519;&#12531;&#12434;&#25345;&#12388;&#12424;&#12358;&#12395;&#12394;&#12426;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#12371;&#12428;&#12434;&#12467;&#12540;&#12489;&#12391;&#34920;&#12377;&#12392;&#12289;&#20197;&#19979;&#12398;&#27096;&#12395;&#12394;&#12426;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;pre class="code"&gt;
package bot;

use base qw(CGI::Application);
use strict;
use Storable qw(lock_retrieve);

my $pattern_dic_file = 'pattern_dic';
my $markov_dic_file = 'markov_dic';
my $markov_start_file = 'markov_start';

sub setup {
    my $self = shift;
    $self-&gt;mode_param('rm');
    $self-&gt;start_mode('bot');
    $self-&gt;run_modes ( bot =&gt; 'bot');
    $self-&gt;param(
		 pattern_dic =&gt; lock_retrieve($pattern_dic_file),
		 markov_dic =&gt; lock_retrieve($markov_dic_file),
		 markov_start =&gt; lock_retrieve($markov_start_file),
		 );

    $self-&gt;header_props(
			-type =&gt; 'text/html',
			-charset =&gt; 'euc-jp',
			);
    $self-&gt;tmpl_path('/home/miya/html/www.mizzy.org/chat');
    
}

sub bot {
    my $self = shift;
    my $input = $self-&gt;query-&gt;param('input');

    my @responder = ('pattern_responder', 'markov_responder');
    my $responder = $responder[int(rand($#responder+1))];

    my $output = $self-&gt;$responder($input);

    my $template = $self-&gt;load_tmpl('bot.html', die_on_bad_params =&gt; 0);
    $template-&gt;param(
		     input =&gt; $input,
		     output =&gt; $output,
		     );
    return $template-&gt;output;
}

sub markov_responder {
    my $self = shift;
    my $input = shift;
    my $markov_dic = $self-&gt;param('markov_dic');
    my $markov_start = $self-&gt;param('markov_start');

    my @words;
    my $p1 = $markov_start-&gt;[int(rand($#{$markov_start}+1))];

    my @p2;
    foreach (keys %{$markov_dic-&gt;{$p1}}){
	push(@p2, $_);
    }

    my $p2 = $p2[int(rand($#p2 + 1))];

    push(@words, $p1, $p2);

    my $cnt;
    while($cnt &amp;lt; 20){
	my $s = $markov_dic-&gt;{$p1}-&gt;{$p2}-&gt;[int(rand($#{$markov_dic-&gt;{$p1}-&gt;{$p2}} + 1))];
	push(@words, $s);
	if($s =~ /&#12290;/){
	    last;
	}
	$p1 = $p2;
	$p2 = $s;
	$cnt++;
    }

    return join('', @words);
}

sub pattern_responder {
    my $self = shift;
    my $input = shift;

    my $pattern_dic = $self-&gt;param('pattern_dic');

    my $output;
    foreach (keys %$pattern_dic){
	if($input =~ /$_/ig){
	    my $num = $#{$pattern_dic-&gt;{$_}};
	    $output = $pattern_dic-&gt;{$_}-&gt;[int(rand($num+1))];
	    last;
	}
    }

    if(!$output){
	$output = "&#20309;&#12381;&#12428;&#65311;";
    }

    return $output;
}

1;
&lt;/pre&gt;

&lt;p class="entryBody"&gt;
&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12434;&#21033;&#29992;&#12375;&#12390;&#24540;&#31572;&#12434;&#36820;&#12377;&#12523;&#12540;&#12481;&#12531;&#12434;markov_responser()&#12289;&#12497;&#12479;&#12540;&#12531;&#36766;&#26360;&#12434;&#21033;&#29992;&#12375;&#12390;&#24540;&#31572;&#12434;&#36820;&#12377;&#12523;&#12540;&#12481;&#12531;&#12434;pattern_responder()&#12392;&#12375;&#12390;&#12289;&#12521;&#12531;&#12480;&#12512;&#12395;&#12524;&#12473;&#12509;&#12531;&#12480;&#12434;&#20999;&#12426;&#26367;&#12360;&#12427;&#27096;&#12395;&#12375;&#12390;&#12356;&#12414;&#12377;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#20170;&#22238;&#12399;&lt;a href="http://mizzy.org/archives/bot/bot.cgi" target="_blank"&gt;&#12469;&#12531;&#12503;&#12523;&#12434;&#20844;&#38283;&#12375;&#12414;&#12377;&lt;/a&gt;&#12290;&#30330;&#35328;&#12487;&#12540;&#12479;&#12399;&#21069;&#12392;&#21516;&#27096;&#12289;&#12372;&#12367;&#31169;&#30340;&#12394;&#12481;&#12515;&#12483;&#12488;&#12394;&#12398;&#12391;&#12377;&#12364;&#12289;&#30330;&#35328;&#12381;&#12398;&#12414;&#12414;&#12391;&#12399;&#12394;&#12356;&#12398;&#12391;&#12414;&#12354;&#12356;&#12356;&#12363;&#12289;&#12392;&#12290;&#65288;&#20844;&#38283;&#12375;&#12390;&#12427;&#12418;&#12398;&#12399;markov_responser()&#12384;&#12369;&#20351;&#12387;&#12390;&#12414;&#12377;&#12290;&#65289;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#12431;&#12426;&#12392;&#26085;&#26412;&#35486;&#12387;&#12413;&#12367;&#12394;&#12387;&#12390;&#12414;&#12377;&#12397;&#12290;
&lt;/p&gt;

&lt;p class="entryBody"&gt;
&#21069;&#22238;&#12398;&#12497;&#12479;&#12540;&#12531;&#36766;&#26360;&#12392;&#12289;&#20170;&#22238;&#12398;&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12398;&#29305;&#24500;&#12434;&#25972;&#29702;&#12375;&#12390;&#12415;&#12427;&#12392;&#12289;&#20197;&#19979;&#12398;&#27096;&#12394;&#24863;&#12376;&#12391;&#12375;&#12423;&#12358;&#12363;&#12290;
&lt;/p&gt;

&lt;dl class="entryBody"&gt;
&lt;dt&gt;&#12497;&#12479;&#12540;&#12531;&#36766;&#26360;&lt;/dt&gt;
&lt;dd&gt;&#29305;&#23450;&#12398;&#12452;&#12531;&#12503;&#12483;&#12488;&#12395;&#23550;&#12377;&#12427;&#12450;&#12454;&#12488;&#12503;&#12483;&#12488;&#12434;&#35373;&#23450;&#12391;&#12365;&#12427;&#12398;&#12391;&#12289;&#27604;&#36611;&#30340;&#20250;&#35441;&#12395;&#12394;&#12426;&#12420;&#12377;&#12356;&#12290;&lt;/dd&gt;
&lt;dd&gt;&#35373;&#23450;&#12375;&#12383;&#25991;&#31456;&#12393;&#12362;&#12426;&#12395;&#36820;&#12377;&#12398;&#12391;&#12289;&#12385;&#12419;&#12435;&#12392;&#12375;&#12383;&#26085;&#26412;&#35486;&#12395;&#12394;&#12427;&#12290;&lt;/dd&gt;
&lt;dd&gt;&#27770;&#12417;&#12425;&#12428;&#12383;&#12497;&#12479;&#12540;&#12531;&#12391;&#12375;&#12363;&#24540;&#31572;&#12375;&#12394;&#12356;&#12398;&#12391;&#12289;&#12496;&#12522;&#12456;&#12540;&#12471;&#12519;&#12531;&#12395;&#20047;&#12375;&#12356;&#12290;&lt;/dd&gt;
&lt;dt&gt;&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&lt;/dt&gt;
&lt;dd&gt;&#25991;&#31456;&#12434;&#36969;&#24403;&#12395;&#32068;&#12415;&#31435;&#12390;&#12427;&#12398;&#12391;&#12289;&#20250;&#35441;&#12395;&#12394;&#12425;&#12394;&#12356;&#12290;&lt;/dd&gt;
&lt;dd&gt;&#12385;&#12419;&#12435;&#12392;&#12375;&#12383;&#26085;&#26412;&#35486;&#12395;&#12394;&#12425;&#12394;&#12356;&#12371;&#12392;&#12364;&#22810;&#12356;&#12290;&lt;/dd&gt;
&lt;dd&gt;&#21336;&#35486;&#12434;&#12400;&#12425;&#12375;&#12390;&#20877;&#27083;&#25104;&#12377;&#12427;&#12398;&#12391;&#12289;&#12496;&#12522;&#12456;&#12540;&#12471;&#12519;&#12531;&#12399;&#35914;&#23500;&#12290;&lt;/dd&gt;
&lt;/dl&gt;

&lt;p class="entryBody"&gt;
&#12381;&#12428;&#12382;&#12428;&#12395;&#27424;&#28857;&#12399;&#12354;&#12426;&#12414;&#12377;&#12364;&#12289;&#21336;&#12395;&#30330;&#35328;&#12377;&#12427;&#12392;&#12356;&#12358;&#30446;&#30340;&#12391;&#12354;&#12428;&#12400;&#12289;&#12381;&#12435;&#12394;&#12395;&#24746;&#12367;&#12394;&#12356;&#12398;&#12391;&#12399;&#12394;&#12356;&#12363;&#12392;&#12290;&#12394;&#12398;&#12391;&#12289;&#24460;&#12399;&#12356;&#12363;&#12395;&#12375;&#12390;&#20250;&#35441;&#12364;&#25104;&#31435;&#12377;&#12427;&#12424;&#12358;&#12395;&#12377;&#12427;&#12363;&#12289;&#12392;&#12356;&#12387;&#12383;&#12392;&#12371;&#12429;&#12391;&#12377;&#12397;&#12290;&#29305;&#12395;&#12510;&#12523;&#12467;&#12501;&#36766;&#26360;&#12398;&#26041;&#12399;&#12289;&#12496;&#12522;&#12456;&#12540;&#12471;&#12519;&#12531;&#35914;&#23500;&#12394;&#12398;&#12364;&#39749;&#21147;&#30340;&#12391;&#12377;&#12364;&#12289;&#20250;&#35441;&#12434;&#25104;&#31435;&#12373;&#12379;&#12427;&#12398;&#12364;&#38627;&#12375;&#12381;&#12358;&#12290;&#20170;&#24460;&#12399;&#12381;&#12398;&#12354;&#12383;&#12426;&#12434;&#37325;&#28857;&#30340;&#12395;&#32771;&#12360;&#12390;&#12415;&#12424;&#12358;&#12290;
&lt;/p&gt;

</description>
      <pubDate>Sun, 19 Jun 2005 21:58:53 +0900</pubDate>
      <guid isPermaLink="false">urn:uuid:88E6E624-FB43-11DB-B19E-9689BF6E4193</guid>
      <author>Gosuke Miyashita</author>
      <link>http://blog.mizzy.org/articles/2005/06/19/bot01</link>
      <category>program</category>
      <trackback:ping>http://blog.mizzy.org/articles/trackback/441</trackback:ping>
    </item>
  </channel>
</rss>
