同是深度学习“槛内人”,我怎么不知道这样高大上的文字生成对话系统

  文字信息是存在最广泛的信息形式之一,而深度学习的序列模型(Sequential Model)在对文字生成建模(Generative Model)方面具备独特的优势。文字自动生成可应用于自然语言对话建模和自动文稿生成,极大地提高了零售客服、网络导购以及新闻业的生产效率。目前比较成熟的是单轮对话系统以及基于单轮对话系统的简单多轮对话系统,这类系统应用范围广泛,技术相对成熟,在零售客服、网络导购等领域都有很高的边际收益。例如苹果手机中的Siri,以及微软早期的小冰机器人,都属于这种系统的尝试。

  从应用范围来看,自然对话系统分为所谓的闲聊(Chit-Chat)对话系统和专业(DomainSpecific)对话系统两种。

  从技术上看,短对话聊天系统分为两种:基于检索的系统(Retrieval Based System)和基于文字生成的系统(Generative System)。构造对话机器人的方法可以分为三种,其中有两种属于索引式模型,一种属于最新的生成式模型。

  第一种是基于深度学习流行之前的技术,使用AIML 这种标识语言构造大量的应答库,通过现有的对文字结构的理解来构造的简单对话系统。这种系统的构造费时费力,灵活性差,扩展性差,智能度低,很难构造多轮对话系统,但是因为应答都是真人生成的,不会有语法错误,语言标准,所以适用于简单集中的业务环境。

  第二种是使用深度学习方法来寻找对应于当前对话背景的最佳应答,相对于第一种方法降低了很多人工构造应答库的工作,灵活性高,扩展性强,有一定智能度,可以用来构造多轮对话系统。

  第三种是目前最新研究的领域,使用深度学习技术实时生成应答,灵活度和智能度都极高,属于自动扩展,但是需要极大量的数据积累和比较复杂的模型才能得到较好的结果。通常第三种系统需要与第二种系统相结合,在第二种系统已有的应答库中无法找到足够满意的选项时,可以启用第三种系统来实时生成应答。

  愿做一次槛外人,学习这基于文字生成的对话系统。这里我们着重介绍第三种。

基于文字生成的对话系统

  这里使用作家老舍的小说《四世同堂》作为训练数据进行演示。读者可以根据自己的应用和业务环境,选择合适的数据。

  对于训练文本可以一次性读入:

alltext = open("e:\\data\\Text\\四世同堂.txt", encoding='utf-8').read()

  得到的结果是一个巨大的字符串列表。因为我们将以每个单字作为建模对象,因此这样读入数据是最方便以后操作的。如果要以词组和单句进行建模,则分段读入最佳。《四世同堂》这本书一共有 3545 个不重复的单字和符号。

  按照对文字序列建模的顺序,我们依次进行下面的操作。

  (1) 首先对所有待建模的单字和字符进行索引。

  (2) 其次构造句子序列。

  (3) 然后建立神经网络模型,对索引标号序列进行向量嵌入后的向量构造长短记忆神经网络。

  (4) 最后我们来检验建模效果。

  对单字和字符建立索引非常简单,用下面三句命令即可:

1 sortedcharset = sorted(set(alltext))
2 char_indices = dict((c, i) for i, c in enumerate(sortedcharset))
3 indices_char = dict((i, c) for i, c in enumerate(sortedcharset))

  第一句的对用 set 函数抽取的每个单字的集合按照编码从小到大排序。第二句对一个单字进行编号索引,第三句进行反向操作,对每个索引建立单字的词典,主要是为了方便预测出来的索引标号向量转换为人能够阅读的文字。

  构造句子序列也非常简单:

1 maxlen = 40
2 step = 3
3 sentences = []
4 next_chars = []
5 for i in range(0, len(alltext) - maxlen, step):
6 sentences.append(alltext[i: i + maxlen])
7 next_chars.append(alltext[i + maxlen])
8 print('nb sequences:', len(sentences))

  构造句子序列的原因是原始数据是单字列表,因此需要人为构造句子的序列来模仿句子序列。在上面的代码中,maxlen=40 标识人工构造的句子长度为 40 个单字,step=3表示在构造句子时每次跳过 3 个单字,比如用这一串单字列表“这首小令是李清照的奠定才女地位之作,轰动朝野。传闻就是这首词,使得赵明诚日夜作相思之梦,充分说明了这首小令在当时引起的轰动。又说此词是化用韩偓《懒起》诗意。”来构造句子的时候,假设句子长度为 10,那么第一句是“这首小令是李清照的奠”,而第二句则是移动 3 个单字以后的“令是李清照的奠定才女”。跳字的目的是为了增加句子与句子之间的变化,否则每两个相邻句子之间只有一个单字的差异,但是这两个相邻句子是用来构造前后对话序列的,缺乏变化使得建模效果不好。当然,如果跳字太多,那么会大大降低数据量。比如《四世同堂》一共有 711501 个单字和符号,每隔三个字或者符号进行跳字操作构造的句子只有 237154 个,是原数据量的 1/3。如何选择跳字的个数是读者在建模的时候要根据情况调整的一个参数。

  需要注意的是,因为句子是人工构造的,都有固定的长度,因此这里不需要进行句子补齐操作。同时,这些句子的向量其实都是一个稀疏矩阵,因为它们只将包含数据的索引编号计入。人工构造句子完毕后就可以对其矩阵化,即对于每一句话,将其中的索引标号映射到所有出现的单字和符号,每一句话所对应的 40 个字符的向量被投影到一个 3545 个元素的向量中,在这个向量中,如果某个元素出现在这句话中,则其值为 1,否则为 0。

  下面的代码执行这个操作:

