前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >中文NLP笔记:13 用 Keras 实现一个简易聊天机器人

中文NLP笔记:13 用 Keras 实现一个简易聊天机器人

作者头像
杨熹
发布于 2019-02-20 08:36:24
发布于 2019-02-20 08:36:24
1.9K00
代码可运行
举报
文章被收录于专栏:杨熹的专栏杨熹的专栏
运行总次数:0
代码可运行

第一步,引入需要的包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from keras.models import Model

from keras.layers import Input, LSTM, Dense

import numpy as np

import pandas as pd

第二步,定义模型超参数、迭代次数、语料路径:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#Batch size 的大小

batch_size = 32 

# 迭代次数epochs

epochs = 100

# 编码空间的维度Latent dimensionality

latent_dim = 256 

# 要训练的样本数

num_samples = 5000

#设置语料的路径

data_path = 'D://nlp//ch13//files.txt'

第三步,把语料向量化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#把数据向量化

input_texts = []

target_texts = []

input_characters = set()

target_characters = set()



with open(data_path, 'r', encoding='utf-8') as f:

    lines = f.read().split('\n')

for line in lines[: min(num_samples, len(lines) - 1)]:

    #print(line)

    input_text, target_text = line.split('\t')

    # We use "tab" as the "start sequence" character

    # for the targets, and "\n" as "end sequence" character.

    target_text = target_text[0:100]

    target_text = '\t' + target_text + '\n'

    input_texts.append(input_text)

    target_texts.append(target_text)



    for char in input_text:

        if char not in input_characters:

            input_characters.add(char)

    for char in target_text:

        if char not in target_characters:

            target_characters.add(char)



input_characters = sorted(list(input_characters))

target_characters = sorted(list(target_characters))

num_encoder_tokens = len(input_characters)

num_decoder_tokens = len(target_characters)

max_encoder_seq_length = max([len(txt) for txt in input_texts])

max_decoder_seq_length = max([len(txt) for txt in target_texts])



print('Number of samples:', len(input_texts))

print('Number of unique input tokens:', num_encoder_tokens)

print('Number of unique output tokens:', num_decoder_tokens)

print('Max sequence length for inputs:', max_encoder_seq_length)

print('Max sequence length for outputs:', max_decoder_seq_length)



input_token_index = dict(

    [(char, i) for i, char in enumerate(input_characters)])

target_token_index = dict(

    [(char, i) for i, char in enumerate(target_characters)])



encoder_input_data = np.zeros(

    (len(input_texts), max_encoder_seq_length, num_encoder_tokens),dtype='float32')

decoder_input_data = np.zeros(

    (len(input_texts), max_decoder_seq_length, num_decoder_tokens),dtype='float32')

decoder_target_data = np.zeros(

    (len(input_texts), max_decoder_seq_length, num_decoder_tokens),dtype='float32')



for i, (input_text, target_text) in enumerate(zip(input_texts, target_texts)):

    for t, char in enumerate(input_text):

        encoder_input_data[i, t, input_token_index[char]] = 1.

    for t, char in enumerate(target_text):

        # decoder_target_data is ahead of decoder_input_data by one timestep

        decoder_input_data[i, t, target_token_index[char]] = 1.

        if t > 0:

            # decoder_target_data will be ahead by one timestep

            # and will not include the start character.

            decoder_target_data[i, t - 1, target_token_index[char]] = 1.

第四步,LSTM_Seq2Seq 模型定义、训练和保存:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
encoder_inputs = Input(shape=(None, num_encoder_tokens))

encoder = LSTM(latent_dim, return_state=True)

encoder_outputs, state_h, state_c = encoder(encoder_inputs)

# 输出 `encoder_outputs`

encoder_states = [state_h, state_c]



# 状态 `encoder_states`

decoder_inputs = Input(shape=(None, num_decoder_tokens))

decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)

decoder_outputs, _, _ = decoder_lstm(decoder_inputs,

                      initial_state=encoder_states)

