人机对话系统

人机对话系统,第1张

概述分词,找关键字,然后到库中去查找这个的回答,然后回答。感觉是这样。。 ---------------------------华丽转载分割线-------------------     此篇文章是我在别人基础上写的,加强了一些自身的体验 我采用的是VS.NET+SQLSERVER 参考了小i机器人 这不是一篇新手入门的文章,如果你不知道什么是.NET,不了解数据库方面的哪怕是一丁点东西,建议你先看

分词,找关键字,然后到库中去查找这个的回答,然后回答。感觉是这样。。

---------------------------华丽转载分割线-------------------

 

 

此篇文章是我在别人基础上写的,加强了一些自身的体验
我采用的是VS.NET+sqlSERVER 参考了小i机器人
这不是一篇新手入门的文章,如果你不知道什么是.NET,不了解数据库方面的哪怕是一丁点东西,建议你先看看。同时,也希望真正的高手不要笑话打击我.

让机器人懂中文

1 数据库

因为我们要做中文聊天机器人,语料库的大小直接关系到你的机器人是不是聪明。由于自己的习惯,我用了sqlSERVER作为存放语料库和中文分词库的数据库。因为我调用的是组件,所以没用建分词库,只有1个语料库


2 整句匹配

整句匹配这个概念很简单。聊天嘛,不认识的人一般都会要上来就说“你好”,或者“hi~~”之类的。这种话通常很简单,而且没有什么太多的变化,直接让机器人回答就行了。比如对方说“你好”,机器人看到这个“你好”,就直接回答“你好”,就可以了。或者对方说"88",你可以让机器人说“再见”,或者88什么的。。这就叫整句匹配。就是机器人拿到整个的句子,在库里面一查,啊,库里有这句话怎么回答,挑出一句回答过去,对方不会觉得这个机器人笨。

甚至如果对方说“你好笨”,你让机器人回答“我才不笨呢”,对方一定会觉得,这个机器人还行,还知道别人说他笨。

3 中文分词

一个聊天机器人当然要懂些中文。中文处理的基础就是中文分词。分词是什么?“分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。”这个定义是我抄的。因为我是用.net开发,我用的分词是以下几种 KTDictSeg中文分词组件,IKAnalyzer中文分词组件,
Lucene.Net分词组件,

有人会说,这个东西我不懂,我也没研究过。其实我也不懂。只不过,如果不做中文分词,聊天机器人就只能停留在证据匹配的地步。我们可以使用最大匹配法,对聊天机器人接收到的话做简单的分词。关于算法,请参阅詹卫东先生的这个讲义,估计你一看就明白了。

课程名称:中文信息处理基础

http://ccl.pku.edu.cn/doubtfire/

下载这个PPT讲义:http://ccl.pku.edu.cn/doubtfire/Course/Chinese%20Information%20Processing/contents/Chapter_07_1.ppt

分词算法不需要太复杂,简单点就好。


--------------------------------------------------------------------------------

用.NET开发MSN聊天机器人
分词我用的是组件,因为太难了,所以愿意偷懒的朋友们可以用组件,不想偷懒的可以去
http://ccl.pku.edu.cn/doubtfire/
研究一下语言学

4 词语的匹配

仅仅会分词还不够,如果真的要让机器人了解人说的话,肯定需要一些人工智能的算法。我们就是做个机器人玩玩,没必要研究的那么深。人工智能走到现在,太聪明的聊天机器人也少之又少。而且,让专业的研究人员去研究就好了,我们仅仅就是玩玩。所以呢……我们就用一个最简单的办法。我们的方法是,让机器人找这一句话的关键词,这句话大概的词性搭配,再去语料库里面找到符合这样规则的回答的话。

举个简单的例子:
比如对方说:

“你真好玩”

我们先用分词算法,把这句话分成

“你 真 好玩”,

然后找出关键词“好玩”。同时把这句话的词性搭配也记录下来。 这样,当找到关键词“好玩”在语料库中的时候,我们再来找是否有类似这这句话词性搭配的回答,如果有,随机回答出一句:“哈哈。。。我就喜欢你这么说。”,这样,可以给聊天者比较好的感觉。

