基于CNN和RNN计算词权重

2022-02-18  本文已影响0人  Nefelibatas
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)
上一篇下一篇

猜你喜欢

热点阅读