decoder_dense = Dense(num_decoder_tokens, activation='softmax')

decoder_outputs = decoder_dense(decoder_outputs)



# 定义模型

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)



# 训练

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')

model.fit([encoder_input_data, decoder_input_data], decoder_target_data,

          batch_size=batch_size,

          epochs=epochs,

          validation_split=0.2)

# 保存模型

model.save('s2s.h5')

第五步,Seq2Seq 的 Encoder 操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
encoder_model = Model(encoder_inputs, encoder_states)



decoder_state_input_h = Input(shape=(latent_dim,))

decoder_state_input_c = Input(shape=(latent_dim,))

decoder_states_inputs = [decoder_state_input_h, decoder_state_input_c]

decoder_outputs, state_h, state_c = decoder_lstm(

    decoder_inputs, initial_state=decoder_states_inputs)

decoder_states = [state_h, state_c]

decoder_outputs = decoder_dense(decoder_outputs)

decoder_model = Model(

    [decoder_inputs] + decoder_states_inputs,

    [decoder_outputs] + decoder_states)

第六步,把索引和分词转成序列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
reverse_input_char_index = dict(

    (i, char) for char, i in input_token_index.items())

reverse_target_char_index = dict(

    (i, char) for char, i in target_token_index.items())

第七步,定义预测函数,先使用预模型预测,然后编码成汉字结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def decode_sequence(input_seq):

    # Encode the input as state vectors.

    states_value = encoder_model.predict(input_seq)

    #print(states_value)



    # Generate empty target sequence of length 1.

    target_seq = np.zeros((1, 1, num_decoder_tokens))

    # Populate the first character of target sequence with the start character.

    target_seq[0, 0, target_token_index['\t']] = 1.



    # Sampling loop for a batch of sequences

    # (to simplify, here we assume a batch of size 1).

    stop_condition = False

    decoded_sentence = ''

    while not stop_condition:

        output_tokens, h, c = decoder_model.predict(

            [target_seq] + states_value)



        # Sample a token

        sampled_token_index = np.argmax(output_tokens[0, -1, :])

        sampled_char = reverse_target_char_index[sampled_token_index]

        decoded_sentence += sampled_char

        if (sampled_char == '\n' or

          len(decoded_sentence) > max_decoder_seq_length):

            stop_condition = True



        # Update the target sequence (of length 1).

        target_seq = np.zeros((1, 1, num_decoder_tokens))

        target_seq[0, 0, sampled_token_index] = 1.

        # 更新状态

        states_value = [h, c]

    return decoded_sentence

第九步:模型预测

首先,定义一个预测函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def predict_ans(question):

        inseq = np.zeros((len(question), max_encoder_seq_length, num_encoder_tokens),dtype='float16')

        decoded_sentence = decode_sequence(inseq)

        return decoded_sentence

然后进行预测:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print('Decoded sentence:', predict_ans("挖掘机坏了怎么办"))

学习资料:

