【Python深度学习】循环神经网络RNN中文分词实战(附源码)

需要全部代码请点赞关注收藏后评论区留言私信~~~

长期依赖问题

以基本单元为基础构建的循环神经网络具备记忆性,虽然能够处理有关联的序列数据问题,但是因为梯度消散和爆炸问题的存在,不能有效利用间距过长的信息,效果有限,称之为长期依赖(Long-Term Dependencies)问题。长短时记忆网络是在普通循环神经网络基本单元的基础上,在隐层各单元间传递时通过几个可控门(遗忘门、输入门、候选门、输出门),控制之前信息和当前信息的记忆和遗忘程度,从而使循环神经网络具备了长期记忆功能,能够利用间距很长的信息来解决当前问题。

LSTM基本单元

RNN基本单元的状态s_i和输出y_i可表示为

 【Python深度学习】循环神经网络RNN中文分词实战(附源码)_第1张图片

标记为①、②、③、④的分别称为遗忘门、输入门、候选门、输出门,σ表示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。

双向循环神经网络 

【Python深度学习】循环神经网络RNN中文分词实战(附源码)_第2张图片

深度循环神经网络 

【Python深度学习】循环神经网络RNN中文分词实战(附源码)_第3张图片

中文分词应用示例

 1)提取训练语料中的所有字,形成字典

该步的主要目的是给训练语料中用到的字进行编号

2)将语料中的句子转化为训练样本

模型对每个输入训练样本的长度要求一致,因此,可以指定一个固定长度,过长的句子应截断后面过长的部分。过短的句子在后面填充0,并指定一个新的标签“X”与之对应。通过字典将句子的汉字序列转换为数字序列。标签用独热编码表示。

3)搭建深度双向循环神经网络模型进行训练

4)利用训练好的模型进行分词

训练过程如下

【Python深度学习】循环神经网络RNN中文分词实战(附源码)_第4张图片

 【Python深度学习】循环神经网络RNN中文分词实战(附源码)_第5张图片

 

先要将待分词的句子转换成适合模型输入的形式,再用模型进行分词。分词结果为:“中国 首次 火星 探测 任务 天问 一 号 探测器 实施 近 火 捕 获制动”。

部分代码如下

# 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)) + "句。")

创作不易 觉得有帮助请点赞关注收藏~~~

你可能感兴趣的:(机器学习,深度学习,深度学习,rnn,中文分词,神经网络,tensorflow)