cc.net

起于C,兴于asp,盛于php,折于java,成于.net
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

用.NET开发MSN聊天机器人

Posted on 2006-11-21 15:47  cc校友录 校友录建设专家  阅读(664)  评论(1编辑  收藏  举报
MSN聊天机器人开发揭秘。
 写在前面:
我不是开发人员,不是高手,就是自己比较爱玩。在技术上,没有什么喜欢摸索的精神,而是喜欢投

机取巧。在这篇文章里,你也不能”少劳而获”地通过我的机器人修改出一个自己的机器人,因为自己觉得

程序写的比较臭,所以不会open source。但是,如果你对.net或者C#有点了解的话,相信从这篇文章里

,你可以找到一切所需的资源,来开发一个自己的,绝对可用的msn机器人。要和我的机器人聊天,可以

tbot01@hotmail.com,名字叫“塔奇克马”,是从动画片攻壳机动队得名。同时,你也可以去

http://www.guanqun.com,那里有一个和这个MSN机器人一样的网页聊天机器人,可以先聊聊看,尽量用

中文聊。

这不是一篇新手入门的文章,如果你不知道什么是.NET,不了解数据库方面的哪怕是一丁点东西,建

议你先看看。同时,也希望真正的高手不要笑话打击我,毕竟一个普通的,非开发人员的电脑爱好者通过

摸索,并告诉大家怎样做一个好玩的东西,不是一件错事。

一、为什么要做MSN聊天机器人

1 我能想到的原因

最重要的是因为很好玩。你的MSN机器人说的话,一定体现你的性格(如果你希望这样的话)。当然

,这是我的理由,作这个机器人的初衷仅仅是突然有一天自己想做。也许你也希望你的机器人可以帮助你

做一些事情,类似一个专家系统或是客服系统等等。

2 现在的MSN聊天机器人

现在MSN机器人有很多,如果你加过MSN机器人,我想你列表上最多的是一个叫做“小布”或者是他兄

弟姐妹一大堆的家伙们(http://www.9zi.com),可能基于负载的考虑,每次上线你都可能被他们一家子的

一堆加入好友的请求包围。还有一些所谓的“免费短信”机器人,我一直就是做SP的,我直接说,为了不

耽误你们赚钱,我不对这种机器人加以什么评论。可以提一下MsgerAI(msgerai@hotmail.com)这个机器

人,开发它的这位老兄非常希望做一个可以像人一样具有智能的东西,虽然可能在他有生之年都无法完成

,不过我还是祝他成功。毕竟有梦想就是好的,而且这个机器人现在也可以为他完成些工作

(http://www.funnyok.net/nlp)。还有一些其他的MSN机器人,比如专门提供信息查询服务的,帮你搜索

google的等等。MSN进行时里面有列表(http://www.msning.com),自己去看看就好了。

二、为什么用.NET

其实理由很简单。C#和Java很像,但是Java我实在找不出一个非常好用的,符合自己使用习惯的IDE

来。而C#就不同,Vs.NET(http://msdn.microsoft.com/vstudio/) 当然最好用,C# Builder

(http://www.borland.com/csharpbuilder/)也不错,连SharpDevelop

(http://www.icsharpcode.net/OpenSource/SD/)用起来都相当舒服。所以选择.NET比较好。

另外,.NET在开发上非常方便,只要你有一点点开发基础,用.NET写程序就不是很难。我是站在一个

使用者而非开发者的角度,不用去钻研太多技术层面,或是优化的东西,我没那能力也不想进微软研究院



建议你使用最新版Visual Studio.NET,可以省去很多麻烦的事儿。

同时,.NET开发可以找到的资源也有很多,我们接下来会提。

三、你要一个什么样的聊天机器人

1 开发前的设想

我这里讨论的就是“聊天机器人”这个概念,意思是,他能做的就是陪你聊天。你要有一个程序去“

教”他说话,同时要让他明白话语中包含的大概意义,还能够做基本上不怎么离谱的回答。

2 还可以让他做什么

你还可以让他做很多其他的事情,比如查询ip,手机号码,注册号,航班号,或者直接让他去查

google,帮你搜索。这些也都不是什么麻烦的事情,只要你想。

四、先让机器人开口说话

不管你的机器人聪不聪明,让他能在MSN上象摸象样地回答是最重要的。所以,你需要有一个MSN帐号

,连接到MSN服务器,取得各种服务器的消息,同时发送消息回服务器。

当然,你可以分析MSN的协议(http://www.hypothetic.org/docs/msn/index.php),自己写通讯部

分。不过我提过,我是个喜欢投机取巧的人,所以,找个能用的接口用就好了。所以,我找了些MSN的开

发接口。

MSNHelper:
http://sourceforge.net/projects/msnphelper/

dotMSN:
http://members.home.nl/b.geertsema/dotMSN/

这两个都是为.NET开发的,我用dotMSN,它使用MSNP8协议。注意dotMSN不要用sourceforge上的版本

,要用上面给出的地址。
接下来,下载这个例子:
http://members.home.nl/b.geertsema/dotMSN/…ple/Example.zip

用vs.net打开,编译,执行。

看懂了吧。登录之后随便双击列表上的某个人,会发送给这个人一句”Hello world!”。你已经可以不

通过MSN原来的程序,而直接和人说话了。

这部分的代码是这样的:

private void ContactJoined(Conversation sender, ContactEventArgs e)
{
// someone joined our conversation! remember that this also occurs when you are
// only talking to 1 other person. Log this event.
Log.Text += e.Contact.Name + ” joined the conversation.\r\n”;

// now say something back. You can send messages using the Conversation object.
sender.SendMessage(”Hello world!”);
}

意思是当对方加入聊天后,你就给他发一个”Hello world!”的消息过去。这时候如果你列表上的人双

击你的名字,也同样会收到一个Hello World!。

五、让机器人懂中文

1 数据库

因为我们要做中文聊天机器人,语料库的大小直接关系到你的机器人是不是聪明。由于自己的习惯,

我用了mysql作为存放语料库和中文分词库的数据库。而且mysql速度极快。当然,你要用Access或者Sql

Server,完全可以,而且更容易些。.NET调用Mysql的库可以在这里找到MySQL Driver CS
http://sourceforge.net/projects/mysqldrivercs/


2 整句匹配

整句匹配这个概念很简单。聊天嘛,不认识的人一般都会要上来就说“你好”,或者“hi~~”之类的

。这种话通常很简单,而且没有什么太多的变化,直接让机器人回答就行了。比如对方说“你好”,机器

人看到这个“你好”,就直接回答“你好”,就可以了。或者对方说”88″,你可以让机器人说“再见”,

或者88什么的。。这就叫整句匹配。就是机器人拿到整个的句子,在库里面一查,啊,库里有这句话怎么

回答,挑出一句回答过去,对方不会觉得这个机器人笨。

甚至如果对方说“你好笨”,你让机器人回答“我才不笨呢”,对方一定会觉得,这个机器人还行,

还知道别人说他笨。

3 中文分词

一个聊天机器人当然要懂些中文。中文处理的基础就是中文分词。分词是什么?“分词就是将连续的

字序列按照一定的规范重新组合成词序列的过程。”这个定义是我抄的。请查阅这篇文章:

http://www.hylanda.com/center/knowledge.htm 他们做中文分词应该有一定成绩。国内的分词系统,

ICTCLAS做得也比较好。有VC的源代码,可以下来看看。
http://www.nlp.org.cn/project/project.php?proj_id=6

有人会说,这个东西我不懂,我也没研究过。其实我也不懂。只不过,如果不做中文分词,聊天机器

人就只能停留在证据匹配的地步。我们可以使用最大匹配法,对聊天机器人接收到的话做简单的分词。关

于算法,请参阅詹卫东先生的这个讲义,估计你一看就明白了。
课程名称:中文信息处理基础
http://ccl.pku.edu.cn/doubtfire/Course/Chi…2002_2003_1.htm
下载这个PPT讲义:http://ccl.pku.edu.cn/doubtfire/Course/Chinese%20Information%

20Processing/contents/Chapter_07_1.ppt
分词算法不需要太复杂,简单点就好。
另外分词算法需要一个中文分词库。我提供了一个mysql的,这里可以下载。导入到你的mysql里面就

可以。其他数据库其实把sql语句简单改改也可以用。
中文分词库下载:http://www.guanqun.com/down/wordlist.rar
4 词语的匹配
仅仅会分词还不够,如果真的要让机器人了解人说的话,肯定需要一些人工智能的算法。我们就是做

个机器人玩玩,没必要研究的那么深。人工智能走到现在,太聪明的聊天机器人也少之又少。而且,让专

业的研究人员去研究就好了,我们仅仅就是玩玩。所以呢……我们就用一个最简单的办法。我们的方法是

,让机器人找这一句话的关键词,这句话大概的词性搭配,再去语料库里面找到符合这样规则的回答的话



举个简单的例子:
比如对方说:
“你真好玩”
我们先用分词算法,把这句话分成
“你 真 好玩”,
然后找出关键词“好玩”。同时把这句话的词性搭配也记录下来。 这样,当找到关键词“好玩”在

语料库中的时候,我们再来找是否有类似这这句话词性搭配的回答,如果有,随机回答出一句:“哈哈。

。。我就喜欢你这么说。”,这样,可以给聊天者比较好的感觉。

那么问题来了,如何找出关键词呢? 我的方法是……(比较烂,但是通常有效),找出这句话中长

度最长的词作为关键词。没有为什么,因为这样速度会快些。如果一句话中所有的词都被扫描成为关键词

,再去查库,会出现些匹配上的问题。(不科学,但是通常有效)。