




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档智能聊天机器人(小黄鸭)软件开发 课程名:模糊系统 小组成员:曹杰 何敢 谢新明 任课教师:於世为 目 录 目录1一、小黄鸭的背景2二、小黄鸭的原理22.1 训练22.1.1分词方法22.1.2词库设计32.2 匹配4三、属于自己的小黄鸭制作(简要步骤+截图说明)63.1 代码编写63.2构建运行环境63.3申请获取官方API Key63.4生成项目63.5修改源代码63.6修改项目其他项6四、文档附件说明7五、 小黄鸭代码(含小组接口设计)125.1 AboutBox1.cs文件125.2Form1.cs文件135.3Program.cs文件185.4 Simjosn.cs文件225.5 AssemblyInfo.cs文件235.6 AboutBox1.Designer.cs文件23六、总结29、一、小黄鸭的背景 小黄鸭是根据人人网上的小黄鸡为模板,而进行的一个开发,小黄鸭与小黄鸡应该来说是一样的,小黄鸭智能聊天机器人也是一样采用通过调用韩国智能聊天机器人Simsimi的数据库来,当然,前提是获取到了网络接口(这个应该很容易),进而实现计算机和软件之间的通信二、小黄鸭的原理 AI聊天机器人小黄鸡的工作可以被分成两个部分:训练+匹配。(其实很多AI的东西都可以被这么划分,比如人脸识别,语音识别等等)2.1 训练 Simsimi中的“教学”,就是训练的过程,目的在于构建或是丰富词库。 流程描述如下: S1:用户通过教学界面向系统提出一个话题与相应应答; S2:系统对该话题进行分词,判断该话题在系统知识库中应存放的位置; S3:在系统知识库中添加该话题及相应应答。 可以看到,这里涉及到两个问题:给出一个话题,系统是如何分词的?词库要如何设计才能又快又准地应答? 2.1.1分词方法有人认为我教小黄鸭“埃菲尔铁塔上45度角仰望星空”回答是“呵呵”,那下次它再看到“埃菲尔铁塔上45度角仰望星空”整句话的时候才会有相应回答。但实际上,下次只要它看到“埃菲尔铁塔”就会“呵呵”了好嘛。这是因为聊天机器人的存储并不以句子为单位(那样太费时费空间),而是以词。于是,分词,几乎成为聊天机器人的核心。英文分词好说,人家用空格什么的就搞定了,但中文不一样,对于一句话,人们可以用自己的认识区分词语,而机器人要怎么做,就是中文分词算法的研究范畴了。中文分词技术俨然是一个重要的研究方向,隶属于自然语言处理。现有的分词算法可以分为三大类:基于字符串匹配的分词方法、基于统计的分词方法和基于理解的分词方法。用户在聊天时的一个显著特点是所提出的话题一般都是比较短小的,而不是长篇大论,不具有段落篇章结构,绝大多数就是少数几句话。基于统计的分词方法适用于有段落、篇章结构以及上下文关系的文段。基于理解的分词方法目前并不成熟,且时间复杂度高,速度慢。于 AI聊天机器人小黄鸡的工作可以被分成两个部分:训练+匹配。(其实很多AI的东西都可以被这么划分,比如人脸识别,语音识别等等)2.1.2词库设计 由于中文词的特点:1.中文词是一个开放集,词数在增长;2.以不同字开头的词的数目变化很大,多的达到数百个,少的也有可能只有一个或者没有;3.词的长度变化也很大,有单字词,也有由六、七个字成词的。这就要求在设计词典时,除了考虑访问效率外,还得充分考虑存储利用率。请看这种数据结构,就能很好地平衡时间与空间。 首字Hash表通过一次哈希运算就可以直接定位汉字在表中的位置。一个单元包括三项内容:C:存储首字;F标志位:存储以C为首字的最长词条的长度;P:指向词表索引表。解释一下哈希:散列表 Hash table,也叫哈希表,顾名思义就是把数据都打散了,再按一定规律存起来,加快访问速度。是根据关键码值Key而直接进行访问的数据结构。举个栗子:我想将0,100)做成一个哈希表,选取“模10”作为散列函数,以数组作为存储单元,则得到A1010的数组,A0里依次存着0,10,2090;A1里存着1,11,2191。依次类推。 现在举一个训练小黄鸭的例子:我教小黄鸭说“大白天的做什么美梦啊?”回答是“哦哈哈哈不用你管”。S1:应用双向最大匹配算法分词:双向分词结果,正向大白天,的,做什么,美梦,啊;反向大白天,的,做什么,美梦,啊。正向反向都是一样的,所以不需要处理歧义问题。长词优先选择,“大白天”和“做什么”。S2:以“大白天”举例,假设hash函数为f(),并设f(大白天)指向首字hash表项大,11,P。于是由该表项指向“3字索引”,再指向对应“词表”。S3:将结构体插入队尾。体中有一个Ans域,域中某一指针指向“哦哈哈哈不用你管”。S4:完成训练。2.2 匹配可以被描述成如下流程:S1:用户通过聊天界面向系统提出一个话题;S2:系统对该话题进行分词处理;S3:在系统知识库中寻找与该话题匹配的话语回复用户。基于词典的分词算法分为词典加载、预处理、最大匹配、歧义消解几个阶段。其具体流程如下: S1:预处理阶段,按照特殊字符(英文字母、数字、标点符号等)将待分析文本进行断句,将待切分的文本切分为只有中文的短句子,这些句子是下一步分词处理的基本单位;(举个例子:输入“asdfadf东北师范大学哈哈哈dfadflakfl(*_*) 嘻嘻”,simi只会对其中的中文“东北师范大学哈哈哈嘻嘻”做出响应;输入“(*_*)”时,输出“I have no response.”) S2:对断句出来的句子进行双向最大匹配(双向匹配,长词优先)分词,分词后的结果作为S3的输入;(举个栗子:输入“东京古巴比伦”,正向与反向切词结果均为东京,古巴比伦,长词优先,所以simi只对“古巴比伦”做出响应;输入“古巴比伦埃菲尔铁塔”,正向与反向切词结果均为古巴比伦,埃菲尔铁塔,此时Simi对“埃菲尔铁塔”做出响应) S3:对上一步分词得到的结果进行比较,判断是否存在歧义,如果存在歧义,就进行一定的歧义消解; S4:重复S2、S3,直到处理完步骤一中断句所切分出的所有句子单元。算法流程如图所示: 这里给出与小黄鸭对话的例子:我问小黄鸭:“埃菲尔铁塔上45度角仰望星空”。 S1:双向最大匹配分词:正向反向均为埃菲尔铁塔上,45度角,仰望星空,没有歧义。长词优先,系统选择了“埃菲尔铁塔上”作为关键词; S2:系统在知识库中用刚才说的哈希函数f(埃菲尔铁塔上),找到比如埃,11,P 的表项,顺着指针找到6字词的索引,顺着索引找到6字词表,遍历词表,找到结构体; S3:系统随机选择该结构体Ans域中的一个回答(也有可能是根据频率高低来选择)。比如“两年之后等着你”。 S4:输出回答,匹配结束。功时重新切取的策略,机械分词法可以分为增字法和减字法。 基于词典的“双向最大匹配”法是目前中文信息处理中最简单有效的方法,有这样的统计:汉语文本中90左右的句子,其与双向最大匹配的结果相吻合,而且是正确的分词结果。当正、反向最大匹配算法得出来的切分结果不一样时,就必须对其进行歧义处理,在此不再赘述。三、属于自己的小黄鸭制作(简要步骤+截图说明) 3.1 代码编写 因为源代码已经公开了,所以我们可以下载源代码就可以,如果不熟悉源代码所用的语言,就像我们组那样,我们要做的就是接下开了解这种语言的基本操作和接口怎么编程3.2构建运行环境 之前采用的是VS2008,由于版本或者安装的原因生成的项目总是失败,后来更换为VS2010,当然也可以是其他的运行环境 3.3申请获取官方API Key 这个比较容易,只要登录Simsimi的官方网站就可以用自己的邮箱进行申请,有付费和免费7天测试,本小组申请7天测试的API查看的Key,具体由后面的截图(付费的,可申请免费7天测试,每天可以对话100次)3.4生成项目 因为已经下载源代码了,所以我们可以将源代码生成项目,同时生成exe后缀的可执行文件,由截图展示3.5修改源代码 利用已经获得的Key修改源代码,同时将Simsimi的网络地址接入代码【生成项目中自动有Windows相关网络组件,可自动搜索网页】3.6修改项目其他项四、文档附件说明 (以上3图是进入官方网站进行申请API Key的截图) (以上两图是利用VS2010进行的项目的生成截图) (以上两图是部分中的代码修改或接口添加截图)(以上三图是界面生成及运行效果截图)5、 小黄鸭代码(含小组接口设计) 5.1 AboutBox1.cs文件 using System.Reflection;using System.Runtime.CompilerServices;using System.Runtime.InteropServices;assembly: AssemblyTitle(Simsimi)assembly: AssemblyDescription()assembly: AssemblyConfiguration()assembly: AssemblyCompany()assembly: AssemblyProduct(Simsimi)assembly: AssemblyCopyright(Copyright 2014)assembly: AssemblyTrademark()assembly: AssemblyCulture()assembly: ComVisible(false)assembly: Guid(3b0ec051-b3a4-417f-ac3e-232019c8991d)/ 程序集的?版?本?信?息由?下?面?四?个?值组哩?成:/ 主版?本?/ 次?版?本? / 生?成号?/ 修T订?号?/ 可以?指?定所有瓺这a些?值,?也?可以?使?用?“生?成号?”和“修T订?号?”的?默?认?值,?/ 方?法?是?按恪?如?下?所示?使?用?“*”:/ assembly: AssemblyVersion(1.0.*)assembly: AssemblyVersion()assembly: AssemblyFileVersion()5.2Form1.cs文件using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Web.Script.Serialization;using System.Net;using System.IO;using System.Runtime.Serialization.Formatters;using System.Configuration;namespace Simsimi public partial class Form1 : Form public Form1() InitializeComponent(); WebRequest web ; WebResponse res; private void Form1_Load(object sender, EventArgs e) richTextBox1.AppendText(Simsimi:hi 你好,我是小黄鸭,可以陪您聊天?呢?n); this.textBox1.Focus(); private string Sim(string text) try String str=; web = WebRequest.Create(/request.p?key= + 38eb636b-d78a-4955-be7c-1b021f5905f5 + &lc=ch&ft=1.0&text= + text); res = web.GetResponse(); Stream receive = res.GetResponseStream(); Encoding encod = System.Text.Encoding.UTF8; StreamReader sr = new StreamReader(receive, encod); Char read = new Char256; int count = sr.Read(read, 0, 256); while (count 0) str = new String(read, 0, count); count = sr.Read(read, 0, 256); return str; catch(Exception ex) return ex.ToString(); private void send() richTextBox1.AppendText(我: + textBox1.Text + n); string json = Sim(textBox1.Text); textBox1.Text = null; JavaScriptSerializer js = new JavaScriptSerializer(); try Object obj = new Object(); obj = js.Deserialize(json); switch (simjosn)obj).result) case 100: richTextBox1.AppendText(Simsimi: + (simjosn)obj).response + n); richTextBox1.Focus(); textBox1.Focus(); break; case 400: richTextBox1.AppendText(Simsimi:小黄鸭认为你的请求有瓺问题琣,请检查后再来n); richTextBox1.Focus(); textBox1.Focus(); break; case 401: richTextBox1.AppendText(Simsimi: 小黄鸭偷偷的告诉你哦,你还没授酣权呢n); richTextBox1.Focus(); textBox1.Focus(); break; case 404: richTextBox1.AppendText(Simsimi:小黄鸭两眼冒星星的望着你:你真有文化,小贱鸭没听懂你在说啥,但好像很厉害的样子哩n); richTextBox1.Focus(); textBox1.Focus(); break; case 500: richTextBox1.AppendText(Simsimi: 小黄鸭的后台有点小问题,请稍后再来哦n); richTextBox1.Focus(); textBox1.Focus(); break; default: richTextBox1.AppendText(Simsimi: 不明觉厉n); richTextBox1.Focus(); textBox1.Focus(); break: catch richTextBox1.AppendText(orz.不小心死鸭了.); private void 关?于睺oolStripMenuItem_Click(object sender, EventArgs e) AboutBox1 abox = new AboutBox1(); abox.Show(); private void button1_Click(object sender, EventArgs e) send(); private void 帮?助ToolStripMenuItem_Click(object sender, EventArgs e) private void richTextBox1_TextChanged(object sender, EventArgs e) 5.3 Program.cs文件 using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Web.Script.Serialization;using System.Net;using System.IO;using System.Runtime.Serialization.Formatters;using System.Configuration;namespace Simsimi public partial class Form1 : Form public Form1() InitializeComponent(); WebRequest web ; WebResponse res; private void Form1_Load(object sender, EventArgs e) richTextBox1.AppendText(Simsimi:你好,我是小黄鸭,可以陪您聊天呢n); this.textBox1.Focus(); private string Sim(string text) try String str=; web = WebRequest.Create(/request.p?key= + 38eb636b-d78a-4955-be7c-1b021f5905f5 + &lc=ch&ft=1.0&text= + text); res = web.GetResponse(); Stream receive = res.GetResponseStream(); Encoding encod = System.Text.Encoding.UTF8; StreamReader sr = new StreamReader(receive, encod); Char read = new Char256; int count = sr.Read(read, 0, 256); while (count 0) str = new String(read, 0, count); count = sr.Read(read, 0, 256); return str; catch(Exception ex) return ex.ToString(); private void send() richTextBox1.AppendText(我: + textBox1.Text + n); string json = Sim(textBox1.Text); textBox1.Text = null; JavaScriptSerializer js = new JavaScriptSerializer(); try Object obj = new Object(); obj = js.Deserialize(json); switch (simjosn)obj).result) case 100: richTextBox1.AppendText(Simsim: + (simjosn)obj).response + n); richTextBox1.Focus(); textBox1.Focus(); break; case 400: richTextBox1.AppendText(Simsimi:小黄鸭认为你的请求有问题,请检查后再来n); richTextBox1.Focus(); textBox1.Focus(); break; case 401: richTextBox1.AppendText(Simsimi: 小黄鸭偷偷的告诉你哦,你还没授权呢n); richTextBox1.Focus(); textBox1.Focus(); break; case 404: richTextBox1.AppendText(Simsimi: 小黄鸭两眼冒星星的望着你:你真有文化,小贱鸭没听懂你在说啥,但好像很厉害的样子哩n); richTextBox1.Focus(); textBox1.Focus(); break; case 500: richTextBox1.AppendText(Simsimi: 小黄鸭的后台有点小问题,请稍后再来哦n); richTextBox1.Focus(); textBox1.Focus(); break; default: richTextBox1.AppendText(Simsimi:不明觉厉n); richTextBox1.Focus(); textBox1.Focus(); break; catch richTextBox1.AppendText(orz.不小心死鸭了.); private void 关?于睺oolStripMenuItem_Click(object sender, EventArgs e) AboutBox1 abox = new AboutBox1(); abox.Show(); private void button1_Click(object sender, EventArgs e) send(); private void 帮?助ToolStripMenuItem_Click(object sender, EventArgs e) private void richTextBox1_TextChanged(object sender, EventArgs e) 5.4 Simjosn.cs文件 using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Simsimi class simjosn public int result get; set; public string response get;set; public int id get; set; public string msg get; set; 5.5 AssemblyInfo.cs文件 using System.Reflection;using System.Runtime.CompilerServices;using System.Runtime.InteropServices;assembly: AssemblyDescription()assembly: AssemblyConfiguration()assembly: AssemblyCompany()assembly: AssemblyProduct(Simsimi)assembly: AssemblyCopyright(Copyright 2014)assembly: AssemblyTrademark()assembly: AssemblyCulture()assembly: ComVisible(false)assembly: Guid(3b0ec051-b3a4-417f-ac3e-232019c8991d)assembly: AssemblyVersion() assembly: AssemblyFileVersion()5.6 AboutBox1.Designer.cs文件 namespace Simsimi partial class AboutBox1 private System.ComponentModel.IContainer components = null; protected override void Dispose(bool disposing) if (disposing & (components != null) components.Dispose(); base.Dispose(disposing); private void InitializeComponent() this.tableLayoutPanel = new System.Windows.Forms.TableLayoutPanel(); this.logoPictureBox = new System.Windows.Forms.PictureBox(); this.labelProductName = new System.Windows.Forms.Label(); this.labelVersion = new System.Windows.Forms.Label(); this.labelCopyright = new System.Windows.Forms.Label(); this.labelCompanyName = new System.Windows.Forms.Label(); this.textBoxDescription = new System.Windows.Forms.TextBox(); this.okButton = new System.Windows.Forms.Button(); this.tableLayoutPanel.SuspendLayout(); (System.ComponentModel.ISupportInitialize)(this.logoPictureBox).BeginInit(); this.SuspendLayout(); this.tableLayoutPanel.ColumnCount = 2; this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 33F); this.tableLayoutPanel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 67F); this.tableLayoutPanel.Controls.Add(this.logoPictureBox, 0, 0); this.tableLayoutPanel.Controls.Add(this.labelProductName, 1, 0); this.tableLayoutPanel.Controls.Add(this.labelVersion, 1, 1); this.tableLayoutPanel.Controls.Add(this.labelCopyright, 1, 2); this.tableLayoutPanel.Controls.Add(this.labelCompanyName, 1, 3); this.tableLayoutPanel.Controls.Add(this.textBoxDescription, 1, 4); this.tableLayoutPanel.Controls.Add(this.okButton, 1, 5); this.tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill; this.tableLayoutPanel.Font = new System.Drawing.Font(华a文?中D宋?, 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, (byte)(134); this.tableLayoutPanel.Location = new System.Drawing.Point(9, 8); this.tableLayoutPanel.Name = tableLayoutPanel; this.tableLayoutPanel.RowCount = 6; this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F); this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F); this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F); this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F); this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F); this.tableLayoutPanel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 10F); this.tableLayoutPanel.Size = new System.Drawing.Size(423, 258); this.tableLayoutPanel.TabIndex = 0; this.logoPictureBox.Dock = System.Windows.Forms.DockStyle.Fill; this.logoPictureBox.Image = glo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新解读《GB-T 30718-2014压缩氢气车辆加注连接装置》
- 人教版八年级英语上册期末必考作文范文归纳
- 人教PEP版六年级英语上册全册教案
- 课件-低碳工地生态文明-浅谈如何做好施工现场的环境保护与文明施工管理
- 重卡配件知识入门培训班课件
- 《英语听力1》课程介绍与教学大纲
- 社会科学研究方法 课件 第五章 抽样
- 老年人用品课件
- 老年人拐杖培训课件
- 酿酒知识培训课件
- 护士医护人员职业安全防护培训
- 六年级家长会课件
- 2025年党建党史知识竞赛测试题库及答案
- 2025年教科版新教材科学二年级上册教学计划(含进度表)
- GB/T 45859-2025耐磨铸铁分类
- 临床基于ERAS理念下医护患一体化疼痛管理实践探索
- 2025年河北交警三力测试题及答案
- 2025贵州贵阳供销集团有限公司招聘笔试历年参考题库附带答案详解
- 人教版(2024)新教材三年级数学上册课件 1.2 观察物体(2)课件
- 颈椎骨折脊髓损伤的护理
- 华为海外税务管理办法
评论
0/150
提交评论