基于LSTM的Chatbot实例(1) — 研究背景及数据准备

一、背景

  一直想写一篇面对初学者的文章从上层应用到底层的机器学习基础方面全流程的阐释当下流行的深度学习算法(CNN,RNN等)。刚好春节前有同学工作内容涉及对话机器人,我也从零开始接触学习了下,所以就借这个案例展开说一些自己的学习过程吧。
  对话系统根据实际的任务需求,所要用到的主要技术手段也不尽相同。具体来说,对话系统大致可分为两种:

  • 任务导向型(task-oriented)对话系统
  • 非任务导向型(non-task-oriented)对话系统(也称为聊天机器人)

1.1 任务导向型对话系统

  任务导向型对话系统主要帮助人们完成确定的任务(例如,订票)。之前广泛应用的方法是将对话响应视为一条管道(pipeline) 如图 Figure 1-1所示。系统先理解用户的话(NLU),将其表示成系统可以理解的状态,然后根据策略采取一些action,最后根据这些action转换成自然语言(NLG)回复。这里的NLU是用统计模型来处理。可靠的对话系统仍使用人工特征和规则来表示状态和策略、检测意图等,使得实际使用中的对话系统成本很高,而且很难被用于其他领域。更多详细技术需求可参考论文:《A Survey on Dialogue Systems: Recent Advances and New Frontiers》(私心感觉百度的AI开放平台做的挺不错的,看一些API文档也有助于理解技能树和产品方向)

基于LSTM的Chatbot实例(1) — 研究背景及数据准备_第1张图片

Figure 1-1 任务导向型对话系统

1.2 非任务导向型对话系统

  非任务导向型对话系统与人类交互,提供合理的回复和娱乐消遣功能,通常情况下主要集中在开放的领域与人交谈。一般来说,对于非任务导向型对话系统,目前用的主要是两种主要方法:(参考文献【2-4】)

  • 基于检索的方法,从事先定义好的索引中进行搜索,学习从当前对话中选择回复。检索型方法的缺点在于它过于依赖数据质量,如果选用的数据质量欠佳,那就很有可能前功尽弃。
  • 生成方法,通常使用序列到序列模型(seq2seq),在对话过程中产生合适的回复,生成型聊天机器人目前是研究界的一个热点,和检索型聊天机器人不同的是,它可以生成一种全新的回复,因此相对更为灵活,但它也有自身的缺点,比如有时候会出现语法错误,或者生成一些没有意义的回复。

鉴于自学成本的考虑,并不打算接下来本篇讨论的是使用seq2seq模型建立非任务对话系统的方法,包括数据收集,模型原理分析,模型建立及训练,tensorflow模型可视化,结果讨论等方面的内容。

二、数据收集

 自己在收集对话语料数据思路基本就两种:

  • 找开源:实际照下来感觉开源的中文对话语料库很少,而且体量很小,自行参考别人总结的对话语料库
  • 自己爬取网络数据构建对话语料库:这里有两个感觉还不错的开源项目,给和我一样没有爬虫基础的同学自主构建语料库提供参考:
    • 自己动手做聊天机器人– 聊天语料
    • 微博终结者爬虫计划

最后自己选了“自己动手做聊天机器人– 聊天语料”中的方法,爬取了影音字幕文件(原始的压缩文件有657MB)。经过一些列处理(包括清理非字幕文件,编码识别与转码,筛选中文,内容过滤等操作后,生成的可用对话文本有45MB)。相关爬取处理的源码在上面链接的基础上简单的适配修改就可以。

基于LSTM的Chatbot实例(1) — 研究背景及数据准备_第2张图片

基于LSTM的Chatbot实例(1) — 研究背景及数据准备_第3张图片

Figure 2-1 数据集规模

  处理后的数据样本示例如下:
基于LSTM的Chatbot实例(1) — 研究背景及数据准备_第4张图片

Figure 2-2 数据样本示例

三、数据预处理

  在获取了如 Figure 2-2中文对话语料后,还需要进行分词,转化成问答对,以及生成词向量的预处理操作。其中中文分词采用成熟的结巴分词库来处理。词向量和神经语言模型的相关内容在我之前的一篇word2vec博文中给出了详细的背景阐释和公式推导。只不过那一篇的实践是基于spark MLlib的word2vec建模处理,本篇给出基于tensorflow的词向量生成代码。

# -*- coding: utf-8 -*-
# @Author  : Alice
# @File    : word_segment.py
# @Desc    : 中文文档分词并去除停用词
import jieba
import os
import chardet

#创建停用词list
def stopwordlist(filepath):
  stopwords = [line.strip() for line in open(filepath,'r',encoding='utf-8').readlines()]
  return stopwords

def seg_sentence(input,output,stopwprds):
  input_file=open(input,'r')
  output_file=open(output,'a')
  while True:
    line = input_file.readline()
    if line:
      line = line.strip()
      seg_list = jieba.cut(line)
      segments = ''
      for word in seg_list:
        if word not in stopwprds:
          segments = segments + " " + word
      segments += '\n'
      output_file.write(segments)
    else:
      break
  input_file.close()
  output_file.close()

if __name__ == '__main__':
  segment_file = 'D:\\Code\\DeepLearning\\output\\segment.txt'
  stopwords = stopwordlist('D:\\Code\\DeepLearning\\chatbot\\word2vec\\stop_words.txt')
  for root, dirs, files in os.walk('D:\\Code\\DeepLearning\\output\\source'):
    for file in files:
      input = os.path.join(root,file)
      seg_sentence(input,segment_file,stopwords)
# -*- coding: utf-8 -*-
# @Author  : Alice
# @File    : word2vec.py
# @Desc    : 使用tensorflow输出词向量

from gensim.models import word2vec
import multiprocessing
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)


def build_word2vec_model(source,modelpath):
  """
  生成word2vec模型
  :param source: 文件路径
  :param modelpath: 模型保存路径
  :return:
  """
  sentences = word2vec.LineSentence(source)
  model = word2vec.Word2Vec(sentences, min_count=8,size=200,workers=multiprocessing.cpu_count())
  model.save(modelpath)

def build_word_dict(model_path):
  """
  获取word2vec模型的所有词向量
  :param model_path: 已经训练好的word2vec模型保存路径
  :return:
  """
  model = word2vec.Word2Vec.load(model_path)
  vocab = model.wv.vocab
  word_vector = {}
  for word in vocab:
    word_vector[word] = model[word]
  return word_vector

if __name__ == '__main__':
  source = 'D:\\Code\\DeepLearning\\output\\segment.txt'
  modelpath = 'D:\\Code\\DeepLearning\\output\\mymodel'
  build_word2vec_model(source,modelpath)

这里训练好的word2vec词向量,可以直接加载,作为基于LSTM的seq2seq模型的输入源。这部分将再下一篇文章中提现。

参考文献:
【1】A Survey on Dialogue Systems: Recent Advances and New Frontiers
【2】Deep Learning for Chatbots, Part 1 – Introduction
【3】一文彻底读懂智能对话系统!当前研究综述和未来趋势
【4】什么是 AI 领域人机对话系统?该如何评估好坏?
【5】关于对话机器人,你需要了解这些技术
【6】Chatbots with Seq2Seq
【7】自己动手做聊天机器人– 聊天语料

你可能感兴趣的:(ML,tensorflow)