zhangbo-NLP-plugin_eng/lib/zhangbo/NLP/res_server.pl
#!/usr/bin/perl
use Socket;
use IO::Handle;
use IO::Select;
use IO::Socket::INET;
use lib "./";
use plugin_eng;
use POE qw(Component::Server::TCP);
#use JSON::XS;
use Clone qw(clone);
use Encode;
use Smart::Comments;
use Data::Dumper;
our $rule;
our $fact;
my $n=0;
POE::Component::Server::TCP->new(
Alias => "echo_server",
Port => 28888,
ClientInput => sub {
my ($session, $heap, $input) = @_[SESSION, HEAP, ARG0];
#print "Session ", $session->ID(), " got input: ".$input."\n";
#print "Session ", $session->ID(), " got input: ".length($input)."\n";
my $d;
my $d_seq;
#open(FD_log,">/tmp/engine.log");
#print FD_log "$input\n";
#system("cp $input /tmp/");
print "input file $input",length($input),"\n";
my @res;
my $noshudown=0;
if(length($input)<3){
$_[KERNEL]->yield("shutdown");
return;
}
if($input=~/^(.*?) fact (.*?) (.*)/)
{
my $user=$1;
my $c=$3;
my $torp=$2;
@res=addfact($user,$torp,$c);
}
elsif($input=~/^(.*?) rule (.*?) (.*)/)
{
my $user=$1;
my $c=$2;
my $torp=$3;
@res=addrule($user,$torp,$c);
}
elsif($input=~/^(.*?) clean (.*)/)
{
my $user=$1;
my $c=$2;
@res=search_article($input);
}
else
{
}
$heap->{client}->put(@res);
if($noshudown eq "yes")
{
}
else
{
$_[KERNEL]->yield("shutdown");
return;
}
},
ClientDisconnected => sub {
#print "Client disconnected\n"; # log it
}
#, ClientFlushed => sub {
# my $data_source = $_[HEAP]{file_handle};
# my $read_count = sysread($data_source, my $buffer = "", 65536);
# if ($read_count) {
# $_[HEAP]{client}->put($buffer);
# }
# else {
# print FD_log "------------------error\n";
# $_[KERNEL]->yield("shutdown");
# }
#}
);
POE::Kernel->run;
sub addrule
{
my $user=$_[0];
my $torp=$_[1];
my $c=$_[2];
my @res;
my $tname=0;
my $tplace=0;
my $tnum=0;
my $tnall=0;
my $pos_hash;
my $pos_all;
my $pos_nu;
my $single;
#加入规则库 检验重复
#s所有事实 匹配 看结果集是否增加 如果结果重复 则不累计结果中
# 若有增加 则全体规则参与重新计算,如果新增结果 增加数量大于 总规则数量
if($c !~/\=\>/)
{
$rand_tr=rand();
$c=txt2rule_fuzzy($c);
#modif txt2rule_fuzzy
}
if(exists($rule->{$user}->{$c}))
{
push(@res,"double rule $c\n")
}
my @liftright=split("=>",$c);
if($liftright[0]=~/(.*?)\|(.*)/)
{
$liftright[0]=$1;
my $yueshu_str=$2;
my @tmpat=split("&&",$yueshu_str);
foreach my $tm (@tmpat)
{
if($tm=~/.*? nr/)
{
$tname=1;
}
if($tm=~/.*? ns/)
{
$tplace=1;
}
if($tm=~/.*? nu/)
{
$tnum=1;
}
if($tm=~/.*?guess.*?hobby/)
{
$thobby=1;
}
if($tm=~/.*? n_all/)
{
$tnall=1;
}
}
$yueshu[$nn]=clone(\@tmpat);
## $yueshu
}
my @liftp=split("&&",$liftright[0]);
my $nowid=0;
if(exists($rule->{$user}->{"id"}))
{
$nowid=$rule->{$user}->{"id"}+1;
$rule->{$user}->{"id"}=$nowid;
}
else
{
$rule->{$user}->{"id"}=0;
}
$rule->{$user}->{$nowid}->{"left"}=clone(\@liftp);
$rule->{$user}->{$nowid}->{"right"}=$liftright[1];
$rule->{$user}->{$c}="1";
if(scalar(@{$rule->{$user}->{"left"}})==1)
{
$single=1;
}
my @newres=resallfact($user,$nowid);
foreach my $nr (@newres)
{
if(exists($fact->{$user}->{$nr}))
{
next;}
$fact->{$user}->{$nr}=1;
push(@res,$nr);
}
my $news=0;
while($news>0)
{
@newres=resallfact($nowid);
foreach my $nr (@newres)
{
if(exists($fact->{$user}->{$nr}))
{next;}
$fact->{$user}->{$nr}=1;
$news++;
push(@res,$nr);
}
}
@res;
}