基于tensorflow 使用seq2seq+attention+beansearch搭建一个聊天机器人教程(附github源码)

本文介绍如何基于TensorFlow使用seq2seq模型搭建聊天机器人,讲解encoder、decoder、attention和bean search原理,并提供github源码。首先概述seq2seq模型,接着详细阐述数据文本处理,包括语料获取、清洗和处理。最后,逐步解析模型构建过程,涉及编码器、解码器的构建,以及训练和预测阶段的差异。
摘要由CSDN通过智能技术生成

版权声明:博主原创文章,转载请注明来源,谢谢合作!!
https://blog.csdn.net/hl791026701/article/details/84404901

这篇博文主要是介绍基于tensorflow使用google的seq2seq模型来构建一个聊天机器人,主要是学习一下encoder、decoder、attention、bean search等原理和实现方式。
seq2seq是一种很常见的技术。例如,在法语-英语翻译中,预测的当前英语单词不仅取决于所有前面的已翻译的英语单词,还取决于原始的法语输入;另一个例子,对话中当前的response不仅取决于以往的response,还取决于消息的输入。其实,seq2seq最早被用于机器翻译,后来成功扩展到多种自然语言生成任务,如文本摘要和图像标题的生成。本文将介绍几种常见的seq2seq的模型原理,seq2seq的变形以及seq2seq用到的一些小trick。

—、 seq2seq模型简介

seq2seq
seq2seq属于encoder-decoder结构的一种,这里看看常见的encoder-decoder结构,基本思想就是利用两个RNN,一个RNN作为encoder,另一个RNN作为decoder。encoder负责将输入序列压缩成指定长度的向量,这个向量就可以看成是这个序列的语义,这个过程称为编码,如上图,获取语义向量最简单的方式就是直接将最后一个输入的隐状态作为语义向量C。也可以对最后一个隐含状态做一个变换得到语义向量,还可以将输入序列的所有隐含状态做一个变换得到语义变量。而decoder则负责根据语义向量生成指定的序列,这个过程也称为解码,如下图,最简单的方式是将encoder得到的语义变量作为初始状态输入到decoder的rnn中,得到输出序列。可以看到上一时刻的输出会作为当前时刻的输入,而且其中语义向量C只作为初始状态参与运算,后面的运算都与语义向量C无关。
encoder-decoder模型对输入和输出序列的长度没有要求,应用场景也更加广泛。
详情可以参考:seq2seq模型详解

二、数据文本处理

  1. 构建模型的第一步是进行语料的获取和处理。
    这次我们使用的中文电视剧对白语料 https://github.com/fateleak/dgk_lost_conv。
    另外博主还搜集了其它市面上已有的开源中文聊天语料并系统化整理工作
wget https://lvzhe.oss-cn-beijing.aliyuncs.com/dgk_shooter_min.conv.zip

下载预料后要用unzip dgk_shooter_min.conv.zip进行解压。输出dgk_shooter_min.conv
我们可以看下原始语料格式
在这里插入图片描述
2. 我们要对语料进行简单的清洗处理,然后根据根据’“ / ”进行split得到一个个字。

for line in tqdm(fp):
        if line.startswith('M '):
            line = line.replace('\n','')
            if '/' in line:
                line = line[2:].split('/')
            else:
                line = list(line[2:])
            line = line[:-1] #

            group.append(list(regular(''.join(line))))
        else:
            lsat_line=None
            if group:
                groups.append(group)
                group=[]
  1. 处理完之后我们要自己构造Q、A问答句。从上面语料我们可以看出每段会话由标识符“E”分割,所以我们根据(a1,a2),(a1+a2,a3) ,(a1,a2+a3)这样的组合来构造问答语句:
            #假设 a1,a2,a3,三句话  (a1,a2),(a1+a2,a3) ,(a1,a2+a3)
            if next_line:
                x_data.append(line) 
                y_data.append(next_line)
            if last_line and next_line:
                x_data.append(last_line + make_split(last_line) + line)
                y_data.append(next_line)
            if next_line and next_next_line:
                x_data.append(line)
                y_data.append(next_line + make_split(next_line) + next_next_line)

构建好输入X、Y即输入的问答后 ,接下来我们要进行序列化处理。

   ws_input = WordSequence()
   ws_input.fit(x_data + y_data)
  1. 构建了一个word_sequence类:主要函数的作用分别是创建字典、句子转向量、词向量映射、根据超参定制化训练数据、基础数据标记、初始化词典。
    4.1 每个句子特殊处理
    (1)在训练过程中,每个batch中句子长度不一样,此时对于短句子用填充
    (2)用于句子结尾,告诉decoder停止预测
    (3)不在字典中的词用替换
    (4) decoder第一个输入,告诉decoder预测开始
def fit(self,sentences,min_count=5,max_count=None,max_features=None):
        """
        Args:
        min_count 最小出现次数
        max_count 最大出现次数
        max_features 最大特征数
        """
        assert not self.fited , 'WordSequence 只能 fit 一次'

        count={}
        for sentence in sentences:
            arr=list(sentence)
            for a in arr:
                if a not in count:
                    count[a]=0
                count[a]+=1  
        
        print(count)

        if min_count is not None:
            count={k : v for k,v in count.items() if v >= min_count}  

        if max_count is not None:
            count={k : v for k,v in count.items() if v<=max_features}

        self.word_dict = {
            WordSequence.PAD_TAG:WordSequence.PAD,
            WordSequence.UNK_TAG:WordSequence.UNK,
            WordSequence.START_TAG:WordSequence.START,
            WordSequence.END_TAG:WordSequence.END

        }
        if isinstance(max_features,int):
   
基于seq2seq模型的聊天机器人开发环境的搭建可以分为几个主要步骤。 首先,需要安装Python,建议使用Python 3.x版本。Python是一种常用的编程语言,它有着广泛的库和框架支持,非常适合进行机器学习和自然语言处理任务。 接下来,安装TensorFlow库。TensorFlow是一种流行的深度学习框架,提供了各种用于构建和训练神经网络的工具和函数。可以通过在终端窗口运行"pip install tensorflow"命令来安装TensorFlow。 然后,安装额外的依赖库,如NumPy和NLTK。NumPy是一种用于数值计算的Python库,常用于处理矩阵和向量运算。可以使用"pip install numpy"命令安装。NLTK(自然语言工具包)是一个强大的自然语言处理库,提供了丰富的语言处理功能和数据集。可以使用"pip install nltk"命令安装。 接下来,需要准备训练数据集。可以使用开放的聊天数据集,如Cornell Movie-Dialogs Corpus或Twitter Chat Corpus。这些数据集包含了人与人之间的对话文本,作为聊天机器人的输入输出对。 然后,准备将数据集进行预处理。这包括对文本进行分词、去除特殊字符和标点符号、构建词汇表等。可以使用NLTK库中的函数和方法来实现这些预处理步骤。 接下来,开始构建seq2seq模型。可以使用TensorFlow的高级API——Keras来构建模型。可以使用Embedding层将文本数据转化为向量表示,使用LSTM层来建模序列数据,使用Dense层进行输出。还可以添加一些额外的层和损失函数来提升模型性能。 最后,进行模型的训练和评估。可以使用预处理后的数据集来训练模型,使用交叉熵或其他损失函数进行训练。可以使用一部分数据作为验证集来进行模型的评估和调优。 通过以上步骤,就可以搭建基于seq2seq模型的聊天机器人开发环境。可以通过增加数据量、调整模型架构、调整超参数等方法来进一步优化和改进聊天机器人的性能。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值