Python深度学习循环神经网络RNN中文分词实战(附源码)
Posted showswoller
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python深度学习循环神经网络RNN中文分词实战(附源码)相关的知识,希望对你有一定的参考价值。
需要全部代码请点赞关注收藏后评论区留言私信~~~
长期依赖问题
以基本单元为基础构建的循环神经网络具备记忆性,虽然能够处理有关联的序列数据问题,但是因为梯度消散和爆炸问题的存在,不能有效利用间距过长的信息,效果有限,称之为长期依赖(Long-Term Dependencies)问题。长短时记忆网络是在普通循环神经网络基本单元的基础上,在隐层各单元间传递时通过几个可控门(遗忘门、输入门、候选门、输出门),控制之前信息和当前信息的记忆和遗忘程度,从而使循环神经网络具备了长期记忆功能,能够利用间距很长的信息来解决当前问题。
LSTM基本单元
RNN基本单元的状态s_i和输出y_i可表示为
标记为①、②、③、④的分别称为遗忘门、输入门、候选门、输出门,σ表示Sigmoid激活函数,tanh表示tanh激活函数。
遗忘门用来控制上一步的状态s_i−1输入到本步的量,也就是遗忘上一步的状态的程度,它的输入是上一步的输出和本步的输入[■8(y_i−1&x_i)],它的输出为:
f_i=σ([■8(y_i−1&x_i)]∙W_f+b_f)
候选门通过tanh函数提供候选输入信息:
s ̃_i=tanℎ([■8(y_i−1&x_i)]∙W_s+b_s)
输入门通过Sigmoid函数来控制输入量:
in_i=σ([■8(y_i−1&x_i)]∙W_in+b_in)
为了进一步理解长短时记忆网络的单元结构,来计算一下它的参数个数。以示例为例,输入的x_i是1维的,输出y_i是100维的,单元状态s_i为100维,W_f、W_s、W_in和W_o是101×100的矩阵,b_f、b_s、b_in和b_o是100维的向量,因此,单元的参数个数为40800。
双向循环神经网络
深度循环神经网络
中文分词应用示例
1)提取训练语料中的所有字,形成字典
该步的主要目的是给训练语料中用到的字进行编号
2)将语料中的句子转化为训练样本
模型对每个输入训练样本的长度要求一致,因此,可以指定一个固定长度,过长的句子应截断后面过长的部分。过短的句子在后面填充0,并指定一个新的标签“X”与之对应。通过字典将句子的汉字序列转换为数字序列。标签用独热编码表示。
3)搭建深度双向循环神经网络模型进行训练
4)利用训练好的模型进行分词
训练过程如下
先要将待分词的句子转换成适合模型输入的形式,再用模型进行分词。分词结果为:“中国 首次 火星 探测 任务 天问 一 号 探测器 实施 近 火 捕 获制动”。
部分代码如下
# 4.利用训练好的模型进行分词
def predict(testsent):
# 将汉字句子转换成模型需要的输入形式
x = [0] * maxlen
replace_len = len(testsent)
if len(testsent) > maxlen:
replace_len = maxlen
for j in range(replace_len):
x[j] = char2id[testsent[j]]
# 调用模型进行预测
label = model.predict([x])
# 根据模型预测结果对输入句子进行切分
label = np.array(label)[0]
s = ''
for i in range(len(testsent)):
tag = np.argmax(label[i])
if tag == 0 or tag == 3: # 单字和词结尾加空格切分
s += testsent[i] + ' '
elif tag ==1 or tag == 2:
s += testsent[i]
print(s)
# 2.将训练语句转化为训练样本
trainX = []
trainY = []
for i in range(len(new_sents)):
x = [0] * maxlen # 默认填充值
y = [4] * maxlen # 默认标签X
sent = new_sents[i][0]
labe = sents_labels[i][0]
replace_len = len(sent)
if len(sent) > maxlen:
replace_len = maxlen
for j in range(replace_len):
x[j] = char2id[sent[j]]
y[j] = tags[labe[j]]
trainX.append(x)
trainY.append(y)
trainX = np.array(trainX)
trainY = tf.keras.utils.to_categorical(trainY, 5)
print("训练样本准备完毕,训练样本共" + str(len(trainX)) + "句。")
创作不易 觉得有帮助请点赞关注收藏~~~
以上是关于Python深度学习循环神经网络RNN中文分词实战(附源码)的主要内容,如果未能解决你的问题,请参考以下文章