NLP(二十四)使用LSTM构建生成式聊天机器人
原文链接:http://www.one2know.cn/nlp24/
- 准备
数据集:AIML数据集
下载数据集并用Notepad++打开,复制到txt文件中方便打开 - 代码实现
数据很少,训练轮次不多,结果不好,仅当示例
import numpy as np
import pandas as pd
with open('bot.txt','r') as content_file:
botdata = content_file.read()
Questions = []
Answers = []
for line in botdata.split('</pattern>'):
if '<pattern>' in line:
Quesn = line[line.find('<pattern>')+len('<pattern>'):]
Questions.append(Quesn.lower())
for line in botdata.split('</template>'):
if '<template>' in line:
Ans = line[line.find('<template>')+len('<template>'):]
Answers.append(Ans.lower())
QnAdata = pd.DataFrame(np.column_stack([Questions,Answers]),columns=['Questions','Answers'])
QnAdata['QnAcomb'] = QnAdata['Questions'] + ' ' + QnAdata['Answers']
print(QnAdata[:5])
import nltk
import collections
## 向量化
counter = collections.Counter()
for i in range(len(QnAdata)):
for word in nltk.word_tokenize(QnAdata.iloc[i][2]):
counter[word] += 1
word2idx = {w:(i+1) for i,(w,_) in enumerate(counter.most_common())}
idx2word = {v:k for k,v in word2idx.items()}
idx2word[0] = 'PAD'
vocab_size = len(word2idx) + 1
print('\nVocabulary size:',vocab_size)
def encode(sentence, maxlen,vocab_size):
indices = np.zeros((maxlen, vocab_size))
for i, w in enumerate(nltk.word_tokenize(sentence)):
if i == maxlen: break
indices[i, word2idx[w]] = 1
return indices
def decode(indices, calc_argmax=True):
if calc_argmax:
indices = np.argmax(indices, axis=-1)
return ' '.join(idx2word[x] for x in indices)
question_maxlen = 10
answer_maxlen = 20
def create_questions(question_maxlen,vocab_size):
question_idx = np.zeros(shape=(len(Questions),question_maxlen,vocab_size))
for q in range(len(Questions)):
question = encode(Questions[q],question_maxlen,vocab_size)
question_idx[i] = question
return question_idx
quesns_train = create_questions(question_maxlen=question_maxlen,vocab_size=vocab_size)
def create_answers(answer_maxlen,vocab_size):
answer_idx = np.zeros(shape=(len(Answers),answer_maxlen,vocab_size))
for q in range(len(Answers)):
answer = encode(Answers[q],answer_maxlen,vocab_size)
answer_idx[i] = answer
return answer_idx
answs_train = create_answers(answer_maxlen=answer_maxlen,vocab_size=vocab_size)
from keras.layers import Input,Dense,Dropout,Activation
from keras.models import Model
from keras.layers.recurrent import LSTM
from keras.layers.wrappers import Bidirectional
from keras.layers import RepeatVector,TimeDistributed,ActivityRegularization
n_hidden = 128
question_layer = Input(shape=(question_maxlen,vocab_size))
encoder_rnn = LSTM(n_hidden,dropout=0.2,recurrent_dropout=0.2)(question_layer)
# encoder_rnn = Bidirectional(LSTM(n_hidden,dropout=0.2,recurrent_dropout=0.2),merge_mode='concat')(question_layer)
# RNN的双向包装 向前和向后RNN的输出将合并
# merge_mode(合并模型)参数:{'sum', 'mul', 'concat', 'ave', None}
repeat_encode = RepeatVector(answer_maxlen)(encoder_rnn)
# 重复输入n次 shape加了一维 比如(a,b,c)=>(n,a,b,c)
dense_layer = TimeDistributed(Dense(vocab_size))(repeat_encode)
# TimeDistributed和Dense一起使用,
# 在静态形状中查找非特定维度,并用张量的相应动态形状代替它们
regularized_layer = ActivityRegularization(l2=1)(dense_layer)
# 对基于代价函数的输入活动应用更新的层
softmax_layer = Activation('softmax')(regularized_layer)
model = Model([question_layer],[softmax_layer])
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
# 模型训练
quesns_train_2 = quesns_train.astype('float32')
answs_train_2 = answs_train.astype('float32')
model.fit(quesns_train_2, answs_train_2,batch_size=32,epochs=30,validation_split=0.05)
# 模型预测
ans_pred = model.predict(quesns_train_2[0:3])
print(decode(ans_pred[0]))
print(decode(ans_pred[1]))
NLP(二十四)使用LSTM构建生成式聊天机器人的更多相关文章
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
- Bootstrap<基础二十四> 缩略图
Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...
- 二十四、Struts2中的UI标签
二十四.Struts2中的UI标签 Struts2中UI标签的优势: 数据回显 页面布局和排版(Freemark),struts2提供了一些常用的排版(主题:xhtml默认 simple ajax) ...
- WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的?
原文:WCF技术剖析之二十四: ServiceDebugBehavior服务行为是如何实现异常的传播的? 服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户 ...
- VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机
VMware vSphere 服务器虚拟化之二十四 桌面虚拟化之手动池管理物理机 VMwareView手动池可以管理物理计算机 说明: 环境基于实验二十三 1.准备一台Windows 7的物理计算机名 ...
- Bootstrap入门(二十四)data属性
Bootstrap入门(二十四)data属性 你可以仅仅通过 data 属性 API 就能使用所有的 Bootstrap 插件,无需写一行 JavaScript 代码.这是 Bootstrap 中的一 ...
- 3360: [Usaco2004 Jan]算二十四
3360: [Usaco2004 Jan]算二十四 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6 Solved: 6[Submit][Statu ...
- JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...
- 二十四. Python基础(24)--封装
二十四. Python基础(24)--封装 ● 知识结构 ● 类属性和__slots__属性 class Student(object): grade = 3 # 也可以写在__slots ...
随机推荐
- PHP与ECMAScript_4_常用数学相关函数
PHP ECMAScript 向上取整 ceil($number) Math.ceil( number ) 向下取整 floor($number) Math.floor( number ) 绝对值 a ...
- Liunx C 编程之多线程与Socket
多线程 pthread.h是linux特有的头文件,POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准.该标准定义了创建和操纵线程的一整套API.在类Unix操 ...
- python_0基础开始_day05
第五节 一.字典 python的数据结构之一 字典 —— dict 定义:dic = {"key":"dajjlad"} 作用:存储数据,大量,将数据和数据起到 ...
- Centos安装git并配置ssh
1.下载git安装包 git-2.9.4.tar.gz 2.解压 tar -xzvf git-2.9.4.tar.gz 3.修改解压后的文件名 mv git-2.9.4 git 4.安装git依赖的库 ...
- Linux下SVN库迁移
在日常的工作中,可能因为一些服务器硬件损坏等问题,不得不把SVN服务器上的SVN版本库进行迁移,下面讲解一下SVN库迁移方案(采用dump & load方案),在实际操作的时候也非常的简单,有 ...
- 测试自动化:java+selenium3 UI自动化(2) - 启动Firefox
1. selenium和浏览器 基于selenium的这套自动化体系,其实现关键就在于对于各浏览器的顺畅操作. 事实上当selenium刚开始起家的时候,他使用的还是javascript注入的方式来驱 ...
- 100天搞定机器学习|Day19-20 加州理工学院公开课:机器学习与数据挖掘
前情回顾 机器学习100天|Day1数据预处理 100天搞定机器学习|Day2简单线性回归分析 100天搞定机器学习|Day3多元线性回归 100天搞定机器学习|Day4-6 逻辑回归 100天搞定机 ...
- Spring入门(九):运行时值注入
Spring提供了2种方式在运行时注入值: 属性占位符(Property placeholder) Spring表达式语言(SpEL) 1. 属性占位符 1.1 注入外部的值 1.1.1 使用Envi ...
- 【RabbitMQ】如何进行消息可靠投递【上篇】
说明 前几天,突然发生线上报警,钉钉连发了好几条消息,一看是RabbitMQ相关的消息,心头一紧,难道翻车了? [橙色报警] 应用[xxx]在[08-15 16:36:04]发生[错误日志异常],al ...
- 动图+源码,演示Java中常用数据结构执行过程及原理
最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...