智能聊天机器人
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
WebRequestweb ;
WebResponseres;
privatevoidForm1_Load(objectsender,EventArgse)
{
richTextBox1.AppendText("Simsimi:hi你好,我是小黄鸭,可以Hale Waihona Puke Baidu您聊天?呢?~~\n");
this.textBox1.Focus();
这个比较容易,只要登录Simsimi的官方网站就可以用自己的邮箱进行申请,有付费和免费7天测试,本小组申请7天测试的API查看的Key,具体由后面的截图(付费的,可申请免费7天测试,每天可以对话100次)
3.4生成项目
因为已经下载源代码了,所以我们可以将源代码生成项目,同时生成exe后缀的可执行文件,由截图展示
[assembly:AssemblyVersion("1.0.0.0")]
[assembly:AssemblyFileVersion("1.0.0.0")]
5.2Form1.cs文件
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
二、小黄鸭的原理
AI聊天机器人小黄鸡的工作可以被分成两个部分:训练+匹配。(其实很多AI的东西都可以被这么划分,比如人脸识别,语音识别等等)
2.1训练
Simsimi中的“教学”,就是训练的过程,目的在于构建或是丰富词库。
流程描述如下:
S1:用户通过教学界面向系统提出一个话题与相应应答;
S2:系统对该话题进行分词,判断该话题在系统知识库中应存放的位置;
Char[] read =newChar[256];
intcount = sr.Read(read, 0, 256);
while(count > 0)
{
str =newString(read, 0, count);
count = sr.Read(read, 0, 256);
}
returnstr;
}
catch(Exceptionex)
S2:系统在知识库中用刚才说的哈希函数f(埃菲尔铁塔上),找到比如[埃,11,P]的表项,顺着指针找到6字词的索引,顺着索引找到6字词表,遍历词表,找到<埃菲尔铁塔上,…>结构体;
S3:系统随机选择该结构体Ans域中的一个回答(也有可能是根据频率高低来选择)。比如“两年之后等着你”。
S4:输出回答,匹配结束。功时重新切取的策略,机械分词法可以分为增字法和减字法。
举个栗子:我想将[0,100)做成一个哈希表,选取“模10”作为散列函数,以数组作为存储单元,则得到A[10][10]的数组,A[0]里依次存着0,10,20…90;A[1]里存着1,11,21…91。依次类推。
现在举一个训练小黄鸭的例子:我教小黄鸭说“大白天的做什么美梦啊?”回答是“哦哈哈哈不用你管”。
}
privatestringSim(stringtext)
{
try
{
Stringstr="";
web =WebRequest.Create("http://sandbox.api.simsimi.com/request.p?key="+"38eb636b-d78a-4955-be7c-1b021f5905f5"+"&lc=ch&ft=1.0&text="+ text);
基于词典的“双向最大匹配”法是目前中文信息处理中最简单有效的方法,有这样的统计:汉语文本中90%左右的句子,其与双向最大匹配的结果相吻合,而且是正确的分词结果。当正、反向最大匹配算法得出来的切分结果不一样时,就必须对其进行歧义处理,在此不再赘述。
三、属于自己的小黄鸭制作(简要步骤+截图说明)
3.1代码编写
S3:对上一步分词得到的结果进行比较,判断是否存在歧义,如果存在歧义,就进行一定的歧义消解;
S4:重复S2、S3,直到处理完步骤一中断句所切分出的所有句子单元。
算法流程如图所示:
这里给出与小黄鸭对话的例子:我问小黄鸭:“埃菲尔铁塔上45度角仰望星空”。
S1:双向最大匹配分词:正向反向均为《埃菲尔铁塔上,45度角,仰望星空》,没有歧义。长词优先,系统选择了“埃菲尔铁塔上”作为关键词;
3.5修改源代码
利用已经获得的Key修改源代码,同时将Simsimi的网络地址接入代码【生成项目中自动有Windows相关网络组件,可自动搜索网页】
3.6修改项目其他项
四、文档附件说明
(以上3图是进入官方网站进行申请API Key的截图)
(以上两图是利用VS2010进行的项目的生成截图)
(以上两图是部分中的代码修改或接口添加截图) (以上三图是界面生成及运行效果截图)
因为源代码已经公开了,所以我们可以下载源代码就可以,如果不熟悉源代码所用的语言,就像我们组那样,我们要做的就是接下开了解这种语言的基本操作和接口怎么编程
3.2构建运行环境
之前采用的是VS2008,由于版本或者安装的原因生成的项目总是失败,后来更换为VS2010,当然也可以是其他的运行环境
3.3申请获取官方APIKey
//
//主÷版?本?
//次?版?本?
//生Θ?成é号?
//修T订?号?
//
//可é以?指?定¨所ù有瓺这a些?值μ,?也?可é以?使?用?“°生Θ?成é号?”±和í“°修T订?号?”±的?默?认?值μ,?
//方?法ぁ?是?按恪?如?下?所ù示?使?用?“°*”±:
// [assembly: AssemblyVersion("1.0.*")]
其具体流程如下:
S1:预处理阶段,按照特殊字符(英文字母、数字、标点符号等)将待分析文本进行断句,将待切分的文本切分为只有中文的短句子,这些句子是下一步分词处理的基本单位;
(举个例子:输入“asdfadf东北师范大学哈哈哈dfadflakfl(*^__^*)嘻嘻……”,simi只会对其中的中文“东北师范大学哈哈哈嘻嘻”做出响应;输入“(*^__^*)”时,输出“I have no response.”)
{returnex.ToString(); }
res = web.GetResponse();
Streamreceive = res.GetResponseStream();
Encodingencod = System.Text.Encoding.UTF8;
StreamReadersr =newStreamReader(receive, encod);
S3:将结构体<大白天,…>插入队尾。体中有一个Ans域,域中某一指针指向“哦哈哈哈不用你管”。
S4:完成训练。
2.2匹配
可以被描述成如下流程:
S1:用户通过聊天界面向系统提出一个话题;
S2:系统对该话题进行分词处理;
S3:在系统知识库中寻找与该话题匹配的话语回复用户。基于词典的分词算法分为词典加载、预处理、最大匹配、歧义消解几个阶段。
usingSystem.IO;
usingSystem.Runtime.Serialization.Formatters;
usingSystem.Configuration;
namespaceSimsimi
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
[assembly:AssemblyDescription("")]
[assembly:AssemblyConfiguration("")]
[assembly:AssemblyCompany("")]
[assembly:AssemblyProduct("Simsimi")]
[assembly:AssemblyCopyright("Copyright © 2014")]
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Web.Script.Serialization;
usingSystem.Net;
S3:在系统知识库中添加该话题及相应应答。
可以看到,这里涉及到两个问题:给出一个话题,系统是如何分词的?词库要如何设计才能又快又准地应答?
2.1.1分词方法
有人认为我教小黄鸭“埃菲尔铁塔上45度角仰望星空”回答是“呵呵”,那下次它再看到“埃菲尔铁塔上45度角仰望星空”整句话的时候才会有相应回答。但实际上,下次只要它看到“埃菲尔铁塔”就会“呵呵”了好嘛。
S2:对断句出来的句子进行双向最大匹配(双向匹配,长词优先)分词,分词后的结果作为S3的输入;
(举个栗子:输入“东京古巴比伦”,正向与反向切词结果均为《东京,古巴比伦》,长词优先,所以simi只对“古巴比伦”做出响应;输入“古巴比伦埃菲尔铁塔”,正向与反向切词结果均为《古巴比伦,埃菲尔铁塔》,此时Simi对“埃菲尔铁塔”做出响应)
S1:应用双向最大匹配算法分词:双向分词结果,正向《大白天,的,做什么,美梦,啊》;反向《大白天,的,做什么,美梦,啊》。正向反向都是一样的,所以不需要处理歧义问题。长词优先选择,“大白天”和“做什么”。
S2:以“大白天”举例,假设hash函数为f(),并设f(大白天)指向首字hash表项[大,11,P]。于是由该表项指向“3字索引”,再指向对应“词表”。
这是因为聊天机器人的存储并不以句子为单位(那样太费时费空间),而是以词。于是,分词,几乎成为聊天机器人的核心。
英文分词好说,人家用空格什么的就搞定了,但中文不一样,对于一句话,人们可以用自己的认识区分词语,而机器人要怎么做,就是中文分词算法的研究范畴了。
中文分词技术俨然是一个重要的研究方向,隶属于自然语言处理。现有的分词算法可以分为三大类:基于字符串匹配的分词方法、基于统计的分词方法和基于理解的分词方法。
智能聊天机器人(小黄鸭)软件开发
课程名:模糊系统
小组成员:曹杰何敢谢新明
任课教师:於世为
、
一、小黄鸭的背景
小黄鸭是根据人人网上的小黄鸡为模板,而进行的一个开发,小黄鸭与小黄鸡应该来说是一样的,小黄鸭智能聊天机器人也是一样采用通过调用韩国智能聊天机器人Simsimi的数据库来,当然,前提是获取到了网络接口(这个应该很容易),进而实现计算机和软件之间的通信
首字Hash表通过一次哈希运算就可以直接定位汉字在表中的位置。一个单元包括三项内容:C:存储首字;F标志位:存储以C为首字的最长词条的长度;P:指向词表索引表。
解释一下哈希:散列表Hash table,也叫哈希表,顾名思义就是把数据都打散了,再按一定规律存起来,加快访问速度。是根据关键码值Key而直接进行访问的数据结构。
[assembly:AssemblyTrademark("")]
[assembly:AssemblyCulture("")]
[assembly:ComVisible(false)]
[assembly:Guid("3b0ec051-b3a4-417f-ac3e-232019c8991d")]
//程ì序ò集ˉ的?版?本?信?息¢由?下?面?四?个?值μ组哩?成é:
2.1.2词库设计
由于中文词的特点:1.中文词是一个开放集,词数在增长;2.以不同字开头的词的数目变化很大,多的达到数百个,少的也有可能只有一个或者没有;3.词的长度变化也很大,有单字词,也有由六、七个字成词的。这就要求在设计词典时,除了考虑访问效率外,还得充分考虑存储利用率。请看这种数据结构,就能很好地平衡时间与空间。
五、小黄鸭代码(含小组接口设计)
5.1 AboutBox1.cs文件
usingSystem.Reflection;
usingSystem.Runtime.CompilerServices;
usingSystem.Runtime.InteropServices;
[assembly:AssemblyTitle("Simsimi")]
用户在聊天时的一个显著特点是所提出的话题一般都是比较短小的,而不是长篇大论,不具有段落篇章结构,绝大多数就是少数几句话。基于统计的分词方法适用于有段落、篇章结构以及上下文关系的文段。基于理解的分词方法目前并不成熟,且时间复杂度高,速度慢。于AI聊天机器人小黄鸡的工作可以被分成两个部分:训练+匹配。(其实很多AI的东西都可以被这么划分,比如人脸识别,语音识别等等)
WebRequestweb ;
WebResponseres;
privatevoidForm1_Load(objectsender,EventArgse)
{
richTextBox1.AppendText("Simsimi:hi你好,我是小黄鸭,可以Hale Waihona Puke Baidu您聊天?呢?~~\n");
this.textBox1.Focus();
这个比较容易,只要登录Simsimi的官方网站就可以用自己的邮箱进行申请,有付费和免费7天测试,本小组申请7天测试的API查看的Key,具体由后面的截图(付费的,可申请免费7天测试,每天可以对话100次)
3.4生成项目
因为已经下载源代码了,所以我们可以将源代码生成项目,同时生成exe后缀的可执行文件,由截图展示
[assembly:AssemblyVersion("1.0.0.0")]
[assembly:AssemblyFileVersion("1.0.0.0")]
5.2Form1.cs文件
usingSystem;
usingSystem.Collections.Generic;
usingSystem.ComponentModel;
二、小黄鸭的原理
AI聊天机器人小黄鸡的工作可以被分成两个部分:训练+匹配。(其实很多AI的东西都可以被这么划分,比如人脸识别,语音识别等等)
2.1训练
Simsimi中的“教学”,就是训练的过程,目的在于构建或是丰富词库。
流程描述如下:
S1:用户通过教学界面向系统提出一个话题与相应应答;
S2:系统对该话题进行分词,判断该话题在系统知识库中应存放的位置;
Char[] read =newChar[256];
intcount = sr.Read(read, 0, 256);
while(count > 0)
{
str =newString(read, 0, count);
count = sr.Read(read, 0, 256);
}
returnstr;
}
catch(Exceptionex)
S2:系统在知识库中用刚才说的哈希函数f(埃菲尔铁塔上),找到比如[埃,11,P]的表项,顺着指针找到6字词的索引,顺着索引找到6字词表,遍历词表,找到<埃菲尔铁塔上,…>结构体;
S3:系统随机选择该结构体Ans域中的一个回答(也有可能是根据频率高低来选择)。比如“两年之后等着你”。
S4:输出回答,匹配结束。功时重新切取的策略,机械分词法可以分为增字法和减字法。
举个栗子:我想将[0,100)做成一个哈希表,选取“模10”作为散列函数,以数组作为存储单元,则得到A[10][10]的数组,A[0]里依次存着0,10,20…90;A[1]里存着1,11,21…91。依次类推。
现在举一个训练小黄鸭的例子:我教小黄鸭说“大白天的做什么美梦啊?”回答是“哦哈哈哈不用你管”。
}
privatestringSim(stringtext)
{
try
{
Stringstr="";
web =WebRequest.Create("http://sandbox.api.simsimi.com/request.p?key="+"38eb636b-d78a-4955-be7c-1b021f5905f5"+"&lc=ch&ft=1.0&text="+ text);
基于词典的“双向最大匹配”法是目前中文信息处理中最简单有效的方法,有这样的统计:汉语文本中90%左右的句子,其与双向最大匹配的结果相吻合,而且是正确的分词结果。当正、反向最大匹配算法得出来的切分结果不一样时,就必须对其进行歧义处理,在此不再赘述。
三、属于自己的小黄鸭制作(简要步骤+截图说明)
3.1代码编写
S3:对上一步分词得到的结果进行比较,判断是否存在歧义,如果存在歧义,就进行一定的歧义消解;
S4:重复S2、S3,直到处理完步骤一中断句所切分出的所有句子单元。
算法流程如图所示:
这里给出与小黄鸭对话的例子:我问小黄鸭:“埃菲尔铁塔上45度角仰望星空”。
S1:双向最大匹配分词:正向反向均为《埃菲尔铁塔上,45度角,仰望星空》,没有歧义。长词优先,系统选择了“埃菲尔铁塔上”作为关键词;
3.5修改源代码
利用已经获得的Key修改源代码,同时将Simsimi的网络地址接入代码【生成项目中自动有Windows相关网络组件,可自动搜索网页】
3.6修改项目其他项
四、文档附件说明
(以上3图是进入官方网站进行申请API Key的截图)
(以上两图是利用VS2010进行的项目的生成截图)
(以上两图是部分中的代码修改或接口添加截图) (以上三图是界面生成及运行效果截图)
因为源代码已经公开了,所以我们可以下载源代码就可以,如果不熟悉源代码所用的语言,就像我们组那样,我们要做的就是接下开了解这种语言的基本操作和接口怎么编程
3.2构建运行环境
之前采用的是VS2008,由于版本或者安装的原因生成的项目总是失败,后来更换为VS2010,当然也可以是其他的运行环境
3.3申请获取官方APIKey
//
//主÷版?本?
//次?版?本?
//生Θ?成é号?
//修T订?号?
//
//可é以?指?定¨所ù有瓺这a些?值μ,?也?可é以?使?用?“°生Θ?成é号?”±和í“°修T订?号?”±的?默?认?值μ,?
//方?法ぁ?是?按恪?如?下?所ù示?使?用?“°*”±:
// [assembly: AssemblyVersion("1.0.*")]
其具体流程如下:
S1:预处理阶段,按照特殊字符(英文字母、数字、标点符号等)将待分析文本进行断句,将待切分的文本切分为只有中文的短句子,这些句子是下一步分词处理的基本单位;
(举个例子:输入“asdfadf东北师范大学哈哈哈dfadflakfl(*^__^*)嘻嘻……”,simi只会对其中的中文“东北师范大学哈哈哈嘻嘻”做出响应;输入“(*^__^*)”时,输出“I have no response.”)
{returnex.ToString(); }
res = web.GetResponse();
Streamreceive = res.GetResponseStream();
Encodingencod = System.Text.Encoding.UTF8;
StreamReadersr =newStreamReader(receive, encod);
S3:将结构体<大白天,…>插入队尾。体中有一个Ans域,域中某一指针指向“哦哈哈哈不用你管”。
S4:完成训练。
2.2匹配
可以被描述成如下流程:
S1:用户通过聊天界面向系统提出一个话题;
S2:系统对该话题进行分词处理;
S3:在系统知识库中寻找与该话题匹配的话语回复用户。基于词典的分词算法分为词典加载、预处理、最大匹配、歧义消解几个阶段。
usingSystem.IO;
usingSystem.Runtime.Serialization.Formatters;
usingSystem.Configuration;
namespaceSimsimi
{
publicpartialclassForm1:Form
{
publicForm1()
{
InitializeComponent();
[assembly:AssemblyDescription("")]
[assembly:AssemblyConfiguration("")]
[assembly:AssemblyCompany("")]
[assembly:AssemblyProduct("Simsimi")]
[assembly:AssemblyCopyright("Copyright © 2014")]
usingSystem.Data;
usingSystem.Drawing;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Windows.Forms;
usingSystem.Web.Script.Serialization;
usingSystem.Net;
S3:在系统知识库中添加该话题及相应应答。
可以看到,这里涉及到两个问题:给出一个话题,系统是如何分词的?词库要如何设计才能又快又准地应答?
2.1.1分词方法
有人认为我教小黄鸭“埃菲尔铁塔上45度角仰望星空”回答是“呵呵”,那下次它再看到“埃菲尔铁塔上45度角仰望星空”整句话的时候才会有相应回答。但实际上,下次只要它看到“埃菲尔铁塔”就会“呵呵”了好嘛。
S2:对断句出来的句子进行双向最大匹配(双向匹配,长词优先)分词,分词后的结果作为S3的输入;
(举个栗子:输入“东京古巴比伦”,正向与反向切词结果均为《东京,古巴比伦》,长词优先,所以simi只对“古巴比伦”做出响应;输入“古巴比伦埃菲尔铁塔”,正向与反向切词结果均为《古巴比伦,埃菲尔铁塔》,此时Simi对“埃菲尔铁塔”做出响应)
S1:应用双向最大匹配算法分词:双向分词结果,正向《大白天,的,做什么,美梦,啊》;反向《大白天,的,做什么,美梦,啊》。正向反向都是一样的,所以不需要处理歧义问题。长词优先选择,“大白天”和“做什么”。
S2:以“大白天”举例,假设hash函数为f(),并设f(大白天)指向首字hash表项[大,11,P]。于是由该表项指向“3字索引”,再指向对应“词表”。
这是因为聊天机器人的存储并不以句子为单位(那样太费时费空间),而是以词。于是,分词,几乎成为聊天机器人的核心。
英文分词好说,人家用空格什么的就搞定了,但中文不一样,对于一句话,人们可以用自己的认识区分词语,而机器人要怎么做,就是中文分词算法的研究范畴了。
中文分词技术俨然是一个重要的研究方向,隶属于自然语言处理。现有的分词算法可以分为三大类:基于字符串匹配的分词方法、基于统计的分词方法和基于理解的分词方法。
智能聊天机器人(小黄鸭)软件开发
课程名:模糊系统
小组成员:曹杰何敢谢新明
任课教师:於世为
、
一、小黄鸭的背景
小黄鸭是根据人人网上的小黄鸡为模板,而进行的一个开发,小黄鸭与小黄鸡应该来说是一样的,小黄鸭智能聊天机器人也是一样采用通过调用韩国智能聊天机器人Simsimi的数据库来,当然,前提是获取到了网络接口(这个应该很容易),进而实现计算机和软件之间的通信
首字Hash表通过一次哈希运算就可以直接定位汉字在表中的位置。一个单元包括三项内容:C:存储首字;F标志位:存储以C为首字的最长词条的长度;P:指向词表索引表。
解释一下哈希:散列表Hash table,也叫哈希表,顾名思义就是把数据都打散了,再按一定规律存起来,加快访问速度。是根据关键码值Key而直接进行访问的数据结构。
[assembly:AssemblyTrademark("")]
[assembly:AssemblyCulture("")]
[assembly:ComVisible(false)]
[assembly:Guid("3b0ec051-b3a4-417f-ac3e-232019c8991d")]
//程ì序ò集ˉ的?版?本?信?息¢由?下?面?四?个?值μ组哩?成é:
2.1.2词库设计
由于中文词的特点:1.中文词是一个开放集,词数在增长;2.以不同字开头的词的数目变化很大,多的达到数百个,少的也有可能只有一个或者没有;3.词的长度变化也很大,有单字词,也有由六、七个字成词的。这就要求在设计词典时,除了考虑访问效率外,还得充分考虑存储利用率。请看这种数据结构,就能很好地平衡时间与空间。
五、小黄鸭代码(含小组接口设计)
5.1 AboutBox1.cs文件
usingSystem.Reflection;
usingSystem.Runtime.CompilerServices;
usingSystem.Runtime.InteropServices;
[assembly:AssemblyTitle("Simsimi")]
用户在聊天时的一个显著特点是所提出的话题一般都是比较短小的,而不是长篇大论,不具有段落篇章结构,绝大多数就是少数几句话。基于统计的分词方法适用于有段落、篇章结构以及上下文关系的文段。基于理解的分词方法目前并不成熟,且时间复杂度高,速度慢。于AI聊天机器人小黄鸡的工作可以被分成两个部分:训练+匹配。(其实很多AI的东西都可以被这么划分,比如人脸识别,语音识别等等)