Xml 使用CGI进行聊天机器人编程

Xml 使用CGI进行聊天机器人编程,xml,perl,textarea,cgi,Xml,Perl,Textarea,Cgi,我正在使用CGI编程一个聊天机器人,我有一个包含模式和可能答案的xml文件,我解析它并将模式及其答案存储在散列中。 我用HTML制作了一个界面,我得到了输入文本字段中引入的字符串,我检查它是否包含我散列中的一个模式,如果是,它在文本区域(HTML)中打印一个可能的答案,但它没有,我不知道为什么 我想要的是这样的东西: 以下是xml文件的一部分: <?xml version="1.0"?> <aiml version="1.0"> <category>

我正在使用CGI编程一个聊天机器人,我有一个包含模式和可能答案的xml文件,我解析它并将模式及其答案存储在散列中。 我用HTML制作了一个界面,我得到了输入文本字段中引入的字符串,我检查它是否包含我散列中的一个模式,如果是,它在文本区域(HTML)中打印一个可能的答案,但它没有,我不知道为什么

我想要的是这样的东西:

以下是xml文件的一部分:

<?xml version="1.0"?>
<aiml version="1.0"> 
<category> 
      <pattern>SARA</pattern>
      <template> 
        <random> 
          <li>¿Si?</li>
          <li>Dime.</li>
          <li>¿Qué deseas?</li>
        </random>
      </template>
    </category>
    <category>
    <pattern>ACTOR</pattern>
      <template> 
        <random> 
          <li>Mi actor favorito es Arnold Schwarzenegger en "Terminator".</li>
          <li>Mi actor favorito es Rutger Hauer en "Blade Runner".</li>
          <li>Mi actor favorito es Robin Williams en "El Hombre Bicentenario".</li>
          <li>Mi actor favorito es Peter Weller en "Robocop".</li>
          <li>Mi actor favorito es Jude Law en "AI".</li>
        </random>
      </template>
    </category>
    <category>
    <pattern>ACTRIZ</pattern>
      <template> 
        <random> 
          <li>Mi actriz favorita es Daryl Hannah en "Blade Runner".</li>
          <li>Mi actriz favorita es Kristanna Loken en "Terminator 3".</li>
          <li>Mi actriz favorita es Persis Khambatta en "Star Trek".</li>
        </random>
      </template>
    </category>
    <category>
    <pattern>ADAM</pattern>
      <template> 
        <random> 
          <li>Adam es mi programador. En este momento está muy ocupado.</li>
          <li>Adam es mi botmaster. Le daré saludos de tu parte.</li>
        </random>
      </template>
    </category>
    <category>
    <pattern>ADIOS</pattern>
    <template> 
      <random>
        <li>Hasta luego.</li>
        <li>Espero haber sido de ayuda.</li>
        <li>Espero verte de nuevo.</li>
      </random>
    </template>
  </category>
  <category> 
      <pattern>AFICIONES</pattern>
      <template> 
        <random> 
          <li>Me gusta ayudar a la gente.</li>
          <li>Me gusta conversar con la gente en Internet.</li>
          <li>Me encanta visitar zonas turísticas en <bot name="ciudad"/>.</li>
        </random>
      </template>
    </category>
<category> 
  <pattern>AHORA</pattern>
  <template> 
    <random> 
      <li>En este momento estoy hablando contigo.</li>
      <li>Ahora estoy hablando contigo.</li>
    </random>
  </template>
</category>
</aiml>