1 print('Vectorization...')
2 X = np.zeros((len(sentences), maxlen, len(sortedcharset)), dtype=np.bool)
3 y = np.zeros((len(sentences), len(sortedcharset)), dtype=np.bool)
4 for i, sentence in enumerate(sentences):
5 if (i % 30000 == 0):
6 print(i)
7 for t in range(maxlen):
8 char=sentence[t]
9 X[i, t, char_indices[char]] = 1
10 y[i, char_indices[next_chars[i]]] = 1

  当然这个新生成的数据会非常大,比如 X 会是一个 237154 × 40 × 3545 的实数矩阵,实际计算的时候占用的内存会超过 20GB。因此这里需要使用前面提到的数据生成器(data generator)方法,对一个具有较小批量数的样本进行投影操作。可以通过下面这个很简单的函数实现:

1 def data_generator(X, y, batch_size):
2 if batch_size<1:
3 batch_size=256
4 number_of_batches = X.shape[0]//batch_size
5 counter=0
6 shuffle_index = np.arange(np.shape(y)[0])
7 np.random.shuffle(shuffle_index)
8 #reset generator
9 while 1:
10 index_batch = shuffle_index[batch_size*counter:batch_size*(counter+1)]
11 X_batch = (X[index_batch,:,:]).astype('float32')
12 y_batch = (y[index_batch,:]).astype('float32')
13 counter += 1
14 yield(np.array(X_batch),y_batch)
15 if (counter < number_of_batches):
16 np.random.shuffle(shuffle_index)
17 counter=0

  这个函数与前面的 batch_generator 函数非常相似,主要区别是这个函数同时处理X 和 Y 矩阵的小批量生成,另外要求输入和输出数据都是 NumPy 多维矩阵而不是列表的列表。另外 Python 里的数值数据是 float64 类型的,因此专门使用 astype(‘float32’)将矩阵的数据类型强制定为 32 位浮点数以符合 CNTK 对数据类型的要求,这样不需要在后台再进行数据类型转换,从而提高效率。现在可以构造我们的长短记忆神经网络模型了。这时候再次体现了 Keras 的高效建模能力。下面短短几个命令就可以让我们构造一个深度学习模型:

1 # build the model: a single LSTM
2 batch_size=256
3 print('Build model...')
4 model = Sequential()
5 model.add(LSTM(256, batch_size=batch_size, input_shape=(maxlen, len(sortedcharset)), recurrent_dropout=0.1, dropout=0.1))
6 model.add(Dense(len(sortedcharset)))
7 model.add(Activation('softmax'))
8
9 optimizer = RMSprop(lr=0.01)
10 model.compile(loss='categorical_crossentropy', optimizer=optimizer)

  其中第一句命令指定要生成一个序列模型,第二到第四句命令要求依次添加三层网络,分别是一个长短记忆网络和一个全连接网络,最后使用一个softmax 的激活层输出预测。在长短记忆网络里,规定输入数据的维度为(时间步数,所有出现的不重复字符的个数),即输入的数据是对应每一句话处理以后的形式,并且对输入神经元权重和隐藏状态权重分别设定了10% 的放弃率。全连接层的输出维度为所有字符的个数,方便最后的激活函数计算。最后两条命令指定网络优化算法的参数,比如里面指定损失函数为典型的categorical_crossentropy,优化算法是指定的学习速率为0.01 的RMSprop算法。对于循环神经网络,这个优化算法通常表现较好。

  深度学习和人工智能无疑是现在最热门的技术之一,很多人希望能掌握这方面的技能,但是担心门槛太高。这本书可谓是及时雨,给大家提供了非常好的入门学习资料,也是目前国内唯一一本 Keras简单易用的深度学习框架书。其内容不仅涵盖了当前深度学习的几个主要应用领域,而且实用性强,同时也延伸到相关的系搭建、数据获取以及可预见的未来物联网方面的应用,非常值得一读。愿你轻松跨过这槛,化身时代弄潮的深度学习“槛内人”。

  以上内容节选自《Keras快速上手:基于Python的深度学习实战》,点此链接可在博文视点官网查看此书。
                 
  想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                    

