话说当日,靠着机器人(
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