话说当日,靠着机器人(
http://www.cnblogs.com/sukyboor/archive/2007/01/03/610451.html)准备去我师兄那刮几顿吃的。这不,程序作好了,还没认真测,就把它给挂上去了。
一切安装完毕,机器人老老实实,按步就搬的执行传话筒的工作。这会问题来了,群里的人没见过这个qq号,一下子就都问了:qq机器人是谁?
重复回答N多次以后,我决定让机器人再多干点活,毕竟要花很多银子来养它滴(得24小时专门开一台电脑来对付它),只干传话筒的活也太那个啥了。
简单分析了需求,现在已经完成的东西是:
1, 从窗口获取聊天记录
2, 对聊天记录进行了简单的识别,然后放在QQmsg里面,包含了发送者,发送时间,消息内容
3, 把消息整合后,将转换后的内容放入输入框,模拟按按纽操作,把消息发送出去
现在我能想到可以增加的功能(我这人4肢不甚灵活,头脑也超级简单,所以你要想到什么,一定要告诉我):
1, 从消息内容里提取有效信息,存储起来
2, 做个定时任务功能,发个通知啥的。
3, 自动应答,回答一些已经知道的信息
功能2 很简单吧,这里就不详细去说,说了也没个啥劲。功能1和3应该是一个任务,但核心不在这上面,而是怎么去教机器人去识别。
当然,考虑到这是一个非商业性项目,所以不能无限制的扩大,毕竟还得花点精力考虑怎么从老板那里赚点卖力钱。复杂的问题要简单做!但又不能做的太过于简单。至少我是不能忍受做出来的机器人IQ值比我的还低。
下面就简单介绍我的技术实现了。方案是用一个xml文件来教qq机器人怎么识别,识别规则是采用正则表达式的方法实现的,并储存相应结果,在对话中出现可以回答的问题时,由机器人作出应答。
1<doc>
2 <neurite>
3 <questionList>
4 <question>\s*(?<name>.*?)是谁?</question>
5 </questionList>
6 <identifyQuaList>
7 <identifyQua>我[叫是](?<name>.*?)</identifyQua>
8 </identifyQuaList>
9 <identify key="name">
10 <name>我[叫是](?<name>.*?)[\s,,]</name>
11 <sex>(?<sex>[男女])</sex>
12 <old>(?<old>\d+)岁</old>
13 <phone>电话[::,,]*?(?<phone>\d{5,12})</phone>
14 <remark>其它[::,,]*?(?<remark>.*)</remark>
15 </identify>
16 <resultList>
17 </resultList>
18 <responsion>[name],[sex],[old]岁,联系方式:[phone],[remark]</responsion>
19</neurite>
20<doc>
其中:
Neurite节代表一类问题的识别方案。
IdentifyQuaList节代表该类问题识别规则。(是否如果符合正则表达式)
Identify 列出关键数据识别的表达式。
ResultList节用于存储识别出来的信息。(其实存储在数据库里好点)
QuestionList 节表示否可以用该类方案来回答问题。
Responsion 节表示问题的回答方法,即组织一下语言。
我这里有一个已经做好简单示例:
从对话中可以看出,对于可以识别的信息,我们只提取了关键数据。并且设置一个key去作为约束条件。
对比一下这个xml文件在交谈之前和之后的变化,会更直观一些。
对话之前:
1<?xml version="1.0" encoding="utf-8"?>
2<doc>
3 <neurite>
4 <questionList>
5 <question>\s*(?<name>.*?)是谁?</question>
6 </questionList>
7 <identifyQuaList>
8 <identifyQua>我[叫是](?<name>.*?)</identifyQua>
9 </identifyQuaList>
10 <identify key="name">
11 <name>我[叫是](?<name>.*?)[\s,,]</name>
12 <sex>(?<sex>[男女])</sex>
13 <old>(?<old>\d+)岁</old>
14 <phone>电话[::,,]*?(?<phone>\d{5,12})</phone>
15 <remark>其它[::,,]*?(?<remark>.*)</remark>
16 </identify>
17 <resultList>
18 </resultList>
19 <responsion>[name],[sex],[old]岁,联系方式:[phone],[remark]</responsion>
20 </neurite>
21 <neurite>
22 <questionList>
23 <question>\s*(?<name>.*?)是哪里人?</question>
24 </questionList>
25 <identifyQuaList>
26 <identifyQua>(?<name>.*?)是(?<place>.*?)的</identifyQua>
27 </identifyQuaList>
28 <identify key="name">
29 <name>(?<name>.*?)是(?<place>.*?)的</name>
30 <place>是(?<place>.*?)的</place>
31 </identify>
32 <resultList>
33 </resultList>
34 <responsion>[name]是[place]来的</responsion>
35 </neurite>
36</doc>
对话之后:
1<?xml version="1.0" encoding="utf-8"?>
2<doc>
3 <neurite>
4 <questionList>
5 <question>\s*(?<name>.*?)是谁?</question>
6 </questionList>
7 <identifyQuaList>
8 <identifyQua>我[叫是](?<name>.*?)</identifyQua>
9 </identifyQuaList>
10 <identify key="name">
11 <name>我[叫是](?<name>.*?)[\s,,]</name>
12 <sex>(?<sex>[男女])</sex>
13 <old>(?<old>\d+)岁</old>
14 <phone>电话[::,,]*?(?<phone>\d{5,12})</phone>
15 <remark>其它[::,,]*?(?<remark>.*)</remark>
16 </identify>
17 <resultList>
18 <result talker="笨笨" talkTime="2007-1-3 22:52:58">
19 <name>吴小苏</name>
20 <sex>男</sex>
21 <old>16</old>
22 <phone>13148873000</phone>
23 <remark>:暂时在科技圆混</remark>
24 </result>
25<result talker="笨笨" talkTime="2007-1-7 15:18:37">
26 <name>qq机器人</name>
27 <sex>女</sex>
28 <old>0</old>
29 <phone>
30 </phone>
31 <remark>:是小苏开发的群消息转发的电脑程序</remark>
32 </result>
33 </resultList>
34 <responsion>[name],[sex],[old]岁,联系方式:[phone],[remark]</responsion>
35 </neurite>
36 <neurite>
37 <questionList>
38 <question>\s*(?<name>.*?)是哪里人?</question>
39 </questionList>
40 <identifyQuaList>
41 <identifyQua>(?<name>.*?)是(?<place>.*?)的</identifyQua>
42 </identifyQuaList>
43 <identify key="name">
44 <name>(?<name>.*?)是(?<place>.*?)的</name>
45 <place>是(?<place>.*?)的</place>
46 </identify>
47 <resultList>
48 <result talker="笨笨" talkTime="2007-1-3 22:53:49">
49 <name>吴小苏</name>
50 <place>福建</place>
51 </result>
52 </resultList>
53 <responsion>[name]是[place]来的</responsion>
54 </neurite>
55</doc>
这样做的特点是可配置性高,扩充性好。如果你有兴趣,也可以教它更多的学习方法。
当然,这个绝对算不上是什么完美方案。没有把talker以及talkTime放进去是一大垢病。另外一个就是还没有想到让机器人主动学习识别规则的方法。(什么?你有好的方法,那赶紧说啊!)
程序下载:
/Files/sukyboor/SmartQQ.rar