基于CNN与RNN计算词权重

作者: Nefelibatas | 来源:发表于2022-02-12 11:55 被阅读0次
    image-20220211112448907.png

    样本数据

    数据集

    • 标题关键词权重分配

    • 近义词

    • 关联词

    词权重样本

    搜索query 点击标题 发生次数
    采购 采购专员 9
    专员 采购专员 1
    标题 Query****来源 次数
    采购专员 采购 9
    专员 1
    样本
    采购 专员:0.9 0.1

    /data/click_term_weight.txt 里有7万条样本

    样本

    瑜伽 | 店长:1.0 | 0.0

    艺术品 | 业务经理: 1.0|0.0

    销售|工程|安装: 0.5|0.0|0.5

    药房|营业员: 1.0|0.0

    商务车|驾驶员: 0.0|1.0

    校招|hr:0.857|0.143

    coe|资深|高级|总监:1.0|0.0|0.0|0.0

    评估|工程师|评估|项目经理:1.0|0.0|0.0|0.0

    ui|设计师|j12041:0.5|0.5|0.0

    序列的填充/截断

    from tensorflow.keras.preprocessing.sequence import pad_sequences
    
    x_train_padded_seqs = pad_sequences(
        x_train,        
        maxlen=MAX_SEQUENCE_LENGTH, # 长度超过则去掉
        padding="post", # psot:长度过短在前/后面填充,post为后面
        truncating="post", # 长度过长截断前面还是后面
        dtype="float64", 
        value=0.0 # 填充默认值
    )
    

    Embedding

    embedding_matrix = np.zeros(
        shape=(len(word_index_vector) + 1, EMBEDDING_DIM))  
        # embedding_matrix的第0行为0向量,padding时就是用的第0行
        # embedding_matrix中存储所有的word vector
    for word, tuple in word_index_vector.items():
        i = tuple[0]
        vector = tuple[1]  # 预先训练好的word vector
        embedding_matrix[i] = vector
    embed = Embedding(
                len(word_index_vector) + 1,  # weights的第一维大小 
                EMBEDDING_DIM,  # weights的第二维大小       
                input_length=MAX_SEQUENCE_LENGTH,  
                # 序列长度统一补齐(或截断)为MAX_SEQUENCE_LENGTH                  
                weights=[embedding_matrix],  # 使用预先训练好的word vector                         trainable=True,  # 允许再训练 
    )(input)
    

    卷积网络

    image-20220211113955313.png image-20220211114001658.png

    输入:image,可以有多个channel 输出:feature map,可以有多个channel 卷积核:kernel / filter,可以有多个卷积核

    torch.nn.Conv2d(in_channels, out_channels, kernel_size)
    
    # 一共需要in_channels* out_channels个卷积核,这样参数的总是为in_channels* 
    
    # out_channels*kernel_width*kernel_height+out_channels
    
    # 如果输入image不做padding,且卷积核的滑动步长为1,则feature map的height比image的height小kernel_height-1
    

    卷积的目的是为局部区域生成高级特征。

    池化

    池化用一个值来代表一个局部区域,增加了下一次卷积的感受视野。

    image-20220211114155330.png image-20220211114159490.png

    用于文本的CNN

    输入只有一个channel

    kernel width等于输入的image width,因此叫“行卷积”。feature map的width为1

    pooling对feature map取全局最大值

    仅一次conv–pooling,没有循环多次

    image-20220211131021229.png
    cnvs = []
    filter_count = 4  # 采用几个卷积核,即通道数,或者叫filter数
    kernel_sizes = [2, 3, 4, 5]
    for kernel_size in kernel_sizes:  
        # kernel_size表示卷积核的高度(行卷积,卷积核大小只取决于高度)
        out = Convolution1D(filter_count, kernel_size)(embed)  
        # 由于是一维卷积,所以卷积核的宽度与与WORD_VEC_DIM保持一致   
        out = BatchNormalization()(out)  
        out = Activation('sigmoid')(out)   
        out = MaxPool1D(pool_size=MAX_SEQUENCE_LENGTH - kernel_size + 1)(        out)  
        # pool_size是池化的窗口大小,卷积的输出大小为[MAX_SEQUENCE_LENGTH - kernel_size + 1, 1]
        # 由于我们希望池化的输出大小为1,所以这里池化窗口为MAX_SEQUENCE_LENGTH - kernel_size + 1 
        cnvs.append(out)
        out = tf.concat(cnvs, axis=-1)  # 将所有池化层的输出进行拼接
        out = Flatten()(out)
        out = Dropout(rate=0.5)(out)
        out = Dense(units=MAX_SEQUENCE_LENGTH, activation='sigmoid')(out)
    

    LSTM长短期记忆模型

    循环神经网络

    image-20220211131632243.png

    f可以是任意函数,可以简单如一层全连接,也可以复杂如GRU、LSTM。

    计算词权重weight_i = MLP(h(i))

    image-20220211131844482.png

    当f是一层全连接时,RNN的具体实现如下图。

    image-20220211131859128.png

    w矩阵是共享的,减少参数量

    双向循环神经网络

    image-20220211131956128.png

    计算词权重weight_i = MLP([h(i),h'(i)])

    堆叠循环神经网络Stack RNN

    image-20220211132111901.png

    最下层RNN的输入维度由x的维度决定,上面各层的输入维度由h的维度决定。

    长短期记忆模型

    image-20220211132143593.png
    if bi_direction:
        out = Bidirectional(GRU(units=HIDDEN_DIM, return_sequences=True))(embed)  
        # 两层RNN堆叠时,必需第一层把return_sequences设为True   
        out = Bidirectional(GRU(units=HIDDEN_DIM, return_sequences=True))(out)  
        # 因为要在序列的每个位置上执行线性变换,所以需要返回序列上每个位置的隐向量
    
    else:    
        out = LSTM(units=HIDDEN_DIM, return_sequences=True)(embed) 
        out = LSTM(units=HIDDEN_DIM, return_sequences=True)(out)  
        # 把LSTM换成GRU试试
        out = Dropout(rate=0.5)(out)
        out = Dense(units=1, activation='sigmoid')(out)  
        # 在最后一维上执行线性变换,输入shape为(BATCH, SEQ_LEN, HIDDEN_DIM),输入shape为(BATCH, SEQ_LEN, 1),即在序列的每个位置上执行线性变换
    

    相关文章

      网友评论

        本文标题:基于CNN与RNN计算词权重

        本文链接:https://www.haomeiwen.com/subject/nkptlrtx.html