那么问题来了,如何找出关键词呢? 我的方法是……(比较烂,但是通常有效),找出这句话中长度最长的词作为关键词。没有为什么,因为这样速度会快些。如果一句话中所有的词都被扫描成为关键词,再去查库,会出现些匹配上的问题。(不科学,但是通常有效)。
这个找关键词的问题我一直没有解决,希望有高手知道的+我,我的QQ是329670021

五、让机器人再“聪明”些

1 整句匹配语料库的设计

第一步当然是做你的整句匹配语料库。语料库都要自己写的,不要偷懒。找出别人最常说的话,比如你好谢谢对不起什么的,多放些回答在里面,免得每次回答都是一样的,然后要回答的时候,先写一句sql来查询,如

这个是MysqL的:select * from reply where `key` = '"+sentense+"' order by rand() limit 1

但是我用的是sqlSERVER
取值的时候如果有一个关键字有N的答案的时候用SQL语句
select top 1 answer from robotchat where keyword = '" + a + "' order by newID()
随机取出一条,这样机器人就不会对一个问题只答一句话了
所以就要从数据库里取出值之后,在程序那边用indexof来判断.
如if (问题.IndexOf(关键字.ToString()) >= 0)

把找到的话直接回复过去就可以了。如果找不到整句匹配,再做分词处理。

2 分词匹配语料库的设计

因为我们分词算法也没有经过什么优化,同时,我们找出关键字的办法也不是那么的好,所以,你给出的回答一定要不那么清晰。说白了就是,回答的话要有些“含糊不清”才可以。目标就是,让人觉得机器人对他说的话已经理解了,回答出来的还算比较“对路”。不要求100%对路,只要有40%以上对路,聊天的人基本就可能会接受。同时,回答的语料库,最好可以引导对方再次回答的时候,可以说出你语料库里面有的,最好是可以整句匹配的句子。

举个好玩的例子:

问题:你是男的还是女的?/你是男的还是女的/你是男的还是女的? (是否有标点符号没关系,我们要记录句子的词性搭配,同时,要对标点符号做些处理)

像这样一句话,我们可以通过分词,找出关键词:“还是”,而且通过判断词性,可以知道,这是一句问句。而且问的是在两种情况之间选择。(当然,我们通过简单的算法,没法知道这句话其实是问性别)

对于这样的问题,你的机器人怎么回答?其实很简单,首先,回答要“对路”,尽量不让人觉得答非所问,至少让人觉得,你的机器人是知道对方在问什么的。所以,我的机器人这样回答:

机器人回答:都是。。。哈哈

因为回答的是聊天用语,而且带点开玩笑的意味,所以会使聊天者觉得,这个机器人还不是那么笨。

这只是一个简单的例子。很多具体的句子还得你自己去分析。当然,语料库越多,机器人懂的就越多,也就越聪明了。假如你不懂如何让自己语料库更强大,你可以把回答不出的问题存入数据库中,然后给别人玩,这样就可以找出别人回答不出的问题了

可以参考小i机器人的回答,www.xiaoi.com


3 匹配不到关键字怎么办

语料库不是很多的情况下,很可能我们的分词算法匹配不到合适的回答来应付。所以我们还要另外做一个语料库,用来在实在匹配不到关键词的时候,进行回答。这样的回答比较需要类似“算卦”的人的回答技巧,因为对方可能说任何话,而我们的机器人不明白。所以,要想办法“蒙混过关”,同时,尽量引导对方向你机器人可能回答的方面说。你可以试着跟“小布”聊聊天,会发现它回答不出来的时候,就会随便挑一句“佛经”来说。

其实最重要的一个技巧就是,学习一下算卦的人说的话,都是云里雾里的,让人摸不到头脑,还觉得可能是对的。我们就要让机器人学习这种技巧,来达到看上去“聪明”的目的。


最后的话:
其实写这样的一个机器人程序很快的,如果熟悉些的话,估计一天应该就可以写出来。我大概用了一天半,还加上准备些语料库的时间。如果你真想做个稍稍“聪明些”的机器人来玩,这篇文章应该可以为你剩下至少3-5个小时的找资料的时间。如果你懒得自己研究,也有别的公司做的只能整句匹配的程序可以下载,自己下一个玩玩也就算了。

 

 

 

---------------------------------------------转自http://hi.baidu.com/alalmn/blog/item/6bccf4c8d120e21a7f3e6fde.html

总结

以上是内存溢出为你收集整理的人机对话系统全部内容,希望文章能够帮你解决人机对话系统所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1178772.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存