前言
高中时我就曾有过要写一个智能聊天的程序,但当时能力有限,也只是一个想法而已.
刚步入大学时学习了”图灵测试“相关知识,刚好我也在学习编程,便又产生了兴趣,但被困于实现方法,当初并未实现,当时我能想到且能实现但方法有两种:
1.编写关键词数据库,用户输入之后与关键词匹配,然后重组再输出。我认为不够智能,便作罢了.
2.根据汉字的语法结构来分析处理,但其工程量太庞大,也作罢了.
但在几次数学课的学习以后,被我找到了问题的解决方法,于是便有了这篇文章.
1.分析与架构设计
1.1 需求分析
用户角度分析:
当用户输入字符串以后,得到一个极限接近于人类语言的字符串回复.
技术角度分析:
1.需要一个处理数据的程序
2.数据处理需要数据依据,所有需要一个存储数据的地方
3.存储的数据需要一个数据来源
1.2 逻辑概念模型设计
1.2.1 总体架构设计
根据需求分析得知,我们可以将整个架构设计出三个功能组件:
组件一: 名称:训练系统;负责训练数据,生产出能被使用的数据,通过Python/Java实现;
组件二: 名称:语言库系统;负责存储数据,存储需要被使用的数据,通过Mysql实现;
组件三: 名称:对话系统;负责处理数据,调用存储的数据并结合用户输入的数据给出回馈,通过JAVA实现;
程序结构图:
之所以分成三个独立组件,主要原因是为了避免数据来源、数据存储、数据处理之间可能存在的相互依赖。
建立组件之间的特定接口来负责传输数据,可提高程序可读性、与编写专注度,还可达到具体问题具体分析,减少调试时间。
注:该文章主要分析:如何通过极限思想实现对话系统的核心功能,固不深入探究训练系统与语言库系统的实现
1.2.2 语言库系统设计
Mysql逻辑模型 表结构如下:
列一负责存储提问数据,列n+1负责存储回答。
逻辑上按列式存储设计,物理上按行式存储编写。
注:为了数据使用方便,固不进行范式化
1.2.3 对话系统设计
通过双线程调用两个方面的数据:用户输入数据,语言库系统数据;
将这两个数据进行匹配计算,之后再将计算所生成的数据回馈给用户。
2. 极限思想实现对话核心功能
2.1 物理模型设计
到此为止,整个程序的架构设计完成了,接下来就是对话系统的核心功能了。
除了从“前言”中提到的“两个实现方法”以外,我似乎从数学课中找到了第三种实现方法——应用极限思想实现数据匹配计算功能。
极限不只是高等数学中的一个知识点,极限是一种思想,它源于生活。
在计算机中要实现对极限对描述也是很简单的,例如求0~10以内的正整数中,极限接近于10的数,那么只需要遍历1~9的正整数,再求出其最大值,便求出来了。
R语言实现:
/* 整型数组x区间:【0,10),整型y=10 求x中极限接近y的数值的位置 */ x = c(0,1,2,3,4,5,6,6,7,8,9) which(a==max(a),arr.ind=TRUE);
要实现对话系统,我们不可能通过训练系统提前将所有可能发生的情况,全部都训练出数据进行存储,如果这样,编写对话系统哪还需要思考,只需要写一堆条件语句就好,但其工作量也是不容小嘘。
我们知道每个人的说话方式都不同,例如我们常用的问候语之一,南方人会说“你吃饭了吗?”,北方人则可能会说“饭你吃了吗?”,语言结构不同,但这两句话表达的意思都是一样的,其结构都是有规律的,都表示询问“吃饭”这个行为是否为过去时,所以在计算机里我们不能让数据以相等的方式来进行匹配,我们需要应用极限的思想,让两个数据极限可能相等即可。
通过训练系统我们可以找到语言的结构规律,对话系统负责分析输入数据的语言结构与数据库中已有数据的语言结构最为接近的数据项。
“你吃饭了吗?”这句话语言结构最接近的还是“饭你吃了吗?”吧~ 不可能是“现在几点了?”,如果是,那么则是开发者的问题。
所以将这种思想扩展一下:
只要当我们用户输入的数据,无限接近于数据库中某一数据元素中的某一数据项时,即当“输入”、“已存在”的两个数据极限相等时,便可以根据该数据项找到与之有依赖关系的其他数据,程序便能灵活的作出回馈了。
那么可以通过三个方法来求如输入数据的极限:1.匹配字符串长度;2.匹配字符串关键字;3.匹配语法结构;
实现思路如下:
既然当两个数据匹配成功时计算机认为其相等,“有极限近似”的两个数据,那么肯定也会“极限不近似”的数据、“极限远离”的两个数据,在数学领域我并不知道有没有这个概念,我理解“极限远离”其含义为:逻辑上存在关联,但在物理上并未建立联系的两个数据的关系,描述为极限远离。
如果这样理解,那么便能让程序更加“智能”
一般情况下当用户输入数据时程序会基于回馈,此时回馈数据是输入数据经过极限匹配所得出来的运算结果。
程序回馈完数据以后,就相当于程序运行了一次,并且完全结束了,第一次运算与第二次运算显然是无任何联系的。
但从逻辑上是存在关联的,把用户也想像成另一个对话系统即可,用户得到了输入数据(该输入数据为对话系统的回馈),经过用户大脑的对话系统判断以后会给程序一个回馈(该回馈为对话系统的输入数据)
如下:
对话系统回馈数据 == 用户输入数据
对话系统输入数据 == 用户回馈数据
我设计的对话系统给出的回馈是经过计算的、是有道理依据的,用户给出的回馈更是经过强大计算的、有道理依据的、因为其本就是经过人类思考的。
既然训练系统中的依据是“人”,那么在对话系统中也可以把“人的思考”纳入程序计算中的一部分。
实现方法如图:
从“极限远离”的两个数据中分析其可能存在逻辑联系,并建立其物理连接,保存至数据库中。
让程序“边用边学”、“边学边用”,实现自我迭代。
2.2 JAVA代码实现方法
使用JAVA实现 依赖与极限思想的数据匹配 算法
需要注意的是整个数据匹配算法,就是一个极限的实现:找出极限相等的两个数据
1.引用数据库中的数据
2.引用用户输入的数据
例此时:
输入数据:hadoop
数据库数据: asfdsdsa sfdggtr dv haoppd aodpw dsafdffwfcdcwe hadpod hadoops
第一步数据匹配,进行字符串匹配
第一次匹配运算后:
输入数据:hadoop
数据库数据: asfdsdsa sfdggtr haoppd aodpw hadpod hadoops
第二步数据匹配,进行关键字匹配
第二次匹配运算后:
输入数据:hadoop
数据库数据: haopp hadpod hadoops aodpw
第三步数据匹配,进行语法结构匹配
第三次匹配运算后:
输入数据:hadoop
数据库数据:hadoops
回馈举例:
“
https://hadoop.apache.org/
”
实现对话系统代码的模块化设计:
在主方法中实现整个程序:
3. 后记
1.在终端中运行该程序:
2.程序功能展示:
拓展思考:
既然是使用极限思想探究出的算法,那么是否可以将该算法使用其他语言实现?
又可怎么应用?
答:
可以,基于HTML/CSS/Javascript可以在网页上实现该功能;
使用Python实现更为惊艳,使用基于itchat的Python库:wxpy,可实现类似“微软小冰”的智能聊天程序,尽管不可能达到“微软小冰”的智能程度,但也能当个玩具。
将此程序使用Python重新开发,安置于服务器上,对外提供访问接口,任何开发者只需要调用接口便能使用,开发者向Api Post数据由服务器处理并Get回馈。
设计框架如下: