项目环境:JDK1.8,Maven3.39,IDEA
项目仓库:Github地址
把传统的一问一答的思路转变为无问答。聊天即为会话,我们认为所有的上下文都是有可能关联的,所以用概率学来处理问题。下面来看一个简单的处理流程:
img_1.png
基础库会存储所有的用户发来的内容(也会包含一部分最初我们基础的对话内容)
Tree 库中的意思是 会话ID 对应 下一条可能的数据,相同的数据可是可以的。通过随机去处理其实简单的多。
当有新的用户与机器聊天的时候,首先去 基础语料库中匹配,表中的内容大致是这样的:
img_2.png
每一行都是一行内容,在Tree表中,存储的则是对应关系:
img_3.pngqid:会话
aid:回复的内容
这些id全部是base中每一条内容的id。举例:机器人现在库中是空的,还没有学会 你好
该怎么回答,那么过程就是:
表全部为空,示例1
用户1:你好
- 数据库中没有匹配到任何内容
- 添加到 base 会话表中
- 添加到 butt 未知表中
- 由于表当前全为空,所以随机回复也是刚插入的
你好
这条数据
表全部为空,示例2
用户2:你怎么这么傻
- 数据库中没有匹配到任何内容
- 添加到 base 会话表中
- 添加到 butt 未知表中
- 由于表当前全为空,所以随机回复也是刚插入的
你怎么这么傻
这条数据
假设,用户在 示例1 之后,问了问题,你多大年纪了
:
(机器在不知情的状况下,认为,在 说你好
之后会说你多大年纪了
)
- base 数据库中没有匹配到这个问题,插入 base 会话表中
- 添加到 tree中,你好 对应 你多大年纪了
- 添加到butt 未知表中
- 由于未知表中存在了
你好
,你多大年纪了
,随机回复一条,但是你多大年纪了
要除去。
假设,用户2 在示例2 之后,回答了问题,我不傻,是你傻
:
(机器在不知情的状况下,认为,在 说你怎么这么傻
之后会说我不傻,是你傻
)
- base 库中,没有匹配到这个问题,入库
- 添加到tree中
- 添加到butt未知表中
- 由于未知表中依旧不知道2个问题,你好,你多大年纪了,所以随机回复一个除
我不傻,是你傻
话之外的问题让用户回答。
在n轮之后,可能机器人学会了很多中你好的回答,或者是你好之后用户问了什么问题:
img_4.png我们看到,用户对于你好这个问题的回答几乎是很相近的。所以下次,如果有人来问你好,机器人就会去库中查出来,然后数量内随机,那么越多被回答的内容被随机到返回的几率也就越大。当然,其他几率比较小的问题也可能被随机到,但是这都是别人跟机器人聊天问的东西,我们把这些问题抛给其他人也不是不对。
机器人一个简单的学习途径就搭建起来了,但这仅仅是学会了这些话,机器并不懂这些话到底是什么含义,或者有没有更好的途径,那么就要借助语义识别与分词了。
我们这里的分词使用的是斯坦福大学的分词系统,分词之后,我们可以做很多的事情,比如说两句话的意思是否一致,能大致的判断出这个人是想要什么东西,做什么事情,而不是像最初那样笨笨的学习,如果在学习的过程中有个人捣乱,哪所有人也遭殃了。
假如说机器人不管说什么,他都回复:小明很笨,过不了多久,大部分用户跟机器人聊天,只要没有确切的答案,都会说小明很笨了.... 哈哈
所以,这里要做一些操作,我们再次把表分开。tree表中存放的都是我们预置的一些预料,base的功能还是存放所有的通过机器的会话,butt中依旧存放未知的语句。这时候多一样表:机器学习到的内容,t_corpus_hit,这张表我们单独存放学习到的数据,以免对原有固定或者基础答案的内容造成冲击。
这张表在入库的时候一定要把控的很严格,稍有不慎就会传播色情内容,所以基础的过滤与鉴定是要有的,这张表中我们作为命中表,如果对于一个问题的回答多个人命中之后,那么该回答作为可用回答,插入到tree中。命中的过程也就是2句话意义是否相近的过程。
加入用户说:我想吃黄焖鸡,另一个用户也说,黄焖鸡我很想吃,那么在同一个scope分词后,同样存在吃,黄焖鸡,大致的可以认为他们相近,当然这里就涉及到一些干扰的去除等等。这里后续我们会加入元祖的概念。
就像我们出生到现在,我们也在学习,什么话之后应该说什么话。未来我们把上下文加入之后,会得到一个更好的结果。
下节我们开始写代码了
网友评论