Keras 文字生成系统相关推荐

  1. OpenAI发布新人工智能系统:根据文字生成图像

    来源:新浪科技 据报道,旧金山人工智能研究公司OpenAI已经开发了一种新系统,能根据短文本来生成图像. OpenAI在官方博客中表示,这个新系统名为DALL-E,名称来源于艺术家萨尔瓦多·达利(Sa ...

  2. 苹果发布 AI 生成模型 GAUDI,文字生成 3D 场景

    整理 | 禾木木 出品 | AI科技大本营(ID:rgznai100) 前有DALL.E文本生成图像,现有将文字变成 3D场景.近日,苹果 AI 团队发布最新 AI 模型 GAUDI,它是基于 3D ...

  3. 怎么在手机上做文字长图?云便签可将文字生成长图并分享

    有时候,我们需要在手机上记录一些文字,并分享给别人.如果只以文字形式分享,会有较多的局限性,那么能否将文字生成图片,以文字长图的形式将内容分享给好友呢? 其实,文字长图生成并不难,我们常用的多端同步云 ...

  4. 四神分析报告生成系统 1.6.1发布

    程序下载: 多特:http://www.duote.com/soft/144361.html 百度云下载: http://pan.baidu.com/s/1mh869Lm 软件介绍 该软件为共享软件, ...

  5. 【计算机毕业设计】22.学校试卷生成系统+vue

    一.系统截图(需要演示视频可以私聊) 摘  要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息.为了迎合时代需求,优化管理效率,各种各样的管理系统应 ...

  6. python公司企业编码条形码二维码生成系统

    wx供重浩:创享日记 对话框发送:python编码 免费获取完整源码源文件+配置说明教程等 在PyCharm中运行<企业编码生成系统>即可进入如图1所示的系统主界面.在该界面中可以选择要使 ...

  7. Python通过文字生成语音,随机获取视频或图片素材生成伪原创的短视频

    前段时间写了一篇<抖音自动引流脚本源码>主要通过语录系统自动生成语句或随机评论,适用于自动评论引流脚本. 今天脑洞大开,想用Python通过文字生成语音,随机获取视频或图片素材生成伪原创的 ...

  8. 基于GAN的动漫头像生成系统(源码&教程)

    1.研究背景 我们都喜欢动漫角色,并试图创造我们的定制角色.然而,要掌握绘画技巧需要巨大的努力,之后我们首先有能力设计自己的角色.为了弥补这一差距,动画角色的自动生成提供了一个机会,在没有专业技能的情 ...

  9. 基于深度学习的春联自动生成系统 实验记录

    基于深度学习的春联自动生成系统主要分成两个方面: 1.数据集构造 2.模型搭建 本文将主要从这两个方面展开,之后将介绍实验结果和结果分析. 目录 一.[数据集构造] 1.分词方面 2.编码方面 3.数 ...

  10. 清华大学矣晓沅:“九歌”——基于深度学习的中国古典诗歌自动生成系统

    授权自AI科技大本营(ID:rgznai100) 本文共2714字,建议阅读6分钟. 本文为你介绍清华自然语言处理与社会人文计算实验室的自动作诗系统--"九歌"及其相关的技术方法和 ...

最新文章

  1. linux查看msf安装目录,linux系统安装msf的过程详解
  2. mysql基数是什么意思_谈谈MySQL中的基数是啥?
  3. 《计算机网络教程 自顶向下方法》 第一章
  4. android ------- 开发者的 RxJava 详解
  5. PHP开发环境配置:安装与配置Apache、PHP、MySQL、PhpMyAdmin
  6. 评分9.3,你想要的那本书,来了!
  7. 作者:张澄(1979-),男,中国联合网络通信有限公司江苏省分公司互联网部大数据中心总监...
  8. 推销自己的前端技术书籍
  9. CAM350简单编辑gerber文件(【增加一条线】 【复制元素】 【删除元素】)
  10. series选取值_midas界面单元参数取值说明
  11. android 多媒体播放 MediaSession 框架
  12. 计算机职业资格证书如何在网上查询?
  13. 机器人正向运动学和D-H参数方法
  14. 服务器架设项目实训,计算机组网项目实训
  15. Reactjs源码分析
  16. 如何将word文档内容在网页显示方法
  17. Web思维导图实现的技术点分析
  18. mac 平台显示歌词最好的音乐播放器软件 —— Vox + LyricsX
  19. 用数学课件制作工具演示三棱锥的三视图
  20. 人脸、商品、车辆识别一网打尽!

热门文章

  1. java day23【函数式接口】
  2. java day06【类与对象、封装、构造方法】
  3. Java原生网络编程
  4. MySQL----下载安装
  5. h5移动端flexible源码适配终端解读以及常用sass函数
  6. 通信原理实验(〇):音频信号的播放蒙特卡洛模拟
  7. PHP Filesystem
  8. jQuery 插件设置cookie
  9. WCF+AJAX最佳实践
  10. [导入]【布鲁斯威利斯】【虎胆龙威4最终珍藏版】【1024x432RMVB 1.41GB】【20:50】...