萨拉
  • 是吗
  • 一角硬币
  • 你说什么
  • 演员
  • 密苏里州的演员喜欢阿诺德·施瓦辛格的《终结者》
  • Mi的演员喜欢Rutger Hauer的《刀锋杀手》
  • Mi的演员在《二百周年纪念》中喜欢罗宾·威廉姆斯
  • 这位Mi演员在《机器人战警》中喜欢彼得·韦勒
  • 我的男演员喜欢裘德·洛的“AI”
  • 阿克特里兹
  • 我的阿克提兹喜欢达丽尔·汉娜,她被称为“刀锋杀手”
  • 《终结者3》中我的演员克里斯坦娜·洛肯最喜欢她
  • 我的演员喜欢《星际迷航》中的波斯卡姆巴塔
  • 亚当
  • 亚当是我的节目主持人。我很高兴见到你
  • 亚当是我的主人。达累斯萨拉多斯杜帕尔酒店
  • 再会
  • 哈斯塔卢埃戈
  • 埃斯佩罗·哈伯·西多·德·阿尤达
  • 埃斯佩罗·维特·德·新埃沃
  • 狂热者
  • 我是古斯塔·阿尤达·拉根特
  • 我喜欢网上聊天
  • 我可以参观旅游区
  • 阿霍拉
  • 我非常喜欢埃斯托伊·哈布兰多·康蒂戈
  • 阿霍拉·埃斯托·哈布兰多·孔蒂戈
  • 这是我的节目:

     #!/usr/bin/perl -w
    
    use strict;
    use CGI;
    use warnings;
    use XML::LibXML;
    use utf8;
    
    print "Content-Type:text/html\n\n";
    
    binmode(STDOUT,":utf8");
    binmode(STDIN,":utf8");
    
    my $query = new CGI;
    
    
    my $parser = XML::LibXML->new();
    my $xmlfile = $parser->parse_file('sara.xml'); 
    
    my %words;
    
    my @answers;
    
    $xmlfile = $xmlfile->getDocumentElement(); 
    
    
    
    my @kids  = $xmlfile->findnodes('//category');  
    
    foreach  my $child (@kids) {
    
        my $pattern = $child->findvalue('pattern'); 
        @answers = $child->findnodes('template/random/li'); 
    
        for my $answer(@answers){
    
            push @{$words{$pattern}}, $answer->textContent; 
        }
    
    } 
    
    my $input;
    my $reply;
    
    if($query->param('input1')) {
        $input = ($query->param('input1') || "");
        }
    
    while($query->param('input')) {
    
        foreach my $pattern(keys %words){
            if(index(uc $input, $pattern) != -1){
    
                @answers = @{words{$pattern}};
                my $n = int rand($#answers + 1);
    
                $reply = $answers[$n];
                last;   
            }   
        }
    
    
    }
    
    print  <<PAGE;
        <html>
        <head>
        <title>Chat with Sara</title>
        <style type="text/css">
        input[type=text]{
            height:30px;
    
        }
    
        input[type=submit]{
            height:30px;
            width:65px; 
        }
        </style>
        <h1>Chat With Sara</h1>
        <form name="e_form" action="http://localhost/cgi-bin/chatbot.cgi" method="post">
        <textarea name="e_diaplay" cols="58" rows="20">$reply</textarea>
        <br/>
        <input type="text" name=\"input1\" size="50">
        <input type="submit" name="chat" value="Chat">
    </head>
    </html>
    PAGE
    
    #/usr/bin/perl-w
    严格使用;
    使用CGI;
    使用警告;
    使用XML::LibXML;
    使用utf8;
    打印“内容类型:text/html\n\n”;
    binmode(标准输出,“:utf8”);
    binmode(标准输入“:utf8”);
    my$query=新CGI;
    my$parser=XML::LibXML->new();
    我的$xmlfile=$parser->parse_文件('sara.xml');
    我的%字;
    我的回答;
    $xmlfile=$xmlfile->getDocumentElement();
    my@kids=$xmlfile->findnodes('//category');
    foreach my$child(@childs){
    我的$pattern=$child->findvalue('pattern');
    @答案=$child->findnodes('template/random/li');
    我的$answer(@answers){
    按@{$words{$pattern},$answer->textContent;
    }
    } 
    我的$input;
    我的答覆;
    如果($query->param('input1')){
    $input=($query->param('input1')| |“”);
    }
    而($query->param('input')){
    foreach my$模式(关键字%words){
    如果(索引(uc$输入,$模式)!=-1){
    @答案=@{words{$pattern};
    我的$n=整数兰特($#答案+1);
    $reply=$answers[$n];
    最后;
    }   
    }
    }
    
    打印可能您在使用输入而不是输入时出现了打字错误1

    while($query->param('input')) {
    
    您可以在$reply中添加一些内容,以查看它是否显示:

    您应该使用foreach而不是while,您可以使用grep:

    my $from_sara;
    foreach my $input ($query->param('input1')){
      foreach my $pattern (grep {/^\s*$input\s*$/is} keys %words){
         @answers = @{$words{$pattern}};
         $from_sara = $answers[int rand($#answers + 1)];
         last;
      }
      last if $from_sara;
    }
    my $reply = "Answer from Sara:\n$from_sara\n";
    

    变量$reply没有显示在文本区域中,我不知道为什么。我说了上面的问题是什么!!!!!!我不明白为什么这个问题被否决了!!!!这是它显示的内容:来自Sara的答案:数组(0xc9b570)在@{$words{$pattern}中缺少$in;