自然语言处理中的文本特征工程与循环神经网络模型解析

发布于:2025-06-09 ⋅ 阅读:(25) ⋅ 点赞:(0)

数据分析

1 文本特征处理

对语料添加普适性的特征:n-gram
对语料进行规范长度:适配模型的输入

1.1 添加N-Gram特征

定义: 将连续的相邻的词或者字组合到一块,就称为n-gram特征
eg: 我| 爱| 黑马
bi-gram: 我爱|爱黑马
tri—gram: 我爱黑马
  • 代码实现

# coding:utf-8
def add_n_gram(a:list):
    n_gram = 2
    print(f'列表推导式结果--》{[a[i:] for i in range(n_gram)]}')
    return set(zip(*[a[i:] for i in range(n_gram)]))
​
result = add_n_gram(a = [1, 3, 2, 1, 5, 3])
print(result)

1.2 文本长度规范

意义: 模型一般需要固定尺寸的输入,因此需要对文本句子进行补齐(一般用0补齐)或者截断
  • 代码实现

# coding:utf-8
from keras.preprocessing import sequence
​
def padding(x_train):
    max_len = 10
    return sequence.pad_sequences(x_train, max_len, padding="post", truncating="post")
​
# 假定x_train里面有两条文本, 一条长度大于10, 一天小于10
x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],
           [2, 32, 1, 23, 1]]

2 数据增强

目的: 增加数据集(扩展数据集)

2.1 回译数据增强

定义: 通过将一种语言翻译成不同的语言,再转换回来的一种方式
eg: 中文---韩文----英语---中文
使用工具: ChatGPT

RNN及其变体

RNN模型

  • 定义:

循环神经网络:一般接受的一序列进行输入,输出也是一个序列
  • 作用和应用场景:

RNN擅长处理连续语言文本,机器翻译、文本生成、文本分类、摘要生成
  • RNN模型的分类

    • 根据输入与输出结构

    N Vs N : 输入和输出等长,应用场景:对联生成;词性标注;NER
    N Vs 1 : 输入N,输出为单值,应用场景:文本分类
    1 Vs N : 输入是一个,输出为N,应用场景:图片文本生成
    N Vs M : 输入和输出不等长,应用场景:文本翻译、摘要总结
    • 根据RNN内部结构

    传统RNN
    LSTM
    BI-LSTM
    GRU
    BI-GRU

传统RNN模型

  • 内部结构

    • 输入:当前时间步xt和上一时间步输出的ht-1

    • 输出:ht和ot (一个时间步内:ht=ot)


    • 按照RNN官方内部结构计算公式演示图:

    RNN基本工作原理

 


多层RNN的解析

  • RNN模型实现

    # 输入数据长度发生变化
    def  dm_rnn_for_sequencelen():
        '''
        第一个参数:input_size(输入张量x的维度)
        第二个参数:hidden_size(隐藏层的维度, 隐藏层的神经元个数)
        第三个参数:num_layers(隐藏层的数量)
        '''
        rnn = nn.RNN(5, 6, 1) #A
        '''
        第一个参数:sequence_length(输入序列的长度)
        第二个参数:batch_size(批次的样本数量)
        第三个参数:input_size(输入张量的维度)
        '''
        input = torch.randn(20, 3, 5) #B
        '''
        第一个参数:num_layer * num_directions(层数*网络方向)
        第二个参数:batch_size(批次的样本数)
        第三个参数:hidden_size(隐藏层的维度, 隐藏层神经元的个数)
        '''
        h0 = torch.randn(1, 3, 6) #C
    ​
        # [20,3,5],[1,3,6] --->[20,3,6],[1,3,6]
        output, hn = rnn(input, h0)  #
    ​
        print('output--->', output.shape)
        print('hn--->', hn.shape)
        print('rnn模型--->', rnn)
    ​
    # 程序运行效果如下: 
    output---> torch.Size([20, 3, 6])
    hn---> torch.Size([1, 3, 6])
    rnn模型---> RNN(5, 6)

LSTM模型

  • 内部结构

    • 遗忘门

    • 输入门

    • 细胞状态

    • 输出门

  • BI-LSTM模型:

  • LSTM模型代码实现

    import torch
    import torch.nn as nn
    def dm02_lstm_for_direction():
        '''
        第一个参数:input_size(输入张量x的维度)
        第二个参数:hidden_size(隐藏层的维度, 隐藏层的神经元个数)
        第三个参数:num_layer(隐藏层的数量)
        bidirectional = True
        #
        '''
        lstm = nn.LSTM(5, 6, 1, batch_first = True)
    ​
        '''
        input
        第一个参数:batch_size(批次的样本数量)
        第二个参数:sequence_length(输入序列的长度)
        第三个参数:input_size(输入张量的维度)
        '''
        input = torch.randn(4, 10, 5)
    ​
        '''
        hn和cn
        第一个参数:num_layer * num_directions(层数*网络方向)
        第二个参数:batch_size(批次的样本数)
        第三个参数:hidden_size(隐藏层的维度, 隐藏层神经元的个数)
        '''
        h0 = torch.zeros(1, 4, 6)
        c0 = torch.zeros(1, 4, 6)
    ​
        # 数据送入模型
        output, (hn, cn) = lstm(input, (h0, c0))
        print(f'output-->{output.shape}')
        print(f'hn-->{hn.shape}')
        print(f'cn-->{cn.shape}')

  • BI-LSTM

定义: 不改变原始的LSTM模型内部结构,只是将文本从左到右计算一遍,再从右到左计算一遍,把最终的输出结果拼接得到模型的完整输出