目录
项目创作背景和目的
项目背景
在当今数字化和信息化的时代,聊天机器人在各个领域的应用越来越广泛。它们能够帮助企业提高客户服务效率,减少人力成本,并提供24小时不间断的服务。通过自然语言处理技术,聊天机器人可以理解用户的语言并作出相应的回答。
项目目的
本项目旨在开发一个基础的聊天机器人,能够处理简单的中文问答对话。通过这个项目,我们希望学习并实践自然语言处理和深度学习的相关技术,理解聊天机器人的工作原理,并探索其在实际应用中的潜力。
数据来源和处理
我们的数据主要来源于天池Chinese Medical Dialogue Dataset 中文医疗对话数据集,因为我们所拥有的个人计算机算力有限,而数据庞大,只截取了其中的800条数据和问答部分进行训练测试。这些数据主要涵盖了外科医疗中的常见问题和回答。
数据预处理
先截取了其中我们想要的部分数据,后将数据拆分为输入部分和输出部分。接着使用Tokenizer分词器将文本数据转换为序列,并进行填充以保证序列长度一致。再通过Tokenizer,将文本数据转换为模型可以理解的数字序列。
示例代码
import pandas as pd
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np
import matplotlib.pyplot as plt
import pickle
# 读取对话数据,假设数据编码格式为 ANSI
data = pd.read_csv('外科5-14000.csv', encoding='ansi')
# 截取前500条数据
data = data.head(800)
# 只保留 "ask" 和 "answer" 列
data = data[['title', 'answer']]
# 将截取后的数据转换为 UTF-8 编码并保存到新的 CSV 文件中
data.to_csv('data.csv', encoding='utf-8', index=False)
# 重新读取截取后的数据
data = pd.read_csv('data.csv')
data.info()
# 拆分数据为输入和输出部分
input_texts = data['title'].tolist()
target_texts = data['answer'].tolist()
# 初始化 Tokenizer
tokenizer = Tokenizer(num_words=10000)
tokenizer.fit_on_texts(input_texts + target_texts)
# 保存 Tokenizer
with open('tokenizer.pkl', 'wb') as handle:
pickle.dump(tokenizer, handle, protocol=pickle.HIGHEST_PROTOCOL)
# 文本转换为序列
input_sequences = tokenizer.texts_to_sequences(input_texts)
target_sequences = tokenizer.texts_to_sequences(target_texts)
# 序列填充
max_sequence_length = 50 # 根据数据长度设定
padded_input_sequences = pad_sequences(input_sequences, maxlen=max_sequence_length)
padded_target_sequences = pad_sequences(target_sequences, maxlen=max_sequence_length)
模型构建
我们选择了基于 TensorFlow 和 Keras 构建一个简单的 Seq2Seq 模型。这种模型结构在处理序列生成任务(如机器翻译)时非常有效。我们将使用一个嵌入层和一个 LSTM 层来构建模型。
示例代码
# 构建模型
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, LSTM, Dense, Embedding
def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
input = Input(shape=(None,))
x = Embedding(vocab_size, embedding_dim)(input)
x = LSTM(rnn_uni