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