下面使用了双向LSTM和注意力机制
一.数据集准备
我用的是 小黄鸡问答语料库,分为分词前,分词后,我用的是分词后

二.数据预处理
1.生成词汇表(这里选取的前2500个常用词)
import collections
import codecs
from operator import itemgetter
counter=collections.Counter()
with codecs.open('C://RNN//Chat//小黄鸡.conv',encoding='utf-8') as f:
for line in f:
for word in line.strip().split():
for w in word:
if w!='M' and w!='E':
counter[w]+=1
sorted_word_to_cnt=sorted(counter.items(),key=itemgetter(1),reverse=True)
sorted_words=[x[0] for x in sorted_word_to_cnt]
sorted_words=["<unk>","<sos>","<eos>"]+sorted_words
sorted_words=sorted_words[:2500]
with codecs.open('C://RNN//Chat//vocab.txt','w',encoding='utf-8') as f:
for word in sorted_words:
f.write(word+"\n")
2.把语料库里的问题与回答分开
这里可以看出,从零开始计数的话,偶数的M 后面跟的是问题,奇数M后面跟的是回答,所以按照如下分开
import codecs
import numpy as np
que=[]
ans=[]
index=0
with codecs.open('C://RNN//Chat//train.txt','r','utf-8') as f:
for line in f.readlines():
if line[0]=='M':
if index % 2 == 0:
que.append(line[2:])
index += 1
elif index %2==1:
index+=1
ans.append(line[2:])
np.save('C://RNN//Chat//question.npy',que)
np.save('C://RNN//Chat//answer.npy',ans)
3.把问题与答案转化为数字(回答 同下)
ques=np.load("C://RNN//Chat//question.npy")
convert_qs=[]
for line in ques:
for word in line:
convert_qs.append(get_id(word))
convert_qs.append('\n')
np.savetxt('convert_qs.txt',convert_qs,fmt ='%s')
4.接下来还是数据的处理(这里处理后每一个batch的每一个例子是
((src_input,src_len),(trg_input,trg_label,trg_len))
解码器需要两种格式的目标句子: # 1.解码器的输入(trg_input),形式如同"<sos> X Y Z" # 2.解码器的目标输出(trg_label),形式如同"X Y Z <eos>" # 上面从文件中读到的目标句子是"X Y Z <eos>"的形式,我们需要从中生成"<sos> X Y Z" # 形式并加入到Dataset中。
import tensorflow as tf
question_path='C://RNN//Chat//convert_qs.txt'
answer_path='C://RNN//Chat//convert_as.txt'
MAX_LEN=30
SOS_ID=1
HIDDEN_SIZE=1024
NUM_LAYERS=2
VOCAB_SIZE=2500
SHARE_EMB_AND_SOFTMAX=True
KEEP_PROB=0.8
MAX_GRAD_NORM=5
LR=1
CHECKPOINT_PATH='C://RNN//Chat//save'
BATCH_SIZE=64
NUM_EPOCH=20
def MakeDataset(file_path):
dataset=tf.data.Te

本文介绍了如何利用双向LSTM和注意力机制构建一个基于小黄鸡问答语料库的Seq2Seq聊天机器人。内容包括数据集准备、数据预处理、生成词汇表、模型搭建、训练函数以及测试过程。在测试阶段遇到的问题是无法连续输入。
最低0.47元/天 解锁文章
8283

被折叠的 条评论
为什么被折叠?