中文自然语言处理入门实战》

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.02.14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
TensorFlow快餐教程:程序员快速入门深度学习五步法
作者简介:刘子瑛,阿里巴巴操作系统框架专家;CSDN 博客专家。工作十余年,一直对数学与人工智能算法相关、新编程语言、新开发方法等相关领域保持浓厚的兴趣。乐于通过技术分享促进新技术进步。 作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。 我们可以用 5 步 + 4 种基本元素 + 9 种基本层结构,这 5-4-9 模型来总结。 5步法: 1. 构造网络模型 2. 编译模型 3. 训练模型 4. 评估模型 5. 使用模型进行预测 4种基本元素:
用户1737318
2018/07/20
5090
使用Python实现深度学习模型:序列到序列模型(Seq2Seq)
序列到序列(Seq2Seq)模型是一种深度学习模型,广泛应用于机器翻译、文本生成和对话系统等自然语言处理任务。它的核心思想是将一个序列(如一句话)映射到另一个序列。本文将详细介绍 Seq2Seq 模型的原理,并使用 Python 和 TensorFlow/Keras 实现一个简单的 Seq2Seq 模型。
Echo_Wish
2024/06/06
4360
入门 | 十分钟搞定Keras序列到序列学习(附代码实现)
选自Keras Blog 作者:Francois Chollet 机器之心编译 参与:黄小天、路雪 如何在 Keras 中实现 RNN 序列到序列学习?本文中,作者将尝试对这一问题做出简短解答;本文预设你已有一些循环网络和 Keras 的使用经验。 GitHub:https://github.com/fchollet/keras/blob/master/examples/lstm_seq2seq.py 什么是序列到序列学习? 序列到序列学习(Seq2Seq)是指训练模型从而把一个域的序列(比如英语语句)转化
机器之心
2018/05/10
1.4K0
TensorFlow快餐教程:程序员快速入门深度学习五步法
作为一个程序员,我们可以像学习编程一样学习深度学习模型开发。我们以 Keras 为例来说明。
AI科技大本营
2018/07/23
4250
TensorFlow快餐教程:程序员快速入门深度学习五步法
【NLP实战】如何基于Tensorflow搭建一个聊天机器人
实战是学习一门技术最好的方式,也是深入了解一门技术唯一的方式。因此,NLP专栏计划推出一个实战专栏,让有兴趣的同学在看文章之余也可以自动动手试一试。
用户1508658
2019/11/06
8310
【NLP实战】如何基于Tensorflow搭建一个聊天机器人
深度学习快速参考:11~13
在上一章中,我们讨论了文档分类以及文档分类的一种特殊情况,称为情感分类。 这样做时,我们不得不谈论很多关于向量化的知识。
ApacheCN_飞龙
2023/04/23
8190
使用LSTM建立seq2seq模型进行语言翻译
初始状态 + embedding 作为输入,经过LSTM,输出 decoder_outputs_inf, state_h_inf, state_c_inf
Michael阿明
2021/02/19
7810
使用LSTM建立seq2seq模型进行语言翻译
学习笔记 TF059 :自然语言处理、智能聊天机器人
本文介绍了自然语言处理技术在金融智能客服系统中的应用和实践。通过引入对话智能引擎,将自然语言处理技术应用于客服场景,实现快速、准确地回答客户问题,提升客户体验。同时,利用深度学习技术对大量语料进行训练,使得系统能够更好地理解用户意图和上下文信息,从而提供更准确的服务。
利炳根
2017/11/06
1.8K0
教程 | 简述表征句子的3种无监督深度学习方法
选自Medium 作者:yonatan hadar 机器之心编译 参与:Nurhachu Null、路 本文介绍了三种用于表征句子的无监督深度学习方法:自编码器、语言模型和 Skip-Thought
机器之心
2018/05/08
1.1K0
教程 | 简述表征句子的3种无监督深度学习方法
独家 | Python利用深度学习进行文本摘要的综合指南(附教程)
本文介绍了如何利用seq2seq来建立一个文本摘要模型,以及其中的注意力机制。并利用Keras搭建编写了一个完整的模型代码。
数据派THU
2019/07/17
2.4K0
独家 | Python利用深度学习进行文本摘要的综合指南(附教程)
基于RNN的NLP机器翻译深度学习课程 | 附实战代码
在上个文章中,我们已经简单介绍了 NLP 机器翻译,这次我们将用实战的方式讲解基于 RNN 的翻译模型。
AI科技大本营
2019/08/26
3.5K2
基于RNN的NLP机器翻译深度学习课程 | 附实战代码
Transformers 4.37 中文文档(四十三)
MBart 模型是由 Yinhan Liu、Jiatao Gu、Naman Goyal、Xian Li、Sergey Edunov、Marjan Ghazvininejad、Mike Lewis、Luke Zettlemoyer 在多语言去噪预训练神经机器翻译中提出的。
ApacheCN_飞龙
2024/06/26
3600
使用Seq2Seq+attention实现简单的Chatbot
本文代码的github连接:https://github.com/princewen/tensorflow_practice/tree/master/chat_bot_seq2seq_attention 1、attention model原理介绍 1.1 attention model 为什么要有attention机制 原本的Seq2seq模型只有一个encoder和一个decoder,通常的做法是将一个输入的句子编码成一个固定大小的state,然后作为decoder的初始状态(当然也可以作为每一时刻的输入
石晓文
2018/04/11
5.8K3
使用Seq2Seq+attention实现简单的Chatbot
tensorflow学习笔记(十一):seq2seq Model相关接口介绍
tf.sampled_softmax_loss()中调用了_compute_sampled_logits() 关于__compute_sampled_logits()
ke1th
2019/05/26
9070
python用于NLP的seq2seq模型实例:用Keras实现神经机器翻译
在本文中,我们将看到如何创建语言翻译模型,这也是神经机器翻译的非常著名的应用。我们将使用seq2seq体系结构通过Python的Keras库创建我们的语言翻译模型。
拓端
2020/09/26
1.4K0
python用于NLP的seq2seq模型实例:用Keras实现神经机器翻译
在本文中,我们将看到如何创建语言翻译模型,这也是神经机器翻译的非常著名的应用。我们将使用seq2seq通过Python的Keras库创建我们的语言翻译模型。
拓端
2021/01/13
1.4K0
【机器学习】机器学习与自然语言处理的融合应用与性能优化新探索
自然语言处理(NLP)是计算机科学中的一个重要领域,旨在通过计算机对人类语言进行理解、生成和分析。随着深度学习和大数据技术的发展,机器学习在自然语言处理中的应用越来越广泛,从文本分类、情感分析到机器翻译和对话系统,都展示了强大的能力。本文将详细介绍机器学习在自然语言处理中的应用,包括数据预处理、模型选择、模型训练和性能优化。通过具体的案例分析,展示机器学习技术在自然语言处理中的实际应用,并提供相应的代码示例。
E绵绵
2024/07/08
2850
Python 智能项目:1~5
人工智能(AI)在过去几年中一直处于技术的最前沿,并已进入主流应用,例如专家系统,移动设备上的个性化应用, 自然语言处理中的机器翻译,聊天机器人,自动驾驶汽车等。 但是,AI 的定义在很长一段时间以来一直是一个争论的主题。 这主要是因为所谓的 AI 效应将过去已经通过 AI 解决的工作归类为非 AI。 根据一位著名的计算机科学家的说法:
ApacheCN_飞龙
2023/04/23
1K0
人工智能—法庭智能口译(口译实时翻译系统)实战详解
随着全球化进程的不断深化,法庭面临了越来越多来自不同语言和文化背景的当事人,这使得法庭口译工作显得尤为重要。传统的口译方法在效率和准确性方面存在挑战,因此需要一种更先进的、能够实时翻译的系统来满足法庭口译的需求。
一键难忘
2023/12/08
7763
深度学习对话系统实战篇 -- 简单 chatbot 代码实现
本文的代码都可以到我的 github 中下载:https://github.com/lc222/seq2seq_chatbot 前面几篇文章我们已经介绍了 seq2seq 模型的理论知识,并且从 tensorflow 源码层面解析了其实现原理,本篇文章我们会聚焦于如何调用 tf 提供的 seq2seq 的 API,实现一个简单的 chatbot 对话系统。这里先给出几个参考的博客和代码: tensorflow 官网 API 指导(http://t.cn/R8MiZcR ) Chatbots with Se
AI研习社
2018/03/16
2.2K0
深度学习对话系统实战篇 -- 简单 chatbot 代码实现
推荐阅读
相关推荐
TensorFlow快餐教程:程序员快速入门深度学习五步法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验